3. MTK Sensor HAL 架构

MTK Sensor HAL 是连接 Linux 内核 Sensor 驱动与 Android 框架的中间层,负责将底层硬件能力抽象为 Android 可识别的 Sensor 接口。理解其设计思想、与 Android HAL 的关系以及核心数据结构,是进行 Sensor 驱动移植与 Buffer 管理适配的基础。

3.1 HAL 层设计思想

MTK Sensor HAL 的设计遵循以下核心原则:

  • 硬件抽象与平台解耦:将 Sensor 硬件操作封装在 HAL 层,上层 Android 框架无需关心具体硬件实现,仅通过标准接口调用。MTK 平台特有的寄存器配置、中断处理、电源管理等细节被隔离在 HAL 内部。
  • 多 Sensor 统一管理:通过 Sensor 列表(Sensor List)管理所有物理 Sensor,每个 Sensor 由唯一的 handle 标识。HAL 负责 Sensor 的注册、使能、配置、数据上报等生命周期管理。
  • Buffer 管理集中化:HAL 层统一管理数据 Buffer 的申请、填充、同步与释放,避免每个 Sensor 驱动单独处理 Buffer 带来的碎片化问题。Buffer 管理策略直接影响数据延迟与吞吐量。
  • 性能与功耗平衡:通过批处理(Batch)、唤醒(Wake-up)等机制,在保证数据实时性的前提下降低 CPU 唤醒频率,延长待机时间。
设计要点:MTK Sensor HAL 的设计强调“一次适配,多场景复用”。开发者只需按照 HAL 规范实现 Sensor 的初始化、使能、读取、休眠等回调,即可完成基本移植。Buffer 管理、数据同步等复杂逻辑由 HAL 框架统一处理。

3.2 MTK Sensor HAL 与 Android HAL 的关系

Android 定义了标准的 Sensor HAL 接口(sensors.h),MTK 在此基础上进行了扩展与优化。两者的关系如下表所示:

维度 Android HAL(标准) MTK Sensor HAL(扩展)
接口定义 sensors_poll_device_t、sensors_module_t 继承标准接口,增加 MTK 私有扩展函数(如 mtk_sensor_set_batch)
Sensor 类型 仅支持 Android 定义的 Sensor 类型(加速度、陀螺仪、磁力计等) 支持 Android 标准类型 + MTK 自定义类型(如 AI 运动识别、多合一 Sensor)
Buffer 管理 仅提供基本的数据上报接口(poll) 引入 MTK Buffer Manager,支持环形 Buffer、DMA 直接填充、零拷贝传递
功耗优化 依赖上层框架的批处理策略 硬件级批处理(HW FIFO)、动态采样率调节、Sensor 协同休眠
调试与诊断 无内置调试接口 提供 mtk_sensor_dump、mtk_sensor_selftest 等调试函数

MTK Sensor HAL 在 Android HAL 的基础上,通过扩展接口和私有数据结构,实现了对 MTK 平台硬件特性的充分利用。开发者需要同时理解 Android 标准接口和 MTK 扩展接口,才能完成完整的驱动适配。

关键点:MTK Sensor HAL 不是对 Android HAL 的替代,而是增强。所有 Android 标准接口必须正确实现,MTK 扩展接口用于提供平台特有的优化能力。在移植过程中,优先保证标准接口的兼容性,再逐步启用扩展功能。

3.3 HAL 层关键数据结构与接口函数

MTK Sensor HAL 的核心数据结构与接口函数定义在 sensors.h 和 mtk_sensors.h 中。以下是最关键的几个部分:

3.3.1 核心数据结构

数据结构 作用 关键字段
sensor_t 描述单个 Sensor 的静态属性(名称、类型、分辨率、最大范围等) name、vendor、type、maxRange、resolution、power
sensors_event_t 表示一次 Sensor 数据事件,包含时间戳、精度、数据值 timestamp、version、type、data(union 类型)
sensors_poll_device_t HAL 设备对象,提供 activate、setDelay、poll 等操作函数 common(hw_device_t)、activate、setDelay、poll、batch
sensors_module_t HAL 模块对象,负责 Sensor 列表的获取与模块初始化 common(hw_module_t)、get_sensors_list
mtk_sensor_context_t MTK 扩展上下文,保存每个 Sensor 的硬件配置、Buffer 状态、回调函数 handle、enabled、batch_mode、buffer、hw_config

3.3.2 关键接口函数

以下接口函数是 Sensor HAL 适配的核心:

// 标准 Android HAL 接口
int (*activate)(struct sensors_poll_device_t *dev, int handle, int enabled);
int (*setDelay)(struct sensors_poll_device_t *dev, int handle, int64_t ns);
int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t *data, int count);
int (*batch)(struct sensors_poll_device_t *dev, int handle, int flags, int64_t period_ns, int64_t timeout);

// MTK 扩展接口
int (*mtk_sensor_set_batch)(struct sensors_poll_device_t *dev, int handle, int64_t period_ns, int64_t timeout);
int (*mtk_sensor_flush)(struct sensors_poll_device_t *dev, int handle);
int (*mtk_sensor_selftest)(struct sensors_poll_device_t *dev, int handle);
void (*mtk_sensor_dump)(struct sensors_poll_device_t *dev, int handle);
注意事项:poll 函数是数据上报的唯一入口,必须保证在 Sensor 使能后,poll 能够及时返回有效数据。如果使用 MTK 的 Buffer Manager,poll 内部应从环形 Buffer 中读取数据,而不是直接访问硬件寄存器。

3.4 MTK Sensor HAL 架构总览

下图展示了 MTK Sensor HAL 的整体架构,包括 Android 框架、HAL 层、内核驱动之间的数据流与控制流:

MTK Sensor HAL 架构总览 Android Framework MTK Sensor HAL 模块 sensors_module_t sensors_poll_device_t mtk_sensor_context_t Linux 内核 Sensor 驱动 Sensor 核心驱动 I2C/SPI 总线驱动 中断/定时器处理 Sensor 硬件(Accel/Gyro/Mag) 数据流:硬件 → 内核驱动 → HAL poll() → Android Framework

3.5 数据流与 Buffer 管理路径

下图展示了 Sensor 数据从硬件到 Android 框架的完整流动路径,重点突出 Buffer 管理环节:

Sensor 数据流与 Buffer 管理路径 硬件中断/DMA 内核驱动读取 HAL Buffer Manager (环形 Buffer) poll() Android Framework batch 配置 Buffer 管理关键点 1. 内核驱动通过中断或 DMA 将 Sensor 数据写入 HAL 的环形 Buffer 2. HAL Buffer Manager 负责 Buffer 的读写指针管理、溢出保护 3. poll() 从环形 Buffer 中取出数据,封装为 sensors_event_t 上报 4. batch 配置可调整 Buffer 刷新频率,实现功耗优化
实践要点:在移植过程中,需要重点关注 HAL Buffer Manager 的初始化与同步机制。如果内核驱动使用 DMA 直接填充 Buffer,必须确保 DMA 地址与 HAL 的 Buffer 地址一致,避免数据拷贝带来的性能损失。同时,环形 Buffer 的读写指针需要采用原子操作或锁保护,防止并发访问导致的数据错乱。