在uboot命令行中我们会经常用到reset 命令,那么这个reset命令是怎么在代码中实现的呢,现在我们来一探究竟。在这里我们以NXP的i.MX 系列芯片为例。
1. do_reset
首先我们看对于reset命令的定义,在cmd/boot.c文件中。代码如下:
U_BOOT_CMD(
reset, 1, 0, do_reset,
"Perform RESET of the CPU",
""
);
这里就涉及到一个关键的函数,do_reset,下面我们继续跟,在文件arch/arm/lib/reset.c中,do_reset的定义如下
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
puts ("resetting ...\n");
udelay (50000); /* wait 50 ms */
disable_interrupts();
reset_misc();
reset_cpu(0);
/*NOTREACHED*/
return 0;
}
reset_misc()函数在这里没有东西,定义如下。
__weak void reset_misc(void)
{
}
这里面的关键就是,reset_cpu()函数,下面我们看一下reset_cpu()函数。
2. reset_cpu()
reset_cpu()函数定义在drivers/watchdog/imx_watchdog.c,看位置大家应该就心知肚明了,这个就是利用watchdog来实现的。那我们接下来看一下这个函数的实现,上代码:
void __attribute__((weak)) reset_cpu(ulong addr)
{
struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
clrsetbits_le16(&wdog->wcr, WCR_WT_MSK, WCR_WDE);
writew(0x5555, &wdog->wsr);
writew(0xaaaa, &wdog->wsr); /* load minimum 1/2 second timeout */
while (1) {
/*
* spin for .5 seconds before reset
*/
}
}
好了,reset代码部分就先分析到这里了。