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控制器底层细节。
RK平台Sensor驱动分层架构图 RK平台Sensor驱动分层架构 应用层 (App / Framework) HAL层 (Hardware Abstraction Layer) 内核驱动层 (Kernel Driver) IIO / Input 子系统 Sensor 核心层 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通信开销。
I2C子系统角色交互图 I2C子系统在Sensor驱动中的角色交互 I2C Core 子系统 Sensor 驱动 (client) I2C 控制器 (adapter) Sensor 硬件芯片 调用 i2c_smbus_xxx API 控制 SCL/SDA 时序 物理电平传输 地址映射:7-bit slave addr 寄存器读写:reg addr + data

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硬件连接:

典型Sensor硬件连接拓扑 典型Sensor硬件连接拓扑 (I2C总线) RK SoC I2C2 控制器 SCL (I2C2_SCL) SDA (I2C2_SDA) 加速度计 0x18 (ADDR=L) 陀螺仪 0x68 (ADDR=H) 磁力计 0x0C (固定) R_pu R_pu 硬件连接要点 1. 所有Sensor共享SCL/SDA,通过从机地址区分 2. 每个Sensor需独立的中断引脚 (INT) 用于数据就绪通知 3. 上拉电阻通常为4.7kΩ,高速模式需调整

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的对应关系。