4. Sensor上电时序要求:Datasheet解读、Power-up Sequence Diagram、时序参数(t1/t2/t3)
Sensor上电时序是驱动移植中最容易被忽视、却最容易导致“设备无响应”或“首次读数异常”的环节。Datasheet中的Power-up Sequence Diagram和时序参数表(t1/t2/t3)是唯一权威依据。本节将拆解如何从Datasheet中提取关键时序约束,并将其转化为骁龙平台BSP代码中的具体实现。
4.1 Datasheet时序图解读方法
绝大多数Sensor Datasheet会提供一张类似下图的Power-up Sequence Diagram。解读这张图的核心是识别三个关键信号:VDD(主电源)、VDDIO(IO电源)、RESET_N(复位信号)或EN(使能信号)。
4.2 时序参数t1/t2/t3详解
时序参数是驱动代码中msleep()或usleep_range()的直接依据。不同厂商、不同型号的Sensor,其t1/t2/t3的典型值和最大值差异很大。下表汇总了常见Sensor的时序参数范围:
| 参数 | 定义 | 典型值范围 | 常见Sensor示例 | 驱动实现要点 |
|---|---|---|---|---|
| t1 | VDD稳定 → VDDIO开始上升 | 0 ~ 1 ms | BMI160, LSM6DSO | 通常可忽略,但部分Sensor要求严格顺序 |
| t2 | VDDIO稳定 → RESET_N释放 | 0.1 ~ 10 ms | ICM-20948, MPU6050 | 必须确保VDDIO完全稳定后再释放复位 |
| t3 | RESET_N释放 → 通信就绪 | 1 ~ 100 ms | BME280, SHT30 | 包含内部校准/初始化,需等待足够时间 |
4.3 骁龙平台上电时序代码实现
在骁龙平台BSP中,Sensor上电时序通常实现在probe()函数或power_up()回调中。以下是一个基于Datasheet时序参数的标准实现模板:
static int sensor_power_up(struct sensor_device *sdev)
{
int ret;
/* Step 1: 使能VDD主电源 */
ret = regulator_enable(sdev->vdd_reg);
if (ret) {
dev_err(sdev->dev, "Failed to enable VDD\n");
return ret;
}
/* t1: 等待VDD稳定,典型值0.5ms,使用最大值1ms */
usleep_range(1000, 1200);
/* Step 2: 使能VDDIO IO电源 */
ret = regulator_enable(sdev->vddio_reg);
if (ret) {
dev_err(sdev->dev, "Failed to enable VDDIO\n");
regulator_disable(sdev->vdd_reg);
return ret;
}
/* t2: 等待VDDIO稳定,Datasheet要求2ms */
usleep_range(2000, 2500);
/* Step 3: 释放RESET_N引脚(低电平有效,先拉高) */
gpiod_set_value_cansleep(sdev->reset_gpio, 1);
/* t3: 等待Sensor内部初始化完成,Datasheet最大值10ms */
msleep(20);
/* Step 4: 验证通信就绪(读取WHO_AM_I寄存器) */
ret = sensor_check_id(sdev);
if (ret) {
dev_err(sdev->dev, "Sensor ID mismatch after power-up\n");
sensor_power_down(sdev);
return ret;
}
return 0;
}
4.4 时序参数与GPIO/Regulator的映射关系
在骁龙平台设备树(DTS)中,需要将时序参数与硬件资源正确关联。以下是一个典型的DTS配置片段:
/* 设备树中Sensor节点示例 */
sensor@68 {
compatible = "vendor,sensor-model";
reg = <0x68>;
/* 电源资源 */
vdd-supply = <&pm8150_l5>; /* VDD 主电源 */
vddio-supply = <&pm8150_l6>; /* VDDIO IO电源 */
/* GPIO资源 */
reset-gpios = <&tlmm 42 GPIO_ACTIVE_LOW>;
irq-gpios = <&tlmm 43 GPIO_ACTIVE_HIGH>;
/* 时序参数(可选,用于驱动内部配置) */
power-up-delay-ms = <20>; /* t3 安全裕量 */
vddio-stable-us = <2500>; /* t2 实际等待时间 */
};
4.5 上电时序故障排查清单
当Sensor在上电后出现无响应、ID读取失败或数据异常时,按以下清单逐一排查:
- 检查电源域顺序: 使用示波器测量VDD和VDDIO的上升沿,确认t1是否满足Datasheet要求。骁龙平台中,若两个regulator来自不同PMIC,可能存在上电顺序差异。
- 验证复位信号: 确认RESET_N的释放时间点是否在VDDIO稳定之后。部分Sensor要求RESET_N在VDDIO达到90%之后至少保持低电平1ms。
- 确认t3等待时间: 在驱动中增加调试打印,记录从RESET_N释放到首次通信成功的时间差。若接近t3边界值,应增加安全裕量。
- 检查GPIO默认状态: 在probe()之前,RESET_N GPIO可能被Bootloader或前一驱动设置为异常状态。建议在probe()入口处强制设置GPIO为安全状态。
- 验证regulator负载能力: 若Sensor瞬间电流较大,可能导致VDD电压跌落,延长上升时间。检查regulator的负载规格是否满足Sensor峰值电流需求。
trace_printk或ftrace记录regulator_enable和gpiod_set_value的时间戳,精确分析上电时序是否满足Datasheet要求。配合示波器测量,可以快速定位时序偏差。
4.6 特殊场景:多电源域Sensor的时序处理
部分高端Sensor(如ToF传感器、多光谱传感器)可能包含三个或更多电源域(VDD、VDDIO、VDD_A、VDD_D等)。此时时序图更加复杂,需要关注以下要点:
- 电源域分组: 将电源域按上电顺序分组,每组内部可以同时使能,组间必须顺序执行。
- 中间状态检查: 部分Sensor在某个电源域稳定后,会输出一个“Power Good”信号,驱动应等待该信号后再进行下一步。
- 下电顺序: 上电时序的逆序通常就是下电顺序。下电时,应先关闭IO电源,再关闭主电源,避免电流倒灌损坏Sensor。
4.7 本章小结
Sensor上电时序是驱动移植的“第一道关卡”。正确解读Datasheet中的Power-up Sequence Diagram,准确提取t1/t2/t3参数,并在骁龙平台BSP代码中精确实现,是确保Sensor正常工作的基础。建议在驱动开发阶段,使用示波器实际测量上电波形,与Datasheet时序图进行比对,以验证实现的正确性。