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

这篇具有很好参考价值的文章主要介绍了安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

新手编译安卓驱动学习

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

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

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

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

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

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

安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动
测试内核层是否驱动
迹象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软件如下所示:
安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动
参考:https://www.twblogs.net/a/5d7fc923bd9eee5327fff218/?lang=zh-cn文章来源地址https://www.toymoban.com/news/detail-440446.html

到了这里,关于安卓RK3399编译驱动MPU6050,实现内核层与HAL层驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【CubeMX配置STM32驱动MPU6050】

    一、使用CubeMX进行相关配置 1、配置OLED的IIC接口 OLED的具体使用方法我就不细说了,我前面的文章里面有讲OLED的,如果有需要可以去看看。 2、配置MPU6050的接口 我用MPU6050使用的是 软件IIC (其实是只找到软件IIC的驱动),所以我们只需要配置两个GPIO口就可以实现对MPU6050的控

    2024年02月12日
    浏览(48)
  • RK3399平台开发系列讲解(内核调试篇)Valgrind使用案例

    🚀 返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使用未初始化的内存、非法内存访问等问题。它在 Linux 平台上广泛使用,并且支持多种处理器

    2024年02月12日
    浏览(41)
  • RK3399平台开发系列讲解(内核入门篇)网络协议的分层

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢对于多数的应用和用户而言,使用互联网的一个基本要求就是数据可以无损地到达。用户通过应用进行网络通信࿰

    2024年02月02日
    浏览(37)
  • RK3399之8250串口驱动

    前言 内核版本4.4 平台 瑞芯微RK3399 8250串口 一、驱动整体框架 二、驱动结构体对象 关系如下图所示 三、驱动代码流程 驱动加载由以下入口 1.8250_core.c的serial8250_init 个人理解代码里有三套串口设备注册代码, 方式一,嵌入式常用的方式,驱动通过与dts硬件信息匹配注册uart

    2024年02月09日
    浏览(52)
  • Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用

    1、在字符设备目录下建立hello目录 ~/Linux/rk356x_linux/kernel/drivers/char/hello 2、进入hello目录,新建hello.c、Makefile、Kconfig三个文件 3、Kconfig是打开make menuconfig配置界面是后的选项,这Kconfig是在字符设备下的。 config后面的HELLO就是对应配置后在kernel目录下的**.config中的CONFIG_HELLO配置

    2024年02月11日
    浏览(71)
  • STM32软件I2C驱动MPU6050

    这里没有什么复杂的地方,采用MPU6050的现成模块.模块的SCL接B10,SDA接B11,这里连接了一个OLED显示屏,用于显示获取到的数据. 注意:这里使用的模块自带上拉电阻 首先在工程目录里创建: \\\"MyI2C.h\\\"和\\\"MyI2C.c\\\"文件,用于软件驱动I2C. \\\"MPU6050.h\\\",\\\"MPU6050.c\\\"和\\\"MPU6050Reg.h\\\"文件,用于MPU6050的驱动. 在

    2024年02月15日
    浏览(54)
  • 基于51单片机驱动MPU6050模块(LCD1602显示)

    @TOC MPU-6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用IIC接口连接一个第三方的数字传感器。MPU-6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范

    2024年02月11日
    浏览(41)
  • RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

    🚀 返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“ spidev_test ” 是一个用于测试和配置 SPI ( Serial Peripheral Interface )设备的命令行工具。 SPI 是一种串行通信协议,通常用于连接微控制器、传感器和其他外部设备。“ spidev_test ”

    2024年02月09日
    浏览(39)
  • Rockchip RK3399 - 移植uboot 2023.04和内核FIT uImage制作

    ---------------------------------------------------------------------------------------------------------------------------- 开发板   :NanoPC-T4开发板 eMMC   :16GB LPDDR3:4GB 显示屏   :15.6 HDMI接口显示屏 u-boot    :2023.04 linux      :6.3 -----------------------------------------------------------------------------------

    2024年02月06日
    浏览(45)
  • RK3399平台开发系列讲解(内核调试篇)IO 数据工具:iostat和iotop

    🚀 返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上, iostat 和 iotop 这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。 iostat 命令,是用来展示系统中的 IO 设备和 CPU 使用情况的。它的最大优势在于能汇报

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包