新路程------imx6q的reboot过程

   之前的看门狗时好时坏,最后发现是输出wdog_B的电容过小导致低电平时间太短,于是看了一下为什么reboot命令最后会以拉低这个gpio为结果,参考代码分析:

   reboot先来到

/kernel/sys.c中
void kernel_restart(char *cmd)
{
kernel_restart_prepare(cmd);
if (!cmd)
printk(KERN_EMERG "Restarting system.\n");
else
printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
kmsg_dump(KMSG_DUMP_RESTART);
machine_restart(cmd);
}

然后到了arch/arm/kernel/process.c里

void machine_restart(char *cmd)
{
machine_shutdown();
arm_pm_restart(reboot_mode, cmd);
}

然后到了void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart,

然后是

arch_reset(mode, cmd);

然后到了System.c (arch\arm\plat-mxc):void arch_reset(char mode, const char *cmd)

然后

void arch_reset(char mode, const char *cmd)
{
unsigned int wcr_enable;


arch_reset_special_mode(mode, cmd);


#ifdef CONFIG_ARCH_MX6
/* wait for reset to assert... */
if (enable_ldo_mode == LDO_MODE_BYPASSED) {
/*On Sabresd board use WDOG2 to reset external PMIC, so here do
* more WDOG2 reset.*/
wcr_enable = 0x14;
__raw_writew(wcr_enable, IO_ADDRESS(MX6Q_WDOG2_BASE_ADDR));
__raw_writew(wcr_enable, IO_ADDRESS(MX6Q_WDOG2_BASE_ADDR));
} else
wcr_enable = (1 << 2);
__raw_writew(wcr_enable, wdog_base);
/* errata TKT039676, SRS bit may be missed when
SRC sample it, need to write the wdog controller
twice to avoid it */
__raw_writew(wcr_enable, wdog_base);


/* wait for reset to assert... */
mdelay(500);


printk(KERN_ERR "Watchdog reset failed to assert reset\n");


return;
#endif到了最后去动了watchdog2的wdog_B输出,请参考watchdog的寄存器这个功能是

Assert WDOG output.




猜你喜欢

转载自blog.csdn.net/u013308744/article/details/78779078