首页 > 其他分享 >9轴传感器MPU9250调试

9轴传感器MPU9250调试

时间:2024-04-24 12:13:02浏览次数:22  
标签:SENSOR client BOARD 传感器 mpu6500 input sensor MPU9250 调试

MPU9250实际上是mpu6500+ak8963的贴合芯片,内部的AK8963是负责三轴磁力传感器采样的芯片 ,它通过I2C总线与MPU6500连接在一起。ak8963的寄存器读取可以通过特定的i2c直通模式:

驱动代码,也是用mpu6500和ak8963对应的驱动即可。 gsensor、陀螺仪、地磁传感器对应驱动如下:

drivers/input/sensors/accel/mpu6500_acc.c
drivers/input/sensors/gyro/mpu6500_gyro.c

drivers/input/sensors/compass/ak8963.c.c

 

调试步骤:

  1.开启支持地磁传感器和编译AK8963的hardware:

device/rockchip/rk356x
diff --git a/BoardConfig.mk b/BoardConfig.mk
index 4601141..46b500f 100644
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -54,6 +54,7 @@ endif
 BOARD_SENSOR_ST := true
 BOARD_SENSOR_MPU_VR := false
 BOARD_SENSOR_MPU_PAD := false
+BOARD_SENSOR_COMPASS_AK8963-64 := true
 
 BOARD_USES_GENERIC_INVENSENSE := false
 
@@ -68,7 +69,7 @@ BOARD_NFC_SUPPORT := false
 BOARD_HAS_GPS := true
 
 BOARD_GRAVITY_SENSOR_SUPPORT := true
-BOARD_COMPASS_SENSOR_SUPPORT := false
+BOARD_COMPASS_SENSOR_SUPPORT := true
 BOARD_GYROSCOPE_SENSOR_SUPPORT := true
 BOARD_PROXIMITY_SENSOR_SUPPORT := false
 BOARD_LIGHT_SENSOR_SUPPORT := false
BOARD_SENSOR_COMPASS_AK8963-64这个宏对应的编译代码为:
hardware/rockchip/sensor/st/Android.mk
######### AKM daemon #################################################

ifeq ($(strip $(BOARD_SENSOR_COMPASS_AK8963)), true)
include $(LOCAL_PATH)/akm8963/Android.mk
else ifeq ($(strip $(BOARD_SENSOR_COMPASS_AK09911)), true)
include $(LOCAL_PATH)/akm09911/Android.mk
else ifeq ($(strip $(BOARD_SENSOR_COMPASS_AK8975)), true)
include $(LOCAL_PATH)/akm8975/Android.mk
else ifeq ($(strip $(BOARD_SENSOR_COMPASS_AK8963-64)), true)
include $(LOCAL_PATH)/akm8963-64/Android.mk
endif

 

 2.dts设备添加:

@@ -306,6 +306,36 @@
                type = <SENSOR_TYPE_GYROSCOPE>;
                //layout = <5>;
        };
+
+       mpu6500_acc: mpu_acc@68 {
+               compatible = "mpu6500_acc";
+               status = "okay";
+               reg = <0x68>;
+               irq-gpio = <&gpio3 RK_PA3 IRQ_TYPE_EDGE_RISING>;
+               irq_enable = <0>;
+               poll_delay_ms = <30>;
+               type = <SENSOR_TYPE_ACCEL>;
+               layout = <9>;
+       };
+
+       mpu6500_gyro: mpu_gyro@68 {
+               compatible = "mpu6500_gyro";
+               status = "okay";
+               reg = <0x68>;
+               irq_enable = <0>;
+               poll_delay_ms = <30>;
+               type = <SENSOR_TYPE_GYROSCOPE>;
+               layout = <9>;
+       };
+
+       akm8963_mag: akm_mag@c {
+               status = "okay";
+               compatible = "ak8963";
+               reg = <0x0c>;
+               type = <SENSOR_TYPE_COMPASS>;
+               poll_delay_ms = <30>;
+               layout = <3>;
+       };

 

3.驱动修改:

  直通模式需要MPU6500初始化的时候设置一下0x37这个寄存器Bit1写1即可开启,然后就会有0x0c的地址出来,这个就是ak8963的地址,相当于一条总线挂2个单独的设备。

#define MPU6500_INT_PIN_CFG        0x37
/*------------------------------
    MPU6500_INT_PIN_CFG
--------------------------------*/
#define BIT_BYPASS_EN           0x2

 

