Rockchip TSADC 驱动实现
1. 数据结构
rockchip_tsadc_chip 描述 SoC差异:
- channel ids/count;
- conversion table;
- conversion time/trim;
- TSHUT默认;
- initialize/control/irq_ack;
- get_temp/set_alarm/set_tshut/mode。
rockchip_thermal_data 保存 MMIO、clocks、reset、GRF和 sensors。
2. RK3588数据
1 | channels: 0..6 |
但 DTS显式覆盖为 120°C、mode 0 CRU、active-low,因此实际公共 DTS配置不是 chip默认95°C GPIO。
3. 转换表
RK3588 calibration points:
1 | code 215 -> -40°C |
驱动在相邻点间整数线性插值,并校验范围。它不是简单固定斜率。
4. Probe
1 | match compatible |
5. get_temp
zone callback:
1 | read channel data register |
无效 code返回错误,不能当0°C。
6. set_trips
Thermal Core给 low/high window;driver忽略 low,将 high + trim_temp 转换为 alarm code并写 comparator。超范围时按实现禁用/设置边界,IRQ用于及时 update。
7. IRQ
threaded handler:
- ack pending;
- 对各 sensor调用
thermal_zone_device_update(); - Core重算 trips/governor;
-重新编程 alarm。
8. TSHUT
每 channel写 shutdown comparator,并配置 route:
- CRU:硬件复位;
- GPIO/OTP:输出到 PMIC。
这条链不依赖 Linux调度,是 critical软件保护失效后的最后防线。
9. Trim
驱动读取 OTP/NVMEM相关 trim配置并换算为温度修正。读取温度时减去 trim_temp;写 alarm和 TSHUT硬件阈值时则把 trim加回,保持对外温度语义一致。缺失/非法 trim应回退而非随机修正。
10. PM
suspend关闭 sensors/controller/clocks;resume reset、重新 initialize、恢复 TSHUT/alarm并启用。panic notifier打印各 channel温度用于故障分析。