1 IMU传感器
IMU的全称是Inertial Measurement Unit,惯性传感器单元。其实包含了大概三种传感器,Accelerometer加速度传感器,Gyroscope陀螺仪,Magnetometer磁力传感器。
下图就是一个典型的IMU。

所有IO口功能如下:
| 引脚名称 | 功能说明 | 典型连接方式 |
|---|---|---|
| UCC | 电源输入 | 接 3.3V(不支持 5V 直连) |
| GND | 公共地 | 接主控地,必须共地 |
| SCL | I2C 时钟线 | 接主控 I2C_SCL |
| SDA | I2C 数据线 | 接主控 I2C_SDA |
| ADO | I2C 地址选择 | 拉高 / 拉低可切换 I2C 从地址 |
| CS | SPI 片选信号 | I2C 模式下接高电平;SPI 模式下接主控 SPI_CS |
| INT | 中断输出 | 可接主控 GPIO,用于数据就绪 / 姿态更新通知 |
| RST | 复位信号 | 拉低复位芯片,一般接主控 GPIO 或上拉至高 |
| BOOT | 引导模式引脚 | 正常工作时接高 / 悬空,固件升级时进入特殊模式 |
| PS1 | 通信模式选择位 1 | 与 PS0 配合,决定通信接口类型 |
| PS0 | 通信模式选择位 0 | 与 PS1 配合,决定通信接口类型 |
可以看到,本质就是一个I2C设备。
2 高通平台的IMU
在高通平台上,不是直接接这个I2C设备,而是使用的BP侧芯片去接的,没有直接AP。主要是考虑到功耗,AP要休眠,BP则可以长时间工作并运行一些基础算法。
查了一下,大概的流程如下:
高通平台(如SDM845/7150等)传感器驱动Bringup主要在ADSP/SLPI(BP侧)完成,核心流程包括: 添加驱动代码到SSC目录、配置编译规则、定义.proto通信协议、修改注册表以加载驱动 。AP侧负责配置设备树(DTS)映射和HAL层映射,最终实现数据流通。 [1, 2, 3]
一、 BP侧(ADSP/SLPI)传感器驱动挂载
BP侧负责底层的驱动逻辑、I2C/SPI通信和数据采样。
- 添加驱动文件
将传感器驱动文件 (.c,.h) 放入高通专用的SSC驱动目录中:
vendor/qcom/non-hlos/ADSP.VT.x.x/adsp_proc/ssc_drivers/<sensor_name>/。- 配置编译规则 (
build/)
在驱动目录下创建或修改.scons文件,将驱动源文件添加到编译系统,并确保生成相应的.o文件。- 定义协议(.proto)
在adsp_proc/ssc/framework/pb等目录下添加或更新.proto文件,定义Sensor的属性、数据格式和事件类型。- 修改注册表(Registry)
在ssc_drivers/<sensor_name>/build/下的配置中,添加注册信息(如采样率、I2C地址、GPIO引脚等),使ADSP启动时能识别和加载该驱动。- 编译与更新
编译ADSP映像并烧录adsp.mbn(或sensor.img)。 [1, 2, 3]二、 AP侧配置与HAL层映射
AP侧(Android)负责处理HAL接口、设备树配置以及与ADSP的QMI通信。
- DTS设备树配置
在AP端的DTS文件中,配置对应的I2C/SPI总线节点和中断引脚,确保硬件资源与ADSP对应。- 添加.proto协议文件
将ADSP侧定义的.proto文件同步一份到AP侧对应目录下,保证通信数据格式一致。- HAL层适配 (
.cpp)
在传感器HAL目录中(如hardware/qcom/sensors/),添加对应的驱动解析.cpp文件,实现BP侧数据到Android传感器事件的转换。- 添加传感器注册配置
在传感器配置文件(如sns_registry)中注册新的传感器ID和属性。 [1, 2]三、 调试与Bringup验证
- 查看日志 :使用
adb logcat和diag工具(QCAT/QXDM)查看SSC注册和数据流信息。- 检查驱动加载 :确认
ssc_drivers是否加载成功。- 数据校验 :验证传感器是否能正常读取原始数据。 [1, 2]
通过以上步骤,实现了从BP侧底层驱动管理到AP侧上层数据应用的闭环。
大概是这样吧,没有验证过哈,只是初步了解。。。