rk3576 适配 MPU9250
rk3576 适配加速度计、陀螺仪、地磁 MPU9250MPU9250 是 InvenSense已被 TDK 收购推出的一款集成式 9 轴运动跟踪传感器。它在一个封装内集成了 3 轴陀螺仪、3 轴加速度计 以及 3 轴磁力计AK8963并内置了数字运动处理器DMP广泛应用于手机、平板、无人机及各类物联网设备。MPU9250是一款高性能的九轴传感器集成了三轴陀螺仪、三轴加速度计和三轴磁力计。它由InvenSense公司生产广泛应用于消费电子、机器人、无人机、虚拟现实和增强现实等领域。三轴陀螺仪提供角速度测量能够检测物体的旋转情况。三轴加速度计测量物体在三个方向上的加速度常用于检测姿态变化和运动状态。三轴磁力计用于检测地球磁场的方向帮助实现更精准的导航和姿态估计。集成度高将陀螺仪、加速度计和磁力计集成在一个芯片内简化了系统设计。I2C/SPI接口支持I2C和SPI通信协议方便与微控制器MCU或其他设备进行连接。低功耗适合电池供电的应用具有低功耗特性作者炭烤毛蛋 点击博主了解更多。提示: MP6500/MPU9250 i2c 通信失败可以参考《rk3576 I2C》。文章目录rk3576 适配加速度计、陀螺仪、地磁 MPU92501. 核查 MPU9250 原理图1.1 MPU I2C1.2 MPU SPI2. MPU9250 内核配置2.1 MPU9250 驱动架构2.2 MPU9250 驱动讲解2.3 MPU9250 内核设备树3. MPU9250 HAL配置结语1. 核查 MPU9250 原理图MPU-9250提供I²C和SPI两种通信接口使其能够兼容更多设备。1.1 MPU I2CMPU-9250 要接 RK3576我建议优先采用 I²C 接口 1.8V I/O。关键不是 MPU-9250 的 VDD 必须跟 RK3576 一样而是 VDDIO、I²C 上拉电压、RK3576 对应 GPIO 电源域三者必须匹配。电源SDA / SCL1.8VGPIO1.8V3.3VMPU-9250加速度计陀螺仪AK8963磁力计Linux DriverSensor Framework应用RKI2CINTMPU9250 I2C 总线通讯方式硬件连接需要 I2C、IRQ, 供电部分则需要 VDD 和 VDDIO。VDDIO信号逻辑电平支持1.8、3.3V与 rk3576 对应接口的电平保持一致。。VDD芯片VDD 供电 2.4~3.3 伏特与MPU6500相比电压略高毕竟有多一颗地磁场芯片。ADDR芯片地址选择信号线AD0拉高该GPIO则 I2C 地址为 0x69拉低该 GPIO 则为 0x68。IRQINT 信号高电平有效可以选择高电平触发当然也可以选择上升沿触发中断。1.2 MPU SPIMPU9250 的 SPI 总线通信方式硬件连接需要 SPI、IRQ, 供电部分则需要 VDD 和 VDDIO。VDDIO信号逻辑电平支持1.8、3.3V与 rk3576 对应接口保持一致。VDD芯片VDD 供电 2.4~3.3 伏特。nCSSPI 片选信号线确定芯片是否占用SPI总线。IRQINT 信号高电平有效可以选择高电平触发当然也可以选择上升沿触发中断。2. MPU9250 内核配置MPU9255和MPU6500都是由InvenSense公司生产的六轴和九轴惯性测量单元IMU从字面上不难看出 MPU9250 是升级的新一代。轴数MPU6500这是一个六轴传感器集成了三轴陀螺仪和三轴加速度计。MPU9250这是一个九轴传感器除了集成三轴陀螺仪和三轴加速度计外还集成了三轴磁力计电子罗盘。功能MPU6500适用于需要加速度和角速度测量的应用例如运动跟踪、姿态估计等。MPU9250由于包括磁力计它非常适合更复杂的应用如姿态估计和方向跟踪因为它可以提供绝对方向信息。传感器精度两者在加速度计和陀螺仪的性能上相似但MPU9250的磁力计可能会引入额外的误差和校准需求。2.1 MPU9250 驱动架构MPU9250集合加速度计、陀螺仪和磁力计MPU9250 对比MPU6500 增加内挂三轴磁力计磁力计 I2C 地址与 MPU9250 不相同而是借助 MPU9250 桥接转换然后才能读取磁力计数据。MPU 框架如果想完全使用该芯片需要使用 inv 专用驱动kernel/drivers/input/sensors与 drivers/input/sensors 框架驱动略有不同。感兴趣小伙伴可以自行研究。源码框架如下compass/ ├── Kconfig ├── Makefile ├── ak09911.c ├── ak09918.c ├── ak8963.c └── ak8975.cMPU 内核宏配置内核需要确保 MPU9250 相关宏正常开启。如果发现相关驱动没有编译到参照如下修改核查内核配置。diff--gita/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig index a56ad38e25f1..47f3c8c7958d100644--- a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig -558,8 558,8 CONFIG_ROCKCHIP_REMOTECTL_PWMyCONFIG_SENSOR_DEVICEyCONFIG_GSENSOR_DEVICEyCONFIG_GS_MMA8452y CONFIG_MPU6880_ACCy CONFIG_MPU6500_ACCyCONFIG_GS_KXTJ9yCONFIG_GS_LIS3DHyCONFIG_GS_MMA7660y -572,15 572,15 CONFIG_GS_LSM303DyCONFIG_LSM330_ACCyCONFIG_BMA2XX_ACCyCONFIG_GS_DA223y CONFIG_COMPASS_DEVICEy CONFIG_COMPASS_AK8975y CONFIG_COMPASS_AK8963yCONFIG_GYROSCOPE_DEVICEyCONFIG_GYRO_L3G4200DyCONFIG_GYRO_L3G20DyCONFIG_GYRO_EWTSAy CONFIG_GYRO_MPU6500yCONFIG_GYRO_MPU6880yCONFIG_GYRO_LSM330yCONFIG_LIGHT_DEVICEyCONFIG_LS_CM3217y2.2 MPU9250 驱动讲解MPU9250 芯片由 MP6500 外挂 ak8973 拼合而成ak8973 可以通过 AUX_CL、AUX_DA 直接读取数据。硬件设计时如果没有预留 AUX 信号线MPU9255 开启 bypass 模式复用到 MPU6500 I2C。MPU6500 寄存器0x37的 bypass 使能控制位 Bit1 置1即可开启此时 MPU6500 I2C总线可以探测到 ak8973 地址 0x0c等同总线额外挂载磁力计芯片。diff--gita/drivers/input/sensors/accel/mpu6500_acc.c b/drivers/input/sensors/accel/mpu6500_acc.c index 6fc2058e0f9f..6a196b745cc1100644--- 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)}msleep(10);- ressensor-ops-active(client,0, sensor-pdata-poll_delay_ms); ressensor_write_reg(client, MPU6500_INT_PIN_CFG, BIT_BYPASS_EN);if(res){ dev_err(client-dev,%s: compass bypass mode fail %d\n, __func__, res);} ressensor-ops-active(client,1, sensor-pdata-poll_delay_ms);if(res){dev_err(client-dev,%s:line%d,error\n, __func__, __LINE__);returnres;2.3 MPU9250 内核设备树MPU9250通过内部的算法和传感器融合技术将来自加速度计、陀螺仪和磁力计的数据进行处理提供精确的运动跟踪和空间定位信息。磁力计 I2C 地址为 0x0c借助 MPU9250 桥接传递I2C命令、数据。内核设备树可以看到 i2c-get 配置。MPU9250 设备树i2c2{statusokay;mpu6500_acc: mpu_acc68{statusokay;compatiblempu6500_acc;reg0x68;irq-gpiogpio1 RK_PA0 IRQ_TYPE_EDGE_RISING;irq_enable0;poll_delay_ms30;typeSENSOR_TYPE_ACCEL;layout8;};mpu6500_gyro: mpu_gyro68{statusokay;compatiblempu6500_gyro;reg0x68;irq_enable0;poll_delay_ms30;typeSENSOR_TYPE_GYROSCOPE;layout8;};};pinctrl{mpu9250{mpu9250_irq_gpio: mpu9250-irq-gpio{rockchip,pins1RK_PA0 RK_FUNC_GPIOpcfg_pull_none;};};};查看加载日志发现使用模块与设备不匹配。大意了用错模块。驱动可以兼容不是啥事。[1.129420]inv-mpu6050-i2c2-0068: mounting matrix not found: using identity...[1.129966]inv-mpu6050-i2c2-0068:whoamimismatch got 0x73(MPU9255)expected 0x68(MPU9250)MPU9255 设备树MPU9255 内置磁力计型号为 ak09916磁力计在性能和精度上有所提升。ak09916 I2C 地址为 0x0c修改设备树时需要额外注意。i2c2{statusokay;mpu6500_acc: mpu_acc68{statusokay;compatiblempu6500_acc;reg0x68;irq-gpiogpio1 RK_PA0 IRQ_TYPE_EDGE_RISING;irq_enable0;poll_delay_ms30;typeSENSOR_TYPE_ACCEL;layout8;};mpu6500_gyro: mpu_gyro68{statusokay;compatiblempu6500_gyro;reg0x68;irq_enable0;poll_delay_ms30;typeSENSOR_TYPE_GYROSCOPE;layout8;};sensor0c{statusokay;compatibleak8963;pinctrl-namesdefault;pinctrl-0ak8963_irq_gpio;reg0x0c;typeSENSOR_TYPE_COMPASS;irq-gpiogpio1 RK_PC2 IRQ_TYPE_EDGE_RISING;irq_enable0;poll_delay_ms30;layout3;};};pinctrl{mpu9255{mpu9255_irq_gpio: mpu9255-irq-gpio{rockchip,pins1RK_PA0 RK_FUNC_GPIOpcfg_pull_none;};};ak8963{ak8963_irq_gpio: ak8963-irq-gpio{rockchip,pins1RK_PC2 RK_FUNC_GPIOpcfg_pull_none;};};};加速度计和陀螺仪正常加载日志如下[0.984518]i2c /dev entries driver[0.986094]gsensor_mpu65002-0068: sensor_register_device: mpu6500_acc,id29[0.986113]i2c i2c-2: sensor_probe: mpu6500_acc,00000000846b5e7a[0.986159]gsensor_mpu65002-0068: sensor_chip_init:mpu6500_acc:devid0x0,ops0x0000000050b61c26[1.183201]input: gsensor as /devices/platform/2ac50000.i2c/i2c-2/2-0068/input/input0[1.183351]gsensor_mpu65002-0068: sensor_irq_init:use polling,delay30ms[1.183450]gsensor_mpu65002-0068: sensor_misc_device_register:miscdevice: mma8452_daemon[1.183468]gsensor_mpu65002-0068: sensor_probe:initialized ok,sensor name:mpu6500_acc,type:2,id29\x0a[1.343739]gyro_mpu65002-0068-1: sensor_register_device: mpu6500_gyro,id56[1.343754]i2c i2c-2: sensor_probe: mpu6500_gyro,00000000a5407abf[1.343785]gyro_mpu65002-0068-1: sensor_chip_init:mpu6500_gyro:devid0x0,ops0x00000000108cba98[1.427164]input: gyro as /devices/platform/2ac50000.i2c/i2c-2/2-0068-1/input/input3[1.427780]gyro_mpu65002-0068-1: sensor_irq_init:use polling,delay30ms[1.428350]gyro_mpu65002-0068-1: sensor_misc_device_register:miscdevice: gyrosensor[1.428396]gyro_mpu65002-0068-1: sensor_probe:initialized ok,sensor name:mpu6500_gyro,type:4,id56\x0a磁力计加载后可以看到日志[1.183823]compass_akm89632-000c: sensor_register_device: akm8963,id37[1.183842]i2c i2c-2: sensor_probe: ak8963,000000000dcb1ce6[1.184353]compass_akm89632-000c: sensor_chip_init:ak8963:devid0x48,ops0x000000007db60da0[1.185321]input: compass as /devices/platform/2ac50000.i2c/i2c-2/2-000c/input/input1[1.185440]compass_akm89632-000c: sensor_irq_init:use polling,delay30ms[1.185535]compass_akm89632-000c: sensor_misc_device_register:miscdevice: compass[1.185551]compass_akm89632-000c: sensor_probe:initialized ok,sensor name:akm8963,type:3,id37\x0a3. MPU9250 HAL配置rk3576 Android 系统需要配置 Sensors 的 HAL 层 兼容该模组MPU9250 对应 HAL层为 ST。HAL 启用 MPU9250修改具体对应的Sensor HAL使能GRAVITY_SENSORGYROSCOPE_SENSOR以及COMPASS_SENSOR 也需要一并启用。device/rockchip/rk356x/rk3576_t/BoardConfig.mkBOARD_SENSOR_ST :trueBOARD_SENSOR_COMPASS_AK8963-64 :trueBOARD_SENSOR_MPU_PAD :falseBOARD_COMPASS_SENSOR_SUPPORT :trueBOARD_GYROSCOPE_SENSOR_SUPPORT :trueBUILD_WITH_GOOGLE_GMS_EXPRESS :falseCAMERA_SUPPORT_AUTOFOCUS:false修改 HAL 建议重新编译 Android然后整包刷机生效修改。HAL 识别 MPU9250HAL 加速度计、陀螺仪和磁力计加载后getevet 看到如下内容。adddevice1: /dev/input/event1 name:compassadddevice2: /dev/input/event0 name:gsensoradddevice3: /dev/input/event2 name:Typec_Headphoneadddevice4: /dev/input/event3 name:gyro结语不枉博主详细讲解欢迎订阅博主–炭烤毛蛋 。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →