一、環(huán)境介紹
RK3588主板搭載Android12操作系統(tǒng),內(nèi)核是Linux5.10,使用ST的六軸傳感器LSM6DSR芯片。
二、芯片介紹
LSM6DSR是一款加速度和角速度(陀螺儀)六軸傳感器,還內(nèi)置了一個溫度傳感器。該芯片可以選擇I2C,SPI通訊,還有可編程終端,可以后置攝像頭等設(shè)備,功能是很強(qiáng)大的(感興趣的可以去看數(shù)據(jù)手冊)。該芯片原廠公開了input和iio兩種驅(qū)動,我這邊選用的是iio驅(qū)動。
三、驅(qū)動移植
驅(qū)動移植的目標(biāo)是內(nèi)核,所以下面的路徑都是在kernel目錄下。
源碼鏈接:https://github.com/STMicroelectronics/STMems_Linux_IIO_drivers/tree/linux-4.19.y-gh
1,拷貝drivers/iio/imu/st_lsm6dsr文件夾到源碼內(nèi)核中相應(yīng)路徑
2,在?drivers/iio/imu/Kconfig中添加驅(qū)動支持,如果源碼中有自帶的st_lsm6dsx驅(qū)動的話,需要在對應(yīng)的代碼前加#注釋掉,以免影響移植的驅(qū)動。
source "drivers/iio/imu/st_lsm6dsr/Kconfig"
3,在drivers/iio/imu/Makefile中添加驅(qū)動編譯,如果源碼中有自帶的st_lsm6dsx驅(qū)動的話,需要在對應(yīng)的代碼前加#注釋掉,以免影響移植的驅(qū)動。
obj-y += st_lsm6dsr/
4,在?include/uapi/linux/iio/types.h種增加枚舉值(找到對應(yīng)enum,查找下下面的值是否有缺,增加缺失的即可)
enum iio_event_type {
IIO_EV_TYPE_THRESH_ADAPTIVE,
IIO_EV_TYPE_MAG_ADAPTIVE,
IIO_EV_TYPE_CHANGE,
IIO_EV_TYPE_FIFO_FLUSH,
};
enum iio_event_direction {
IIO_EV_DIR_RISING,
IIO_EV_DIR_FALLING,
IIO_EV_DIR_NONE,
IIO_EV_DIR_FIFO_EMPTY,
IIO_EV_DIR_FIFO_DATA,
};
5,在include/uapi/linux/iio/types.h中增加枚舉值
enum iio_chan_type {
IIO_ELECTRICALCONDUCTIVITY,
IIO_COUNT,
IIO_INDEX,
IIO_SIGN_MOTION,
IIO_STEP_DETECTOR,
IIO_STEP_COUNTER,
IIO_TILT,
IIO_TAP,
IIO_TAP_TAP,
IIO_WRIST_TILT_GESTURE,
IIO_GESTURE,
IIO_WKUP,
IIO_FREE_FALL,
IIO_GRAVITY,
};
6,在arch/arm64/boot/dts/rockchip/rd-rk3588.dts中增加設(shè)備樹支持
&i2c1 {#總線名稱需根據(jù)自身情況修改
status = "okay";
st_lsm6dsr: lsm6dsr@6b {
compatible = "st,lsm6dsr";
reg = <0x6b>;
interrupt-parent = <&gpio3>;#需根據(jù)自身情況修改
interrupts = <RK_PC3 IRQ_TYPE_LEVEL_HIGH>;#需根據(jù)自身情況修改
};
}
7,進(jìn)入到源碼根目錄執(zhí)行指令“./build.sh menuconfig”后配置增加芯片支持(也可以直接編譯,然后根據(jù)提示輸入Y就行)
Device Drivers --->
<M> Industrial I/O support --->
Inertial measurement units --->
<M> STMicroelectronics LSM6DSM/LSM6DSL sensor --->
8,修改取時間調(diào)用接口
【android12-linux-5.1】【ST芯片】驅(qū)動移植后編譯不通過__花花的博客-CSDN博客
9,增加iio驅(qū)動名稱定義
【android12-linux-5.1】【ST芯片】驅(qū)動移植后編譯不通過__花花的博客-CSDN博客
10,編譯燒錄后查看設(shè)備情況
1)“adb shell” 指令進(jìn)入設(shè)備
2)“cd /sys/bus/iio/devices”指令進(jìn)入iio設(shè)備路徑并用“l(fā)s -l”指令查看設(shè)備列表
3)“cat */name”查看設(shè)備名稱,這個驅(qū)動注冊了15個設(shè)備(iio序號不同系統(tǒng)和配置可能會有區(qū)別,請根據(jù)自己的情況分析使用)。
設(shè)備情況列表總結(jié)如下
num | device | device name | sensor name | type | 傳感器名稱 | 描述 |
1 | iio:device1 | lsm6dsr_gyro | LSM6DSR Gyroscope Sensor | SENSOR_TYPE_GYROSCOPE | 角速度傳感器/陀螺儀 | 陀螺儀測量圍繞設(shè)備的 x、y 和 z 軸的旋轉(zhuǎn)速率(弧度/秒) |
2 | iio:device2 | lsm6dsr_accel | LSM6DSR Accelerometer Sensor | SENSOR_TYPE_ACCELEROMETER | 加速度傳感器 | 加速度傳感器測量施加到設(shè)備的加速度,包括重力 |
3 | iio:device3 | lsm6dsr_temp | LSM6DSR Temperature Sensor | SENSOR_TYPE_AMBIENT_TEMPERATURE | 溫度傳感器 | 環(huán)境空氣溫度 |
4 | iio:device4 | lsm6dsr_step_c | LSM6DSR Step Counter Sensor | SENSOR_TYPE_STEP_COUNTER | 計步器傳感器 | 提供自已激活傳感器后最后一次重啟以來用戶邁出的步數(shù) |
5 | iio:device5 | lsm6dsr_step_d | LSM6DSR Step Detector Sensor | SENSOR_TYPE_STEP_DETECTOR | 步行檢測傳感器 | 每次用戶邁步時,步測器傳感器都會觸發(fā)事件 |
6 | iio:device6 | lsm6dsr_sign_motion | LSM6DSR Significant Motion Sensor | SENSOR_TYPE_SIGNIFICANT_MOTION | 特殊動作觸發(fā)傳感器 | 每次檢測到有效運動時,有效運動傳感器都會觸發(fā)事件,然后將其禁用 |
7 | iio:device7 | lsm6dsr_glance | LSM6DSR Glance Gesture | SENSOR_TYPE_GLANCE_GESTURE | 掠過手勢傳感器 | 支持短暫打開屏幕,以便用戶根據(jù)特定動作瀏覽屏幕上的內(nèi)容 |
8 | iio:device8 | lsm6dsr_motion | LSM6DSR Motion Gesture | SENSOR_TYPE_MOTION_DETECT | 運動檢測傳感器 | 如果設(shè)備處于運動狀態(tài)至少5秒,并且最大延遲為5秒,則產(chǎn)生事件 |
9 | iio:device9 | lsm6dsr_no_motion | LSM6DSR No-Motion Gesture | SENSOR_TYPE_STATIONARY_DETECT | 靜止檢測器 | 如果設(shè)備靜止至少5秒,并且最大延遲時間為5秒,則產(chǎn)生事件 |
10 | iio:device10 | lsm6dsr_wk | LSM6DSR WakeUp Gesture | SENSOR_TYPE_WAKE_GESTURE | 喚醒手勢傳感器 | 支持根據(jù)設(shè)備特定的動作喚醒設(shè)備 |
11 | iio:device11 | lsm6dsr_pickup | LSM6DSR PickUp Gesture | SENSOR_TYPE_PICK_UP_GESTURE | 拾取手勢傳感器 | 拾起設(shè)備時觸發(fā),無論面前是什么(桌子、口袋、手提袋) |
12 | iio:device12 | lsm6dsr_dev_orientation | LSM6DSR Device Orientation Sensor | SENSOR_TYPE_DEVICE_ORIENTATION | 設(shè)備方向傳感器 | 測量設(shè)備的旋轉(zhuǎn)方向 |
13 | iio:device13 | lsm6dsr_wrist | LSM6DSR Wrist Tilt Gesture | SENSOR_TYPE_WRIST_TILT_GESTURE | 手腕傾斜手勢傳感器 | 描述手腕傾斜手勢傳感器的常數(shù) |
14 | iio:device14 | lsm6dsr_tilt | LSM6DSR Tilt Sensor | SENSOR_TYPE_TILT_DETECTOR | 傾斜檢測傳感器 | 每次檢測到傾斜事件后均生成事件 |
4)設(shè)備數(shù)據(jù)讀取,以最簡單的溫度數(shù)據(jù)讀取為例。
1>“cd iio:device3”進(jìn)入溫度傳感器路徑,“l(fā)s”指令查看屬性文件:
2>可以通過讀取“in_temp_raw”來查看溫度傳感器原始數(shù)據(jù),“cat in_temp_raw”指令查看溫度數(shù)據(jù):
提示:該驅(qū)動于2022年就停止維護(hù)了,最新維護(hù)源碼路徑:https://github.com/STMicroelectronics/st-mems-android-linux-drivers-iio。開始移植的時候完全沒頭緒,只顧著檢測是否能用,沒注意維護(hù)情況問題。但是該驅(qū)動親測能用,HAL移植請看下篇。
另,源碼包上傳資源被拒,提示侵權(quán),需要的可以評論私信我獲取。
新人入行,經(jīng)驗分享,如有所誤,歡迎指出~文章來源:http://www.zghlxwxcb.cn/news/detail-704368.html
版權(quán)歸屬:深圳市琪智科技有限公司-花花文章來源地址http://www.zghlxwxcb.cn/news/detail-704368.html
到了這里,關(guān)于【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】驅(qū)動移植的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!