新手编译安卓驱动学习
今天我们一起学习一下如何实现对一款有驱动代码的传感器适配安卓系统
开发板:某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
等文件文章来源:https://www.toymoban.com/news/detail-440446.html
测试
使用devcheck软件如下所示:
参考:https://www.twblogs.net/a/5d7fc923bd9eee5327fff218/?lang=zh-cn文章来源地址https://www.toymoban.com/news/detail-440446.html
到了这里,关于安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!