Rockchip TSADC 驱动实现

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
2
3
4
5
channels: 0..6
count: 7
table mode: ADC_INCREMENT
data mask: 9-bit TSADCV4 mask
default chip TSHUT: 95°C, GPIO/OTP active-low

但 DTS显式覆盖为 120°C、mode 0 CRU、active-low,因此实际公共 DTS配置不是 chip默认95°C GPIO。

3. 转换表

RK3588 calibration points:

1
2
3
4
code 215 -> -40°C
code 285 -> 25°C
code 350 -> 85°C
code 395 -> 125°C

驱动在相邻点间整数线性插值,并校验范围。它不是简单固定斜率。

4. Probe

1
2
3
4
5
6
7
8
9
10
11
12
match compatible
-> allocate data
-> map MMIO/get IRQ
-> clocks/reset/GRF/pinctrl
-> parse TSHUT properties
-> reset and initialize TSADC
-> OTP/trim configuration
-> register 7 OF thermal sensors
-> request threaded IRQ
-> program TSHUT
-> enable channels/controller
-> panic notifier

5. get_temp

zone callback:

1
2
3
4
5
read channel data register
-> mask
-> code_to_temp table/interpolation
-> subtract sensor trim temperature
-> milli-Celsius

无效 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温度用于故障分析。

文章互动

阅读 --

留言

0 条留言

正在加载留言…