icm42688
产品简介
ICM42688 为 6 轴 IMU(三轴陀螺仪 + 三轴加速度计),可通过 I2C 接入 RDK 开发板。驱动注册为独立的陀螺仪与加速度计 IIO 设备,便于分别读取角速度与线加速度原始值。
本文档针对 RDK X5 / RDK X5 Module,系统镜像建议 3.4.1 及以上。
安装方法
硬件连接
这里以 RDK 双目摄像头连接举例(不是说一定要用双目摄像头,只是使用模组上的传感器)

- 将 ICM42688 模组按说明书接入 RDK X5 的 mipi 排插。
- 确认模组供电与 I2C 地址无冲突。
软件配置
在全屏终端中运行 sudo srpi-config:
- 进入
3 Interface Options→I6 IMU
![]()
![]()
- 选择 ICM42688 相关选项(以菜单显示为准)
![]()
- 选择
Finish,确认后重启
![]()
![]()
卸载方法
- 进入
srpi-config→3 Interface Options→I6 IMU - 选择
UNSET - 断电后取下模组
运行
1. 检查 IIO 设备
ls /sys/bus/iio/devices/
2. 读取传感器数据
以下示例中 iio:device1、iio:device2 序号以实际注册结果为准,请先通过 name 节点确认:
cat /sys/bus/iio/devices/iio:device1/name
cat /sys/bus/iio/devices/iio:device2/name
预期示例输出:
root@ubuntu:~# cat /sys/bus/iio/devices/iio:device1/name
icm42688-gyro
root@ubuntu:~# cat /sys/bus/iio/devices/iio:device2/name
icm42688-accel

读取原始数据:
cat /sys/bus/iio/devices/iio:device2/in_accel_x_raw
cat /sys/bus/iio/devices/iio:device1/in_anglvel_x_raw


能正确读出 name 与各轴 *_raw 数值,即表示 ICM42688 工作正常。
3. 使用 Input 事件接口读取数据
上文我们通过 IIO 节点确认了 ICM42688 驱动注册正常。若你的应用需要 SLAM、防抖(EIS)、AR/VR、多传感器融合 等能力,通常还要求 IMU 数据带硬件采样时间戳,而不能只用应用层读取时刻。
ICM42688 驱动与 BMI088 一样,除 IIO sysfs 外,还提供 Linux Input EVENT 接口:经 /dev/input/eventX 以流式方式推送每帧六轴数据及硬件时间戳。板端示例程序 sample_imu_input 演示了如何读取并校验这套数据。
数据格式说明
一帧 IMU 数据由驱动拆为 9 个 EV_MSC 事件(code = 0x04)+ EV_SYN / SYN_REPORT 结束信号 组成。应用侧收满 9 个字段后组帧解析:
| 顺序 | 内容 | 说明 |
|---|---|---|
| 0–2 | ACC X/Y/Z | 加速度原始值(16 位有符号 LSB) |
| 3–5 | GYRO X/Y/Z | 陀螺仪原始值(16 位有符号 LSB) |
| 6–7 | 时间戳高/低 32 位 | 拼为 64 位纳秒时间戳,表示硬件采样时刻 |
| 8 | 中断计数 | 驱动中断累计次数 |
input_event.ev.time 是内核收到事件的时间;IMU 硬件采样时间戳在 MSC 字段的 ev.value 中,由驱动打包。
ICM42688 与 BMI088 使用同一套 Input 中断上报协议,sample_imu_input 无需区分型号,只需打开正确的 event 节点。
1. 查找 IMU 对应的 event 节点
在 /proc/bus/input/devices 中查找 ICM42688 注册的 Input 设备。设备名以驱动实际注册为准,一般为 icm42688-sensor(若 grep 无结果,可先用 cat /proc/bus/input/devices 查看 Name= 字段):
grep -A5 icm42688-sensor /proc/bus/input/devices
在输出中找到 H: Handlers=eventX,即对应 /dev/input/eventX。示例:
H: Handlers=event2
则运行时使用 /dev/input/event2。event 编号因系统而异,务必以本机 grep 结果为准。
2. 运行示例程序
示例程序预置在板端以下路径:
/app/platform_samples/sample_imu/sample_imu_input/sample_imu_input
进入目录并运行(将 eventX 替换为上一步得到的实际节点):
cd /app/platform_samples/sample_imu/sample_imu_input
./sample_imu_input /dev/input/eventX
默认打开 /dev/input/event1。启动后持续输出,晃动模组观察数 值变化;Ctrl + C 退出并查看统计信息。
3. 查看输出
ACC(ax,ay,az) | GYRO(gx,gy,gz) | TS:1234567890 ns | Lost: 0 | EventCount: 10 | up_count: 100 | lower_count: -
| 字段 | 含义 |
|---|---|
ACC / GYRO | 六轴原始 LSB |
TS | 硬件采样时间戳(ns) |
Lost | 丢帧累计(相邻帧时间戳间隔 > 3.5 ms 时增加) |
up_count | 驱动中断计数 |
4. 自行开发参考
openInput 设备 → 循环readinput_event;EV_MSC(code0x04)按序缓存 9 个ev.value;SYN_REPORT到达且字段齐全时,解析六轴、拼接时间戳。
参考实现:
板端位置 :/app/multimedia_samples/sample_imu/sample_imu_input/sample_imu_input.c。
源码位置 :/source/hobot-multimedia-samples/debian/app/multimedia_samples/sample_imu/sample_imu_input/sample_imu_input.c。
常见问题排查
- device 序号与示例不同:以
ls /sys/bus/iio/devices/与cat .../name结果为准,将命令中的device1/device2替换为实际节点。 - 读取为空或报错:确认
srpi-config已启用 ICM42688 并已重启;检查 I2C 接线与地址。 - sample_imu_input 无输出:确认
srpi-config已启用 ICM42688 并已重启;用grep -A5 icm42688-sensor /proc/bus/input/devices确认 event 路径;IIO 能读但 Input 无数据时,检查是否完成重启且驱动版本支持 EVENT 接口。
如需双目 IMU 相机等融合应用,请参阅 双目 IMU 相机。