2. Sensor驱动基础概念

在MTK平台进行Sensor驱动移植与Buffer管理适配之前,必须扎实理解Sensor的基础概念。本章将系统梳理Sensor类型、通信协议、数据读取模式以及数据输出格式,为后续的驱动框架分析和代码移植打下坚实基础。

2.1 Sensor类型与工作原理

移动设备中常见的MEMS(微机电系统)Sensor主要分为以下几类,它们在物理原理、输出特性和驱动适配关注点上存在显著差异:

Sensor类型 物理原理 典型输出 驱动适配关注点
加速度计 电容式/压阻式,检测质量块位移 X/Y/Z轴加速度 (m/s² 或 g) 量程配置、低功耗模式、FIFO水位
陀螺仪 科里奥利效应,检测角速度 X/Y/Z轴角速度 (rad/s 或 °/s) 零偏校准、温度补偿、ODR配置
磁力计 霍尔效应/磁阻效应,检测地磁场 X/Y/Z轴磁场强度 (μT) 硬磁/软磁校准、磁干扰抑制
气压计 压阻式,检测气压变化 气压 (hPa) 和温度 (°C) 高精度ADC、温度补偿算法
接近/环境光 红外反射/光电二极管 距离 (cm) 和照度 (lux) 红外LED驱动、阈值中断配置
MTK平台提示: 在MTK平台上,加速度计和陀螺仪通常以组合方式出现(6轴IMU),驱动适配时需要同时处理两个Sensor的寄存器映射和同步时序。磁力计则常作为独立器件挂载在另一条I2C总线上,以减少电磁干扰。

2.2 I2C与SPI通信协议

Sensor与主控SoC之间的物理通信链路,在MTK平台上以I2C为主流,SPI用于高带宽场景。两种协议在驱动开发中的关键差异如下:

对比维度 I2C SPI
总线拓扑 双线(SDA + SCL),多主多从 四线(MOSI + MISO + SCLK + CS),一主多从
传输速率 标准100kHz / 快速400kHz / 高速3.4MHz 通常10MHz~50MHz,取决于器件
从机选择 7位或10位地址,软件寻址 硬件CS片选线,低电平有效
数据方向 半双工,主设备控制时钟 全双工,主设备提供时钟
驱动复杂度 需处理ACK/NACK、时钟拉伸、重复起始条件 需管理CS时序、时钟极性和相位
MTK适配接口 mtk_i2c_transfer() + DTS配置 spi_sync_transfer() + DTS配置
驱动开发要点: 在MTK平台上,I2C通信的时序参数(如上升时间、保持时间)需要在DTS中通过clock-frequency和i2c-scl-rising-time-ns等属性精确配置。SPI通信则需关注spi-max-frequency和spi-cpol/spi-cpha的匹配。

以下是一个典型的I2C读写时序SVG图,展示了Sensor驱动中最常用的寄存器读写流程:

I2C Sensor寄存器读写时序 I2C Sensor寄存器读写时序 START + 从机地址 寄存器地址 写入数据 STOP 写操作:主设备发送从机地址(W) → 寄存器地址 → 数据字节 START + 从机地址 寄存器地址 重复START + 地址(R) 读取数据 读操作:写寄存器地址 → 重复START → 切换为读模式 → 读取数据 注意:重复START(Sr)是I2C读操作的关键,避免了总线释放后被其他主设备抢占 MTK平台通过 mtk_i2c_transfer() 的 msg 数组自动处理重复START

2.3 中断模式与轮询模式

Sensor数据的读取方式直接影响系统功耗和响应延迟。MTK平台支持两种主流模式,驱动开发时需要根据应用场景选择:

  • 轮询模式(Polling): 内核定时器周期性触发,通过I2C/SPI读取Sensor数据寄存器。
    • 优点:实现简单,无需硬件中断引脚,调试方便。
    • 缺点:CPU持续占用,功耗较高;数据采样存在定时器抖动。
    • 适用场景:低速率Sensor(如温度、气压),或系统休眠时不需工作的Sensor。
  • 中断模式(Interrupt): Sensor内部事件(数据就绪、阈值触发、FIFO水位)通过INT引脚唤醒SoC。
    • 优点:CPU可进入深度睡眠,仅在数据就绪时唤醒,功耗极低。
    • 缺点:需要硬件中断引脚分配,中断服务函数需短小精悍。
    • 适用场景:加速度计/陀螺仪的高频数据流,手势识别、计步器等实时应用。
