我们有一块基于 LS4046a 的板正在零下40摄氏度的温度箱中进行测试,系统已关闭,报告“温度过高”,如下所示。我在散热驱动器中添加了日志代码来报告关机时的确切温度,关机温度为 101 度,这让我们感到困惑,板的低温室低于 -40 摄氏度,为什么 TMU 报告了临界高温?
[2025-12-23 15:41:31.267] root@E7-2:~# [ 2435.041159] thermal thermal_zone0: ddr-controller:达到临界温度十六进制 0x18a88,十进制 101000,无符号 101000,正在关闭。
[2025-12-23 15:46:04.940] [ 2435.053636] 重新启动:硬件保护关闭(温度过高)
我与 AE 团队讨论了这个问题,请参阅他们的以下更新。
TMU 的指定测量范围为 0~110C。-40℃超出范围,寄存器值可能会被软件误读。
客户可参阅 AN12310 和 LSDK 用户指南第 11.3 章。
我还编写了一个脚本,在 -40C 环境下轮询温度寄存器(TRITSR0 - TRITSR4),大部分时间 V 位为 0(无效),但不时 V 位设置为 1(有效),当 V 位为 1 时,TEMP 字段显示高温,见下图,温度寄存器报告 0x65000080,其中 0x80 表示 V 位为 1,0x65 是温度值,十进制为 101 度。
temp_val=0x65000080, (temp_val& 0xff000000)=0x65000000, (temp_val& 0x000000ff)=0x00000080
为什么 TRITSR 寄存器的 V 位被设置为 -40C 下有效,从而误导软件读取无效温度?
请参阅 AE 团队提供的以下信息。
这不是错误,而是预期行为。
LS1046A TMU 的指定测量温度范围有限(约 0 °C 至 110 °C)。在 -40 °C 时,TMU 的工作温度超出其有效范围。
当温度超出范围时,TMU 仍会偶尔断言 V(有效)位,这意味着转换已完成,尽管转换结果没有物理意义。
与此同时,TMU 状态寄存器(TSR)中的 ORL(低电平超出范围)标志也会被确认。
如果软件仅检查 V=1 而忽略 ORL=1,它可能会将该值误解为正常温度(例如,0x65 → 101 °C),并触发错误的超温关机。
建议
在使用 TRITSR 温度值之前,请务必检查 ORL 标志。
如果 ORL=1,则将温度读数视为无效,与 V 位无关。
或者,推迟启用 TMU 监控,直到 SoC 温度恢复到有效范围内(≥0 °C)。
我检查了 ORL 位,似乎该位在检测超出范围的低温时并不可靠,如下所示
我的显卡在室温下运行,TMU 的温度约为 58 摄氏度。
root@E7-2:~# cat /sys/class/thermal/thermal_zone0/temp
58000
root@E7-2:~# cat /sys/class/thermal/thermal_zone1/temp
59000读取 TMU 模式寄存器 (TMR) 和 TMU 状态寄存器 (TSR),启用 TMU 模式并钳位 ORL
root@E7-2:~# devmem 0x1f00000 w
0xFFFF008C
root@E7-2:~# devmem 0x1f00004 w
0x000000A0然后我禁用了 TMU 监控模式,发现 ORL 已被清除
root@E7-2:~# devmem 0x1f00000 w
0xFFFF008C
root@E7-2:~# devmem 0x1f00000 w 0xFFFF000C #disable the monitoring mode
root@E7-2:~# devmem 0x1f00000 w
0xFFFF000C
root@E7-2:~# devmem 0x1f00004 w #ORL bit was cleared
0x00000020然后我重新启用了 TMU 监控模式,ORL 位又被钳位
root@E7-2:~# devmem 0x1f00000 w 0xFFFF008C
root@E7-2:~# devmem 0x1f00004 w
0x000000A0TMU 温度测量范围为 0-125°C。
RM 表示寄存器 ORL - 检测到超出范围的低温测量值。温度传感器检测到的温度读数低于 0 摄氏度的最低可测量温度。TMU监控(重新)启用后,该位将自动清零。
该卡处于室温下而不是环境低于 0 摄氏度,TMU 报告 56 摄氏度,而 ORL 仍然钳位 ORL 表明低温超出范围,这没有道理,为什么即使卡在室温下也钳位 ORL 位?如前面的评论所示,我重新启用了 TMU 监控,重新启用 TMU 监控模式后,ORL 位仍处于钳位状态。
这个问题有什么新进展吗? 上周,我们在另一种具有相同 CPU 的显卡上发现了同样的问题,我们想知道是否有解决方法,谢谢。
请参考我在 LS1046ARDB u-boot 上的验证结果。
=> mw 0x1f000000x00F8000C
=> mw 0x1f000000x00F8008C
=> md 0x1f00100 1
01f00100:25000080...%
=> md 0x1f00004 1
01f00004:00000000....
= md 0x1f00004 1 01f00004:00000000.... =>
请使用以下值配置寄存器0x1f00000。
=> mw 0x1f00000 0x00F8000C
=> mw 0x1f00000 0x00F8008C
将 TMU 寄存器的 RESERVED 位(bits21 ~ bit31)设置为 0 似乎可以清除我的卡上的 ORL 位。如果这些保留位为 1,则无法清除 ORL,不知道为什么。总之,我会在 TMU 驱动程序中将这些位初始化为 0,然后在读取温度之前检查 ORL 位。谢谢
是的,谢谢,我做到了,而且将再次进行 -40C 下的热测试,以检验代码的更改,希望它能通过测试。