NXP芯片 i.MX系列 UBOOTreset 命令简析

    技术2023-11-11  81

    在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代码部分就先分析到这里了。

    Processed: 0.017, SQL: 9