安卓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 

内核配置 INV_MPU6050_IIO
测试内核层是否驱动
迹象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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值