1. Sensor驱动概述:RK平台Sensor驱动架构、I2C子系统角色、Sensor硬件接口简介
1.1 RK平台Sensor驱动整体架构
在Rockchip(RK)嵌入式平台上,Sensor(传感器)驱动采用分层解耦的软件架构,从上至下依次为:应用层 → HAL层 → 内核驱动层 → 硬件层。内核驱动层是本节关注的核心,其内部又细分为三个子层:
- IIO / Input 子系统层:向上提供统一的数据上报接口(如加速度计通过Input上报事件,温湿度计通过IIO上报原始数据)。
- Sensor 核心层 (Sensor Core):封装通用Sensor操作(使能/禁能、采样率设置、数据读取),向下调用I2C/SPI总线接口。
- I2C 总线驱动层:负责物理地址映射、寄存器读写时序,是连接CPU与Sensor芯片的桥梁。
架构要点: RK平台Sensor驱动不直接操作GPIO或寄存器地址,而是通过I2C子系统完成所有配置。驱动开发者只需关注Sensor芯片的寄存器映射表,无需关心I2C控制器底层细节。
1.2 I2C子系统在Sensor驱动中的角色
I2C(Inter-Integrated Circuit)是RK平台Sensor最常用的通信总线。I2C子系统在内核中承担以下关键角色:
| 角色 | 说明 | 对应内核组件 |
|---|---|---|
| 地址映射器 | 将Sensor芯片的7位从机地址映射到I2C总线拓扑中,驱动通过地址找到设备 | i2c_client + i2c_board_info |
| 寄存器读写引擎 | 封装SMBus/Byte协议,提供 i2c_smbus_read_byte_data() / i2c_smbus_write_byte_data() 等API |
i2c-core + i2c-algo-bit |
| 时序仲裁者 | 管理多主设备冲突、时钟拉伸(Clock Stretching)、速率控制(标准/快速/高速模式) | i2c-adapter + i2c-bus |
| 设备枚举器 | 通过设备树(Device Tree)或ACPI自动匹配Sensor驱动,完成probe流程 | of_i2c_register_devices() |
实战提示: 在RK平台上,Sensor驱动通常使用
i2c_smbus_read_i2c_block_data() 批量读取多个连续寄存器,以提升数据采集效率。例如读取6轴IMU的加速度和角速度原始值时,一次突发读取12字节可减少I2C通信开销。
1.3 Sensor硬件接口简介
RK平台常见的Sensor硬件接口包括I2C、SPI和GPIO模拟。其中I2C接口因引脚少(仅SCL/SDA两线)、支持多设备挂载,成为绝大多数消费级Sensor(如加速度计、陀螺仪、磁力计、温湿度传感器)的首选。
1.3.1 I2C接口关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| 从机地址 | 0x18 ~ 0x77 (7-bit) | 由Sensor芯片的ADDR引脚电平决定,驱动通过设备树指定 |
| 总线速率 | 100 kHz (标准) / 400 kHz (快速) | RK3399/RK3588等平台支持1 MHz高速模式 |
| 寄存器宽度 | 8-bit / 16-bit | 多数Sensor使用8-bit寄存器地址,部分使用16-bit |
| 数据位宽 | 8-bit / 16-bit / 24-bit | 加速度计输出通常为16-bit左对齐 |
1.3.2 典型Sensor硬件连接拓扑
在RK参考设计中,多个Sensor通常共享同一条I2C总线(如I2C2),通过不同的从机地址区分。下图展示了一个典型的Sensor硬件连接:
1.4 设备树中的I2C地址映射
在RK平台中,Sensor的I2C地址映射通过设备树(Device Tree)完成。驱动在probe阶段通过 i2c_client 结构体获取已解析的地址信息。以下是一个典型Sensor节点的设备树片段:
/* RK3588 设备树 - I2C2 总线上的Sensor节点 */
&i2c2 {
status = "okay";
clock-frequency = <400000>; /* 400 kHz 快速模式 */
/* 加速度计: BMI160 */
bmi160@68 {
compatible = "bosch,bmi160";
reg = <0x68>; /* 7-bit I2C 从机地址 */
interrupt-parent = <&gpio1>;
interrupts = <RK_PB2 IRQ_TYPE_EDGE_RISING>;
mount-matrix = "0", "1", "0",
"-1", "0", "0",
"0", "0", "1";
};
/* 磁力计: AK09911 */
ak09911@0c {
compatible = "ak,ak09911";
reg = <0x0c>;
interrupt-parent = <&gpio1>;
interrupts = <RK_PB3 IRQ_TYPE_EDGE_RISING>;
};
};
常见陷阱: 设备树中
reg 属性填写的是7-bit I2C地址(左对齐),而非8-bit读写地址。例如Sensor数据手册标注“Slave Address = 0xD0 (写) / 0xD1 (读)”,实际设备树应填写 0x68(右移1位)。务必确认数据手册的地址表示方式。
1.5 本章小结
- RK平台Sensor驱动采用分层架构,I2C子系统位于内核驱动层最底层,负责地址映射和寄存器读写。
- I2C子系统的核心角色包括:地址映射器、寄存器读写引擎、时序仲裁者、设备枚举器。
- Sensor硬件接口以I2C为主,通过设备树配置从机地址、中断引脚和总线速率。
- 驱动开发者需要理解7-bit地址与8-bit地址的转换,以及设备树节点与i2c_client的对应关系。