2. RK平台Sensor硬件接口:I2C/SPI/GPIO接口规范、Sensor供电与复位时序、中断引脚配置要求

在RK平台进行Sensor驱动移植时,硬件接口的规范理解是驱动正确运行的基础。本章将深入剖析Sensor与主控SoC之间的物理连接方式,涵盖I2C/SPI/GPIO三大接口的电气特性与协议规范、Sensor供电与复位时序要求,以及中断引脚的配置策略。掌握这些内容,能有效避免硬件适配阶段的低级错误,为后续驱动性能优化打下坚实基础。

2.1 I2C/SPI/GPIO接口规范

RK平台Sensor通常通过I2C或SPI总线进行寄存器配置与数据读取,GPIO则用于中断通知、使能控制及电源管理。不同接口在速率、引脚数、功耗和适用场景上存在显著差异。

接口选型核心原则: 高数据吞吐量Sensor(如摄像头、高帧率陀螺仪)优先选择SPI;低功耗、引脚受限场景(如接近传感器、温湿度传感器)优先选择I2C;GPIO用于异步事件通知与电源控制。

2.1.1 I2C接口规范

I2C是RK平台Sensor最常用的控制总线,采用两线制(SCL时钟线、SDA数据线)半双工通信。RK SoC的I2C控制器支持标准模式(100kHz)、快速模式(400kHz)和高速模式(3.4MHz),实际速率需根据Sensor数据手册与PCB走线长度综合确定。

参数 标准模式 快速模式 高速模式
SCL频率 100 kHz 400 kHz 3.4 MHz
上拉电阻 4.7 kΩ 2.2 kΩ 1.0 kΩ
最大总线电容 400 pF 400 pF 100 pF
从机地址位宽 7 bit / 10 bit 7 bit / 10 bit 7 bit / 10 bit
RK平台适配要点: 在设备树中配置I2C频率时,需同时考虑Sensor侧支持的最大频率与RK SoC I2C控制器的分频系数。建议在驱动初始化阶段通过i2c_check_functionality校验控制器能力。

I2C通信时序包含起始条件、从机地址+读写位、应答位、数据字节和停止条件。RK平台DMA引擎支持I2C多字节传输,可显著降低CPU占用率。

// 设备树中I2C节点配置示例
&i2c1 {
    status = "okay";
    clock-frequency = <400000>;  // 400kHz快速模式
    pinctrl-names = "default";
    pinctrl-0 = <&i2c1m0_xfer>;

    sensor_gyro: gyro@68 {
        compatible = "rkhw,gyro-sensor";
        reg = <0x68>;           // 7位从机地址
        interrupt-parent = <&gpio0>;
        interrupts = <RK_PB2 IRQ_TYPE_EDGE_RISING>;
        vdd-supply = <&vcc_3v3>;
        vio-supply = <&vcc_1v8>;
    };
};

2.1.2 SPI接口规范

SPI接口采用四线制(SCLK、MOSI、MISO、CS),全双工通信,适用于需要高速数据流传输的Sensor,如6轴惯性测量单元(IMU)或高分辨率磁力计。RK平台SPI控制器支持主从模式,时钟极性(CPOL)和相位(CPHA)可配置,最大速率可达50MHz。

常见陷阱: SPI模式不匹配是驱动移植中最常见的问题之一。CPOL=0/CPHA=0(模式0)和CPOL=1/CPHA=1(模式3)是Sensor最常用的两种模式,务必与数据手册严格对齐。

SPI通信的典型时序要求包括:CS低电平有效建立时间、数据采样沿对齐、以及CS释放后的最小空闲时间。RK平台通过SPI控制器内部的FIFO和DMA支持,可实现零CPU干预的批量数据传输。

// 设备树中SPI节点配置示例
&spi2 {
    status = "okay";
    max-freq = <10000000>;     // 10MHz
    cs-gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_LOW>;

    sensor_accel: accel@0 {
        compatible = "rkhw,accel-sensor";
        reg = <0>;              // CS片选索引
        spi-max-frequency = <10000000>;
        spi-cpha;               // CPHA=1
        spi-cpol;               // CPOL=1 (模式3)
        interrupt-parent = <&gpio1>;
        interrupts = <RK_PA3 IRQ_TYPE_EDGE_FALLING>;
    };
};

2.1.3 GPIO接口规范

GPIO在Sensor系统中承担多重角色:中断请求输入、复位输出、电源使能、以及低速数据模拟。RK SoC的GPIO控制器支持内部上拉/下拉、驱动能力配置(2mA/4mA/8mA/12mA)以及中断触发类型(上升沿、下降沿、高电平、低电平)。

GPIO功能 方向 典型配置 注意事项
中断输入 输入 上拉+下降沿触发 避免浮空导致误中断
复位输出 输出 推挽输出,低电平有效 复位脉宽需满足Sensor要求
电源使能 输出 推挽输出,高电平有效 需考虑电源上电斜率
数据模拟 输入/输出 开漏+外部上拉 仅用于低速单线协议
RK平台Sensor硬件接口连接架构 RK SoC I2C/SPI控制器 GPIO控制器 I2C (SCL/SDA) SPI (SCLK/MOSI/MISO/CS) GPIO (INT/RST/EN) Sensor A I2C 从机 GPIO中断 VDD/VIO供电 Sensor B SPI 从机 GPIO复位 VDD/VIO供电 PMIC / LDO VDD_3V3 / VIO_1V8 供电轨 中断引脚需配置内部上拉,避免浮空导致误触发

2.2 Sensor供电与复位时序

Sensor的供电与复位时序直接影响芯片内部状态机的初始化正确性。时序不满足可能导致Sensor无法识别、寄存器读写异常或数据输出错误。RK平台通过PMIC(电源管理芯片)或LDO为Sensor提供独立供电轨,并通过GPIO控制复位信号。

