安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动

Posted 666小奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动相关的知识,希望对你有一定的参考价值。

新手编译安卓驱动学习

今天我们一起学习一下如何实现对一款有驱动代码的传感器适配安卓系统
开发板:某AR眼镜公司的开发板RK3399

文章目录

安卓驱动开发常用知识(非新手可以跳过):

1. 什么是设备树(.dts)

DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。
其主要目的是定义MCU各个引脚的接线功能,通过修改这个文件实现同一芯片适配不同板卡方案。

2. 内核驱动与安卓HAL的关系:

标准些来说,应该叫做Linux 内核驱动与android硬件抽象层(HAL)的关系。
众所周知安卓的底层内核是Linux ,所以要想实现驱动调用首先需要在内核层加载,然后在编写对应的HAL实现在安卓系统中访问

开始之前你需要拿到你板卡的设备树,就好比电路图一样,这个记载了你的芯片与外部设备的连接方式

开始适配MPU6050驱动:

1. 先打通内核层,修改DTS,挂载MPU6050

--- a/kernel/arch/arm64/boot/dts/rk3399-future.dts
+++ b/kernel/arch/arm64/boot/dts/rk3399-future.dts
@@ -454,6 +454,29 @@
 
 &i2c4 
        status = "okay";
+       clock-frequency = <400000>; //需要配置为400kHz,要不然的话i2cdetect的时候0x68不稳定
+
+       mpu6500@68 
+               compatible = "invensense,mpu6500";
+               status = "okay";
+               pinctrl-names = "default";
+               reg = <0x68>;
+               mpu-int_config = <0x10>;
+               mpu-level_shifter = <0>;
+               mpu-orientation = <1 0 0 0 1 0 0 0 1>;
+               orientation-x = <0>;
+               orientation-y = <1>;
+               orientation-z = <1>;
+               support-hw-poweroff = <0>;
+               mpu-debug = <0>;
+       ;
+
+
 ;

2. 调整kernel下的make文件配置 (make menuconfig)

内核配置 INV_MPU6050_IIO
Device Drivers  --->
<*> Industrial I/O support  ---> 
Inertial measurement units  --->   
  <*> Invensense MPU6050 devices 


测试内核层是否驱动
迹象1:使用i2c-tools,显示0x68(i2c设备地址)被占用代表加载成功

rk3399_mid:/ # i2cdetect -y 4                                                       
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f                             
00:          -- -- -- -- -- -- -- -- -- -- -- -- --                             
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --                             
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --                             
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --                             
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --                             
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --                             
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --                             
70: -- -- -- -- -- -- -- -- 

迹象2:使用dmesg命令可以看到MPU6050的调试信息

rk3399_mid:/ # dmesg | grep mpu
[    0.630940] sensor_register_slave:mpu6880_acc,id=24
[    0.631004] sensor_register_slave:mpu6500_acc,id=25
[    0.810499] of_get_named_gpiod_flags: parsed 'irq-gpio' property of node '/i2c@ff3d0000/mpu@68[0]' - status (0)
[    0.810550] inv-mpu-iio 4-0068: int_config=0,level_shifter=0,client.addr=68,client.irq=62
[    0.810637] inv-mpu-iio 4-0068: 0
[    0.810679] inv-mpu-iio 4-0068: -1
[    0.810721] inv-mpu-iio 4-0068: 0
[    0.810762] inv-mpu-iio 4-0068: -1
[    0.810804] inv-mpu-iio 4-0068: 0
[    0.810845] inv-mpu-iio 4-0068: 0
[    0.810887] inv-mpu-iio 4-0068: 0
[    0.810934] inv-mpu-iio 4-0068: 0
[    0.810984] inv-mpu-iio 4-0068: -1
[    0.811033] inv-mpu-iio 4-0068:
[    0.811071] inv_mpu_iio: secondary_i2c_addr=0
[    1.034521] inv-mpu-iio 4-0068: mpu6050 is ready to go!
[    1.034633] inv_mpu_iio: inv_mpu_init:746
[    1.076388] sensor_register_slave:mpu6500_gyro,id=49
[    1.076449] sensor_register_slave:mpu6880_gyro,id=50

迹象3:在/sys/bus/iio/devices目录下你会看到很多设备,依次进入,看到如下这些代表这是MPU6050设备

rk3399_mid:/sys/bus/iio/devices/iio:device0 # ls
accl_enable            event_display_orientation in_accel_z_calibbias   quaternion_on                smd_delay_threshold2
accl_matrix            event_smd                 in_accel_z_offset      reg_dump                     smd_enable
buffer                 firmware_loaded           in_anglvel_scale       sampling_frequency           smd_threshold
dev                    gyro_enable               in_anglvel_x_calibbias sampling_frequency_available subsystem
display_orientation_on gyro_matrix               in_anglvel_y_calibbias scan_elements                temperature
dmp_event_int_on       in_accel_scale            in_anglvel_z_calibbias secondary_name               trigger
dmp_firmware           in_accel_x_calibbias      name                   self_test                    uevent
dmp_int_on             in_accel_x_offset         of_node                self_test_samples
dmp_on                 in_accel_y_calibbias      power                  self_test_threshold
dmp_output_rate        in_accel_y_offset         power_state            smd_delay_threshold

3. HAL 层驱动

RK3399已经为我们准备好了驱动,只需要编译即可
分别在目录:./hardware/invensense/65xx/libsernors_iio/./hardware/rockchip/sensor/mpu_vr/libsensors/ 目录下
source build/envsetup.sh 后进入到目录然后mm一下即可

手动编译后生成 ./out/target/product/rk3399_mid/system/lib/android.hardware.sensors@1.0.so 等文件

测试

使用devcheck软件如下所示:

参考:https://www.twblogs.net/a/5d7fc923bd9eee5327fff218/?lang=zh-cn

以上是关于安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动的主要内容,如果未能解决你的问题,请参考以下文章

linux驱动之i2c子系统mpu6050设备驱动

ARM开发板linux下用I2C读取mpu6050的数据

RK3399平台开发系列讲解(内核入门篇)1.46RTC驱动开发

RK3399平台开发系列讲解(内核入门篇)1.46RTC驱动开发

RK3399平台开发系列讲解(FLASH篇)内核MTD层数据结构体

RK3399平台开发系列讲解(内核入门篇)1.33内核驱动流程