diff --git a/drivers/input/sensors/accel/mpu6500_acc.c b/drivers/input/sensors/accel/mpu6500_acc.c
index 6fc2058e0f9f..3dee84f6b44e 100644
--- a/drivers/input/sensors/accel/mpu6500_acc.c
+++ b/drivers/input/sensors/accel/mpu6500_acc.c
@@ -86,7 +86,7 @@ static int sensor_active(struct i2c_client *client, int enable, int rate)
        int result = 0;
        int status = 0;
        u8 pwrm1 = 0;
-
+       
        sensor->ops->ctrl_data = sensor_read_reg(client, sensor->ops->ctrl_reg);
        pwrm1 = sensor_read_reg(client, MPU6500_PWR_MGMT_1);
 
@@ -175,6 +175,11 @@ static int sensor_init(struct i2c_client *client)
        }
        msleep(10);
 
+       res = sensor_write_reg(client, MPU6500_INT_PIN_CFG, BIT_BYPASS_EN);
+       if (res)
+               pr_err("%s:wmc---wmc---t-pass1 mode\n", __func__);
+       read_data = sensor_read_reg(client, MPU6500_INT_PIN_CFG);
+
        res = sensor->ops->active(client, 0, sensor->pdata->poll_delay_ms);

设置完0x37寄存器的时候,发现差不多开机起来才有对应的0x0c地址出来(i2ctool工具检测),这个时候如果正常加载ak8963,会失败(原因是0x0c的地址还没有出来)。试过把ak8963编译成模块的方式,开机完成后在脚本里启动.ko驱动,驱动可以加载成功,但是没有数据上报。原因应该是驱动一定要在HAL层启动之前初始化,要不然可能没有生成/dev/compass这个文件节点,HAL层会出错。

仔细看开机log:

[   19.676846] gsensor_mpu6500 5-0068: set sensor poll time to 66ms
[   19.677119] sensor_active-------hfksdhfkskg.......enable:1
[   19.761173] gsensor_mpu6500 5-0068: sensor on: starting poll sensor data 62ms

发现有一个hal对底层ioclt的动作,追踪代码流程:

drivers/input/sensors/sensor-dev.c
gsensor_dev_ioctl
    -->GSENSOR_IOCTL_APP_SET_RATE
        -->sensor_reset_rate

static int sensor_reset_rate(struct i2c_client *client, int rate)
{
    .......

    if (sensor->status_cur == SENSOR_ON) {
        if (!sensor->pdata->irq_enable) {
            sensor->stop_work = 1;
            cancel_delayed_work_sync(&sensor->delaywork);
        }
        sensor->ops->active(client, SENSOR_OFF, rate);
        result = sensor->ops->active(client, SENSOR_ON, rate);
        if (!sensor->pdata->irq_enable) {
            sensor->stop_work = 0;
            schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
        }
    }

    .......
}
sensor->ops->active实际调用了
static int sensor_active(struct i2c_client *client, int enable, int rate)
{
。。。。

    if (!enable) {
        status = BIT_ACCEL_STBY;
        sensor->ops->ctrl_data |= status;
        if ((sensor->ops->ctrl_data &  BIT_GYRO_STBY) == BIT_GYRO_STBY) {
            pwrm1 |= MPU6500_PWRM1_SLEEP;
        }
    } else {
        status = ~BIT_ACCEL_STBY;
        sensor->ops->ctrl_data &= status;
        pwrm1 &= ~MPU6500_PWRM1_SLEEP;

        mpu6500_set_rate(client, rate);
    }
。。。。
}
传入的enable参数要为1的时候,6500设置的寄存器的功能才有效。正常开机完成的时候,ioctl对底层会设置1。这也是为什么开机初阶段为什么命明设置了0x37的寄存器,
但是要等开机才有0x0c地址出来的原因。
于是要想办法不等开机起来,直接在开机初始化的时候就设置enble为1即可解决该问题。
在sensor_init里面,刚好有对sensor_active的设置:
diff --git a/drivers/input/sensors/accel/mpu6500_acc.c b/drivers/input/sensors/accel/mpu6500_acc.c
index 6fc2058e0f9f..8dea829f49cc 100644
--- a/drivers/input/sensors/accel/mpu6500_acc.c
+++ b/drivers/input/sensors/accel/mpu6500_acc.c
@@ -175,7 +175,12 @@ static int sensor_init(struct i2c_client *client)
        }-       res = sensor->ops->active(client, 0, sensor->pdata->poll_delay_ms);