2.2.1 供电时序要求

多数Sensor需要两路供电:VDD(主电源,通常为2.8V~3.6V)和VIO(I/O接口电源,通常为1.8V或3.3V)。上电顺序要求VDD先于VIO建立,或两者同时上升;下电顺序则相反,VIO先于VDD掉电。时序窗口通常要求在0~10ms内完成。

供电轨 典型电压 上电顺序 下电顺序 纹波要求
VDD 2.8V / 3.3V 第1位 第2位 < 50 mVpp
VIO 1.8V / 3.3V 第2位(或同时) 第1位 < 30 mVpp
驱动实现建议: 在设备树中通过vdd-supply和vio-supply属性绑定regulator框架,驱动初始化时调用regulator_enable按序上电。RK平台的regulator框架会自动处理供电依赖关系。

2.2.2 复位时序规范

复位信号用于将Sensor内部寄存器恢复到默认状态。复位方式分为硬件复位(通过GPIO拉低RST引脚)和软件复位(通过I2C/SPI写入复位寄存器)。硬件复位时序要求包括:复位低电平保持时间(通常≥1μs)、复位释放后的稳定等待时间(通常≥5ms)。

// 硬件复位时序实现示例
static int sensor_hardware_reset(struct sensor_device *sensor)
{
    // 拉低复位引脚
    gpiod_set_value(sensor->reset_gpio, 0);
    // 保持低电平至少1ms(满足Sensor要求)
    usleep_range(1000, 2000);
    // 释放复位
    gpiod_set_value(sensor->reset_gpio, 1);
    // 等待内部初始化完成(数据手册要求5ms)
    msleep(5);
    
    // 复位后需重新配置寄存器
    return sensor_init_registers(sensor);
}
Sensor供电与复位时序图 VDD 上升沿 VIO 上升沿(滞后VDD) RST 低电平保持 ≥1ms t0 t1 t VDD稳定后至少等待5ms 再释放RST

2.3 中断引脚配置要求

中断引脚是Sensor向SoC报告数据就绪、事件触发或错误状态的关键信号线。正确的中断配置能实现低功耗轮询替代方案,显著降低系统功耗。RK平台GPIO中断控制器支持多种触发类型,并可通过pinctrl子系统进行引脚复用与电气特性配置。

2.3.1 中断触发类型选择

不同Sensor的中断输出特性各异,需根据数据手册选择匹配的触发类型。常见中断类型包括:

  • 上升沿触发: Sensor在事件发生时将引脚从低电平拉高,适用于推挽输出型中断。
  • 下降沿触发: Sensor在事件发生时将引脚从高电平拉低,适用于开漏输出型中断(需外部上拉)。
  • 电平触发(高/低): 中断信号持续有效直到被清除,适用于需要锁存中断状态的Sensor。
电平触发注意事项: 使用电平触发时,中断服务程序(ISR)必须清除Sensor内部的中断状态寄存器,否则会导致中断反复触发,造成CPU软锁。建议优先使用边沿触发以减少ISR复杂度。

2.3.2 中断引脚电气配置

中断引脚的电气特性直接影响信号完整性。RK平台通过pinctrl配置GPIO的驱动能力、上下拉状态和施密特触发器使能。对于开漏输出的中断引脚,必须使能内部上拉或添加外部上拉电阻(典型值4.7kΩ~10kΩ)。

// 设备树中中断引脚pinctrl配置
pinctrl: pinctrl {
    sensor_int: sensor-int {
        rockchip,pins =
            <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>;  // 上拉输入
    };
};

// 驱动中中断申请示例
static int sensor_probe(struct platform_device *pdev)
{
    struct device *dev = &pdev->dev;
    struct sensor_device *sensor = dev_get_drvdata(dev);
    
    // 获取中断号
    sensor->irq = platform_get_irq(pdev, 0);
    if (sensor->irq < 0)
        return sensor->irq;
    
    // 申请中断,使用线程化IRQ避免在ISR中执行耗时操作
    ret = devm_request_threaded_irq(dev, sensor->irq,
                    NULL, sensor_irq_handler,
                    IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
                    "sensor_int", sensor);
    if (ret) {
        dev_err(dev, "Failed to request irq %d\n", sensor->irq);
        return ret;
    }
    
    return 0;
}

2.3.3 中断共享与优先级

在RK平台中,多个Sensor可能共享同一中断线(通过GPIO Bank的共享中断机制)。此时需在中断处理函数中轮询各Sensor的中断状态寄存器以确定中断源。中断优先级方面,Sensor中断通常配置为普通IRQ,避免在实时性要求极高的场景下使用FIQ(快速中断)。

中断类型 触发方式 适用场景 ISR要求
边沿触发 上升沿/下降沿 数据就绪、单次事件 快速响应,无需清除状态
电平触发 高电平/低电平 错误报警、持续状态 必须清除Sensor状态寄存器
共享中断 任意 多Sensor共用GPIO 需轮询确认中断源
中断引脚配置流程 读取数据手册 选择触发类型 配置pinctrl 申请IRQ 边沿触发:上升沿/下降沿 上拉/下拉/驱动能力 关键检查点 中断引脚电平与Sensor输出类型匹配 | 上拉电阻值正确 | 中断号在设备树中正确映射
中断性能优化要点:
  • 使用devm_request_threaded_irq配合IRQF_ONESHOT标志,将中断处理下半部放入内核线程,避免在原子上下文中执行I2C/SPI读写。
  • 对于高频率中断(如加速度计FIFO满中断),考虑使用RK平台的硬中断+tasklet组合,减少线程切换开销。
  • 在设备树中通过interrupts-extended属性指定中断控制器和触发类型,确保与GPIO Bank的映射正确。