MTK平台注意事项: 在MTK平台上,中断模式需要特别注意GPIO的电气特性配置(上拉/下拉、驱动能力)以及中断触发类型(上升沿/下降沿/电平触发)。错误的GPIO配置会导致中断丢失或误触发,严重影响Sensor数据质量。

以下SVG图展示了中断模式与轮询模式在MTK平台上的数据流对比:

中断模式与轮询模式数据流对比 中断模式 vs 轮询模式 数据流对比 轮询模式 内核定时器 I2C读取数据 数据上报 CPU持续占用 定时器周期:5ms~200ms,CPU无法深度休眠 中断模式 Sensor数据就绪 INT引脚触发 唤醒CPU 读取+休眠 中断触发后快速读取,CPU可深度休眠

2.4 Sensor数据输出格式

不同Sensor的数据输出格式在驱动层需要统一处理,MTK平台使用Linux内核的IIO(Industrial I/O)子系统或Input子系统来标准化数据输出。以下是常见的数据格式:

数据格式 位宽 编码方式 典型示例 驱动处理要点
原始ADC值 12~24位 二进制补码 加速度计输出 0x0FF0(4096) 需根据量程转换为物理单位
物理单位值 16/32位浮点 IEEE 754 / 定点 陀螺仪输出 25.36 °/s 注意字节序(大端/小端)
FIFO批量数据 可变 连续帧格式 每帧6字节(X/Y/Z各16位) 需解析帧头、时间戳、校验
事件数据 可变 键值对 接近Sensor输出 0(远离)/ 1(接近) 通过Input子系统上报EV_KEY
MTK平台数据格式适配: 在MTK平台上,Sensor驱动通常通过struct iio_chan_spec定义每个数据通道的格式,包括type(IIO_ACCEL、IIO_ANGL_VEL等)、info_mask_separate(BIT(IIO_CHAN_INFO_RAW)等)和scan_type(位宽、对齐方式)。Buffer管理适配时,需要确保scan_type与硬件寄存器布局完全一致。

以下是一个典型的加速度计数据读取代码片段,展示了从原始寄存器值到物理单位的转换过程:

/* 加速度计数据读取与转换示例 */
#define ACCEL_SENSITIVITY_2G  16384  /* LSB/g,量程±2g时 */
#define ACCEL_SENSITIVITY_4G  8192   /* LSB/g,量程±4g时 */
#define ACCEL_SENSITIVITY_8G  4096   /* LSB/g,量程±8g时 */
#define ACCEL_SENSITIVITY_16G 2048   /* LSB/g,量程±16g时 */

static int accel_read_raw(struct iio_dev *indio_dev,
                          struct iio_chan_spec const *chan,
                          int *val, int *val2, long mask)
{
    struct accel_data *data = iio_priv(indio_dev);
    int ret;
    u16 raw_val;

    switch (mask) {
    case IIO_CHAN_INFO_RAW:
        /* 通过I2C读取16位原始数据 */
        ret = regmap_bulk_read(data->regmap, chan->address,
                               &raw_val, sizeof(raw_val));
        if (ret < 0)
            return ret;

        /* 转换为二进制补码 */
        *val = (s16)le16_to_cpu(raw_val);
        return IIO_VAL_INT;

    case IIO_CHAN_INFO_SCALE:
        /* 返回灵敏度值,用户空间计算物理值 */
        *val = 0;
        *val2 = data->sensitivity;  /* 如16384 */
        return IIO_VAL_FRACTIONAL;

    default:
        return -EINVAL;
    }
}
字节序注意事项: 大多数MEMS Sensor使用小端字节序(Little-Endian),但部分器件(如某些Bosch Sensor)使用大端字节序。在MTK平台上,务必使用le16_to_cpu()或be16_to_cpu()进行显式转换,避免在不同架构(ARM通常是LE)上出现数据错误。

2.5 本章小结

本章涵盖了Sensor驱动开发的核心基础概念:

  • Sensor类型: 加速度计、陀螺仪、磁力计等,各自有不同的物理原理和驱动适配要点。
  • 通信协议: I2C和SPI在MTK平台上的时序要求、DTS配置和驱动接口差异。
  • 数据读取模式: 中断模式与轮询模式的功耗和延迟权衡,MTK平台GPIO中断配置要点。
  • 数据输出格式: 原始ADC值、物理单位值、FIFO批量数据的处理方式,以及IIO子系统的通道定义方法。