我是靠谱客的博主 粗暴红牛,最近开发中收集的这篇文章主要介绍安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动新手编译安卓驱动学习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

新手编译安卓驱动学习

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

文章目录

  • 新手编译安卓驱动学习
    • 安卓驱动开发常用知识(非新手可以跳过):
      • 1. 什么是设备树(.dts)
      • 2. 内核驱动与安卓HAL的关系:
    • 开始适配MPU6050驱动:
      • 1. 先打通内核层,修改DTS,挂载MPU6050
      • 2. 调整kernel下的make文件配置 (make menuconfig)
      • 3. HAL 层驱动
    • 测试

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

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

最后

以上就是粗暴红牛为你收集整理的安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动新手编译安卓驱动学习的全部内容,希望文章能够帮你解决安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动新手编译安卓驱动学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部