+       res = sensor->ops->active(client, 1, sensor->pdata->poll_delay_ms);
        if (res) {
                dev_err(&client->dev, "%s:line=%d,error\n", __func__, __LINE__);

 

4.apk测试

 9轴对应的数据都有了。

 

参考:https://www.cnblogs.com/leptonation/p/5225889.html

https://kerndev.blog.csdn.net/article/details/103959385

标签:SENSOR,client,BOARD,传感器,mpu6500,input,sensor,MPU9250,调试
From: https://www.cnblogs.com/wmc245376374/p/18154665

相关文章

  • linux shell 脚本调试技巧
    本文分享自天翼云开发者社区《linuxshell脚本调试技巧》,作者:g****n1.bash-x加脚本这是最常用的调试手段,终端会打印出,脚本执行过程中的每一个命令。a.查看脚本流程有无错误b.查看变量值有无错误c.查看退出位置是否符合预期例如脚本 small_test.sh #!/bin/bashecho......
  • Advanced .Net Debugging 1:你必须知道的调试工具
    Advanced.NetDebugging1:你必须知道的调试工具合集-Net高级调试(基于原著)(7) 1.Advanced.NetDebugging1:你必须知道的调试工具01-242.Advanced.NetDebugging2:CLR基础02-273.Advanced.NetDebugging3:基本调试任务(调试目标、符号、控制调试目标执行和设置断点)03-04......
  • 最近对接通联支付第三方平台,支付成功后要回调方法告知支付是否成功,通知url必须为直接
    最近公司要做PC端,微信小程序端支付,对接的第三方是通联支付,因为需要用到回调方法,所以想到了natapp内网穿透的方法给通联支付提供回调的地址访问我本机项目第一步:打开natapp,注册账号https://natapp.cn/新手的话,需要购买免费隧道,不用花钱 我几年前已经申请账号也购买免费......
  • ElasticSearch 7.17.20本地源码调试
    目录使用本地安装gradle下载相关依赖本地编译本地调试使用本地安装gradle下载相关依赖在gradle安装目录下的init.d目录中,创建初始化脚本init.gradle,添加如下脚本,将其中的maven仓库源全部换成国内镜像allprojects{repositories{defREPOSITORY_URL='http://m......
  • IEC104 从站/服务端模拟器 调试工具推荐
    目录IEC104从站/服务端模拟器调试工具推荐主要功能软件截图IEC104从站/服务端模拟器调试工具推荐下载地址:http://www.redisant.cn/iec104serverIEC60870-5-104,通常简称为IEC104,是国际电工委员会(IEC)制定的用于远程监控和控制的通信协议标准。它是IEC60870-5系列标准的一......
  • 命令行调试logrotate
    logrotate配置文件一般存放在/etc/logrotate.d。场景1:不存在/var/lib/logrotate/status文件说明没有真正执行过logrotate。/var/lib/logrotate/status会记录上一次logrotate时间,记录的时间可能没有真正执行过。场景2:logrotate-d配置文件logrotate-v配置文件:执行logrotate......
  • 请问哪位大佬有空?我自己搞不定pycharm安装调试了?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【斌】问了一个Python环境安装的问题,请问哪位大佬有空?我自己搞不定pycharm安装调试了。二、实现过程这里【东哥】也给到了一个指导,我自己也给了一个配置教程。看上去是没有加载好Python解释器,配置下就好了。......
  • 【STM32+HAL库】---- 驱动MAX30102心率血氧传感器
    硬件开发板:STM32F407VET6软件平台:cubemax+keil+VScode1MAX30102心率血氧传感器工作原理MAX30102传感器是一种集成了红外光源、光电检测器和信号处理电路的高度集成传感器,主要用于心率和血氧饱和度的测量。以下是MAX30102传感器的主要特点和工作原理:红外光源:MAX30102传感器......
  • (学习)godot4.2 Android调试
      1勾选远程部署  2安装Android构建模板  3cmd运行以下命令获取debug.keystorekeytool-keyalgRSA-genkeypair-aliasandroiddebugkey-keypassandroid-keystoredebug.keystore-storepassandroid-dname"CN=AndroidDebug,O=Android,C=US"-valid......
  • Xdebug延长调试时间
    Xdebug延长调试时间环境:phpstudy,Windows版phpstudy下载-小皮面板(phpstudy)(xp.cn)Xdebug设置好之后,在断点调试的过程中,因为调试时间长,服务器会返回一个内部错误的提示,如下图所示,可以通过修改apachel的配置文件,延长Xdebug调试时间。解决办法1.打开apache的配置文件,在apac......