工具/软件:
您好、 Nick Saulnier、
较新的 AM62A 看门狗驱动程序支持加电存储器区域、该区域用于获取重新启动原因。
是否可以在 AM62A 上使用此功能、如果可以、我需要进行哪些更改才能使用这些功能?
我需要在应用程序中使用重新启动原因、并希望使用此机制来获取它。
此致、
Bas Vermeulen
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
您好、 Nick Saulnier、
较新的 AM62A 看门狗驱动程序支持加电存储器区域、该区域用于获取重新启动原因。
是否可以在 AM62A 上使用此功能、如果可以、我需要进行哪些更改才能使用这些功能?
我需要在应用程序中使用重新启动原因、并希望使用此机制来获取它。
此致、
Bas Vermeulen
如果我正确理解 RTI_WDT 驱动程序、则可以使用加电内存区域来获取重新启动原因(至少这是它在驱动程序中的用途)。
我需要知道为什么电路板会重新启动、以跟踪看门狗复位的次数。 我想使用看门狗驱动程序来实现这一点、最好不要实际触发看门狗。
为此、需要在我的器件树中配置加电存储器区域。 我没有看到这是为 AM62A 配置的、并且不确定是否需要在引导加载程序中提供额外的支持来实现这种情况。
我希望澄清如何为 AM62A 配置上电存储器区域、以及需要在引导加载程序和器件树中进行哪些更改(如果有)才能使其正常工作。
此致、
Bas Vermeulen
您好、Bas、
感谢您发送编修。
看门狗驱动程序 代码
我假设您参考的是 RTI_WDT_PROBE 函数的这一部分:
node = of_parse_phandle(pdev->dev.of_node, "memory-region", 0); if (node) { ... /* * If reserved memory is defined for watchdog reset cause. * Readout the Power-on(PON) reason and pass to bootstatus. */ paddr = res.start; reserved_mem_size = resource_size(&res); ... vaddr = memremap(paddr, reserved_mem_size, MEMREMAP_WB); if (!vaddr) { dev_err(dev, "Failed to map memory-region.\n"); ret = -ENOMEM; goto err_iomap; } if (vaddr[0] == PON_REASON_SOF_NUM && vaddr[1] == PON_REASON_MAGIC_NUM && vaddr[2] == PON_REASON_EOF_NUM) { wdd->bootstatus |= WDIOF_CARDRESET; } memset(vaddr, 0, reserved_mem_size); memunmap(vaddr);
和绑定文档中定义的存储器区域:
https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/Documentation/devicetree/bindings/watchdog/ti,rti-wdt.yaml?h=ti-linux-6.12.y#n37
南... 这将需要一点时间进行研究。 一目了然、我实际上没有看到 DDR 中这种任意内存分配的效果。
首先、在探测函数中、我们可以看到驱动程序仅查找12个特定字节、这些字节应该指示看门狗复位。 如果存储器区域中有任何其他值、则不会更新 BOOTSTATUS。 因此、它只能判断是否发生了看门狗复位、而不是任何其他复位源。
但其他一些驱动程序代码需要知道、用户分配了该特定的 DDR 区域以保存复位值、然后在看门狗复位事件期间将12个魔术字节写入 DDR 区域。 我没有看到内存区域在任何地方使用、因此我不知道这12个字节最初是如何写入 DDR 的。
我可能会遗漏一些东西。 我正在与其他团队成员联系、征求他们的意见。
查看复位原因的其他选项
TRM 的这一部分是否描述了您要寻找的功能?
"复位源状态寄存器"
寄存器 WKUP_CTRL_MMR1_RST_SRC
此致、
Nick
您好、Nick、
是的、这就是我正在查看的看门狗驱动程序代码。 我需要知道是否对我的其中一项要求/功能进行了看门狗重置、如果它(应该)正常运行、这将符合要求。
寄存器 WKUP_CTRL_MMR1_RST_SRC 是我当前与 devmem2一起用于获取复位状态的寄存器。 这可以从命令行进行操作,但我希望用户空间可以随时使用(无需在我的应用程序中重新创建 devmem2 )。
另一种选择是从 u-boot 读取它并使用重新启动原因更新我的内核命令行。
此致、
Bas Vermeulen
您好、Bas、
更多信息
好的、"DDR 存储器区域"实现看起来是专门针对 AM65x 的权变措施、因为它没有具有复位原因的寄存器、如 AM62、AM62A、AM64等 我们能够找到的一些背景:
https://lore.kernel.org/lkml/20230713095127.1230109-1-huaqian.li@siemens.com/
https://github.com/siemens/k3-rti-wdt/issues/1
据我所知、似乎没有用于读取 RST_SRC 中所有值的通用 Linux 驱动程序。
如果您只需要知道看门狗是否是导致上次热复位的原因、并且您可以很好地抵御一些内核黑客攻击、似乎这个只读寄存器的看门狗位的功能是在 AM335x 驱动程序 OMAP_WDT.c 的探测函数中实现的。 您可以在这里找到一些早期的讨论: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/896469/am3352-reason-for-last-reboot
需要注意的事项
如果您对代码进行编程以与此寄存器进行交互、需要注意以下事项:
1)位值在重新引导后持续存在。 因此、每次从 RST_SRC 寄存器读取一个位时、您都需要在读取该位后将其清除(通过向正在处理的该特定位写入1)。 否则、您可以在以后的靴子上获得误报。
2)只能写入 MCU 域中的寄存器,而不能写入 WKUP 域中的影子寄存器。
我今天针对 AM62Ax TRM 提交了几个错误、因为"复位源状态寄存器"一节的寄存器名称错误、并指出寄存器位于 MCU 和 MAIN 域中、而不是 MCU 和 WKUP 域中。 在 AM62Ax TRM 的当前版本中、您要查找的寄存器是 MCU_CTRL_MMR0_RST_SRC 和 WKUP_CTRL_MMR0_RST_SRC
您可以在此处找到我运行的直接读取和写入 AM62x 上寄存器的测试:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1512681/am623-reset-reason-not-available-in-sdk/5826267#5826267
此致、
Nick