1、RK平台Sensor驱动概述
1.1 RK平台Sensor子系统架构
RK平台Sensor子系统采用分层的软件架构设计,从底层硬件到上层应用依次划分为:硬件层 → 内核驱动层 → HAL硬件抽象层 → Android框架层。这种分层设计使得驱动开发者只需关注内核驱动层与设备树的适配,上层逻辑由通用框架统一处理。
架构核心要点:RK平台的Sensor驱动遵循Linux内核的IIO(Industrial I/O)子系统或Input子系统规范,通过设备树描述硬件资源,利用中断、I2C/SPI总线与Sensor芯片通信。
1.2 Sensor驱动在Android/Linux中的位置
在RK平台的Android系统架构中,Sensor驱动横跨内核空间与用户空间两个层面。内核空间负责硬件寄存器操作、中断响应、数据采集;用户空间负责数据上报、校准、融合算法。下表清晰展示了各层级的职责与接口关系:
| 层级 | 组件 | 职责 | 接口/协议 |
|---|---|---|---|
| 应用层 | App / Game | 调用SensorManager获取数据 | Android SDK API |
| 框架层 | SensorService | 管理Sensor列表、数据分发 | Binder IPC |
| HAL层 | sensors.xxx.so | 封装内核接口、数据校准 | HAL接口规范 |
| 内核驱动 | Sensor Driver | 寄存器读写、中断处理、数据上报 | IIO / Input API |
| 硬件层 | Sensor Chip | 物理量采集(加速度/角速度/磁场) | I2C / SPI / GPIO |
驱动开发者关注点:在RK平台进行Sensor驱动移植时,主要工作集中在内核驱动层和设备树。HAL层通常由芯片原厂提供或使用通用适配层,无需大量修改。
1.3 驱动移植的整体流程
RK平台Sensor驱动移植遵循一套标准化的步骤,从硬件确认到功能验证,每一步都有明确的交付物。整体流程可概括为以下7个关键阶段:
- 硬件原理图确认 — 确认Sensor芯片型号、I2C/SPI总线编号、中断GPIO、供电电压、复位引脚。
- 设备树编写 — 在RK平台设备树(.dts)中添加Sensor节点,配置总线地址、中断号、电源域、时钟等资源。
- 内核驱动移植 — 基于芯片Datasheet编写或移植IIO/Input驱动,实现probe、remove、suspend/resume、数据读取等回调。
- 编译与烧录 — 配置内核Kconfig/Makefile,编译生成boot.img或内核模块,烧录至RK开发板。
- 基础功能验证 — 使用i2c-tools、sysfs节点、cat /sys/bus/iio/devices/iio:device0/in_*等命令验证驱动加载与数据读取。
- HAL层适配 — 修改Sensor HAL配置文件,注册新Sensor类型、校准参数、上报速率。
- 系统集成测试 — 使用Android CTS/VTS Sensor测试套件、SensorTest工具进行完整功能与性能验证。
常见移植陷阱:
- 设备树中中断号与GPIO对应错误,导致驱动无法响应中断。
- I2C地址与芯片手册不一致(7位地址 vs 8位地址混淆)。
- 电源域未正确使能,Sensor芯片无法上电初始化。
- HAL层Sensor类型注册错误,导致Android系统无法识别设备。
1.4 设备树在Sensor驱动中的关键作用
RK平台使用扁平设备树(Flattened Device Tree, FDT)来描述硬件资源。Sensor驱动通过设备树获取以下关键信息:
| 设备树属性 | 说明 | 示例值 |
|---|---|---|
compatible |
驱动匹配字符串 | "bosch,bma253" |
reg |
I2C从设备地址 | 0x18 |
interrupt-parent |
中断控制器 | &gpio1 |
interrupts |
中断号与触发类型 | <RK_PB2 IRQ_TYPE_EDGE_RISING> |
vdd-supply |
电源域控制 | &vcc_3v3 |
mount-matrix |
安装方向矩阵(校准用) | "1","0","0","0","1","0","0","0","1" |
设备树适配原则:驱动代码应尽量从设备树解析参数,避免硬编码。这样同一份驱动代码可以支持不同硬件配置的RK主板,提高代码复用率。