一、环境介绍
RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。
二、芯片介绍
LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很强大的(感兴趣的可以去看数据手册)。该芯片原厂公开了input和iio两种驱动,我这边选用的是iio驱动。
三、驱动移植
驱动移植的目标是内核,所以下面的路径都是在kernel目录下。
源码链接:https://github.com/STMicroelectronics/STMems_Linux_IIO_drivers/tree/linux-4.19.y-gh
1,拷贝drivers/iio/imu/st_lsm6dsr文件夹到源码内核中相应路径
2,在 drivers/iio/imu/Kconfig中添加驱动支持,如果源码中有自带的st_lsm6dsx驱动的话,需要在对应的代码前加#注释掉,以免影响移植的驱动。
source "drivers/iio/imu/st_lsm6dsr/Kconfig"
3,在drivers/iio/imu/Makefile中添加驱动编译,如果源码中有自带的st_lsm6dsx驱动的话,需要在对应的代码前加#注释掉,以免影响移植的驱动。
obj-y += st_lsm6dsr/
4,在 include/uapi/linux/iio/types.h种增加枚举值(找到对应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中增加设备树支持
&i2c1 {#总线名称需根据自身情况修改
status = "okay";
st_lsm6dsr: lsm6dsr@6b {
compatible = "st,lsm6dsr";
reg = <0x6b>;
interrupt-parent = <&gpio3>;#需根据自身情况修改
interrupts = <RK_PC3 IRQ_TYPE_LEVEL_HIGH>;#需根据自身情况修改
};
}
7,进入到源码根目录执行指令“./build.sh menuconfig”后配置增加芯片支持(也可以直接编译,然后根据提示输入Y就行)
Device Drivers --->
<M> Industrial I/O support --->
Inertial measurement units --->
<M> STMicroelectronics LSM6DSM/LSM6DSL sensor --->
8,修改取时间调用接口
【android12-linux-5.1】【ST芯片】驱动移植后编译不通过__花花的博客-CSDN博客
9,增加iio驱动名称定义
【android12-linux-5.1】【ST芯片】驱动移植后编译不通过__花花的博客-CSDN博客
10,编译烧录后查看设备情况
1)“adb shell” 指令进入设备