PhyCORE-AM335x-PD13.1.2 Linux 3.2上的最后重启检测

时间:2014-11-21 02:45:29

标签: linux driver embedded-linux cpu-registers watchdog

在sitara AM3359上使用BSP linux 3.2的嵌入式系统中,在应用程序启动时,我想检测导致上次重启的原因并将此状态保存在两个计数器之一:看门狗复位和上电复位。 / p>

  1. 通常在MCU中,我通过在ram中保留spot并在第一次启动时写入特殊键并使用看门狗复位来测试看门狗。如果不是那里重新启动它的电源打开,如果它在那里它是一个看门狗复位。

    我的第一个问题是,如何将关键变量保存在RAM上,以便在重启或看门狗复位后继续存在?

    启动时ram看起来很干净......我可以禁用吗?

  2. 通常会有一个包含该信息的注册表。在AM335x上有PRM_RSTST寄存器的位(WDT1_RST),我正在使用带有WDIOC_GETBOOTSTATUS的ioctl()来检查上次启动是由看门狗引起还是上电复位。这个电话不会给我一些我能理解的东西。有人可以解释一下吗?我怎样才能获得这个注册......

    Power ON:
    test1: 1076092848
    test2: 1076113328
    test3: 1075589040
    test4: 1076203440
    watchdog:
    test5: 1076481968
    test6: 1075732400
    test7: 1075965872
    

    代码使用:

    /* Check if last boot is caused by watchdog */
    if (ioctl(fd, WDIOC_GETBOOTSTATUS, &bootstatus) == 0) {
       fprintf(stdout, "Last boot is caused by : %s, bootstatus= %d\n",
          (bootstatus != 0) ? "Watchdog" : "Power-On-Reset", bootstatus);
    } else {
       fprintf(stderr, "Error: Cannot read watchdog status\n");
       exit(EXIT_FAILURE);
    }
    
  3. 有没有其他方法可以获取此信息(mmap,写入驱动程序,sys等)?

2 个答案:

答案 0 :(得分:1)

我建议您使用引导加载程序查看处理器寄存器值(对于u-boot,我相信命令是 reginfo )。您存储看门狗密钥的内存的方式相同(但另一个命令)。使用引导加载程序调试后,您可以考虑将它们传递给内核。

答案 1 :(得分:1)

我首先使用终端命令devmem 0x44E00F08(busybox)来查看读取物理内存是否有效然后我使用mmap()读取PRM_RSTST寄存器并知道上次复位是否为看门狗复位。