2. 瑞芯微平台Sensor子系统架构
本章深入剖析瑞芯微(Rockchip)平台Sensor子系统的软硬件架构。理解从物理接口到上层应用的完整数据通路,是进行寄存器配置与初始化调试的基础。我们将从硬件接口、内核驱动框架、HAL层以及Sensor Hub协同处理四个维度展开。
2.1 RK平台Sensor硬件接口
瑞芯微平台为Sensor提供了两种主流的数字通信接口:I2C 和 SPI。选择哪种接口取决于Sensor的带宽需求、功耗约束以及引脚资源。
| 特性 | I2C (Inter-Integrated Circuit) | SPI (Serial Peripheral Interface) |
|---|---|---|
| 信号线 | SDA (数据线), SCL (时钟线) | MOSI, MISO, SCLK, CS (片选) |
| 通信方式 | 半双工,主从架构 | 全双工,主从架构 |
| 速率 | 标准模式 100kbps,快速模式 400kbps,高速模式可达 3.4Mbps | 通常可达数十Mbps,甚至更高 |
| 总线占用 | 多设备共享总线,通过地址区分 | 每个设备独占片选线,总线独占性高 |
| 典型应用 | 加速度计、陀螺仪、磁力计、温湿度传感器 | 高帧率摄像头、高精度ADC、触摸屏控制器 |
| RK平台特点 | 集成多个I2C控制器,支持DMA传输,时钟源可配置 | 支持多种SPI模式 (0/1/2/3),可配置为单线/双线/四线模式 |
调试要点: 在RK平台,I2C通信失败是Sensor初始化阶段最常见的问题。务必使用示波器或逻辑分析仪检查SCL/SDA的时序、上拉电阻(通常为4.7kΩ)以及设备地址是否正确。对于SPI,需重点确认时钟极性(CPOL)和相位(CPHA)与Sensor数据手册严格匹配。
2.2 软件框架:Kernel Driver 层
在Linux内核中,Sensor驱动遵循标准的字符设备或输入子系统框架。RK平台在此基础上进行了封装,提供了统一的驱动模型。
2.2.1 驱动核心结构
- platform_driver:与设备树匹配,完成硬件资源(中断、寄存器地址、时钟)的获取。
- regmap:RK平台推荐使用regmap API来抽象I2C/SPI的寄存器读写操作,简化驱动代码。
- IIO (Industrial I/O) 子系统:对于加速度计、陀螺仪等,通常注册为IIO设备,提供统一的用户空间接口。
- Input 子系统:对于按键、接近光等事件型Sensor,注册为Input设备。
关键数据结构: 在RK Sensor驱动中,
struct sensor_device 或 struct iio_dev 是核心。驱动初始化时,需要填充 struct regmap_config 来定义寄存器读写属性(如寄存器位宽、地址位宽、是否支持缓存等)。
2.3 软件框架:HAL 层与 Sensor Hub
HAL (Hardware Abstraction Layer) 是连接Linux内核驱动与Android Framework的桥梁。RK平台通过Sensor Hub实现了低功耗的Sensor数据融合与处理。
2.3.1 HAL 层职责
- 封装内核接口:通过打开
/dev/iio:deviceX或/dev/input/eventX设备节点,与内核驱动交互。 - 数据格式转换:将内核上报的原始数据(如ADC值)转换为物理单位(如m/s², rad/s)。
- 多Sensor协同:实现Sensor融合算法(如6轴/9轴融合),提供更稳定的姿态数据。
2.3.2 Sensor Hub 架构
RK平台的Sensor Hub通常运行在一个独立的MCU(如Cortex-M0)上,或者作为SoC内部的一个独立硬件模块。其核心优势在于:
- 低功耗:主CPU可以进入深度睡眠,由Sensor Hub轮询Sensor数据,仅在数据变化或达到阈值时唤醒主CPU。
- 数据缓存与批处理:Sensor Hub可以缓存多个采样点,然后一次性上报,减少中断次数。
- 硬件加速:部分Sensor Hub内置硬件滤波器(如卡尔曼滤波器),减轻CPU负载。
调试陷阱: 在RK平台上,如果Sensor Hub固件与HAL库版本不匹配,可能导致数据上报异常或Sensor无法识别。务必检查
/vendor/firmware/ 下的Sensor Hub固件文件(如 sensor_hub.fw)是否与当前HAL版本一致。
2.4 数据通路总结
一个完整的Sensor数据从物理世界到应用程序的路径如下:
- 物理量采集:Sensor芯片将物理量(加速度、角速度等)转换为电信号。
- 数字接口传输:通过I2C/SPI总线,将原始寄存器值传输到SoC。
- 内核驱动处理:Kernel Driver读取寄存器,进行必要的校准和滤波,通过IIO/Input子系统上报。
- HAL层封装:HAL库接收内核数据,进行融合计算,转换为Android Sensor标准格式。
- 应用消费:Framework将数据分发给注册了Sensor监听器的应用程序。
初始化调试核心: 在调试初期,建议从步骤3(Kernel Driver)入手。使用
i2cget 或 i2cdump 工具直接读取Sensor的WHO_AM_I寄存器,验证硬件通信是否正常。这是后续所有调试工作的前提。