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则用于中断通知、使能控制及电源管理。不同接口在速率、引脚数、功耗和适用场景上存在显著差异。
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 |
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通信的典型时序要求包括: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要求 |
| 电源使能 | 输出 | 推挽输出,高电平有效 | 需考虑电源上电斜率 |
| 数据模拟 | 输入/输出 | 开漏+外部上拉 | 仅用于低速单线协议 |
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);
}
2.3 中断引脚配置要求
中断引脚是Sensor向SoC报告数据就绪、事件触发或错误状态的关键信号线。正确的中断配置能实现低功耗轮询替代方案,显著降低系统功耗。RK平台GPIO中断控制器支持多种触发类型,并可通过pinctrl子系统进行引脚复用与电气特性配置。
2.3.1 中断触发类型选择
不同Sensor的中断输出特性各异,需根据数据手册选择匹配的触发类型。常见中断类型包括:
- 上升沿触发: Sensor在事件发生时将引脚从低电平拉高,适用于推挽输出型中断。
- 下降沿触发: Sensor在事件发生时将引脚从高电平拉低,适用于开漏输出型中断(需外部上拉)。
- 电平触发(高/低): 中断信号持续有效直到被清除,适用于需要锁存中断状态的Sensor。
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 | 需轮询确认中断源 |
- 使用
devm_request_threaded_irq配合IRQF_ONESHOT标志,将中断处理下半部放入内核线程,避免在原子上下文中执行I2C/SPI读写。 - 对于高频率中断(如加速度计FIFO满中断),考虑使用RK平台的硬中断+tasklet组合,减少线程切换开销。
- 在设备树中通过
interrupts-extended属性指定中断控制器和触发类型,确保与GPIO Bank的映射正确。