前言:
在移植 uboot 的时候,最核心的工作是引导启动内核,那么uboot是如何进入倒数,启动内核的呢。
一,进入倒数,启动内核
在 文件
common/main.c 中的 main_loop 函数有如下判断:
-
s = getenv ("bootcmd");
-
-
debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "");
-
-
if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
char * s;
则只有单
S != NULL 时,才有效
在文件 common/env_common.c 中定义了如下数组:
-
const uchar default_environment[] = {
-
#ifdef CONFIG_BOOTARGS
-
"bootargs=" CONFIG_BOOTARGS "\0"
-
#endif
-
#ifdef CONFIG_BOOTCOMMAND
-
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
-
#endif
-
#ifdef CONFIG_RAMBOOTCOMMAND
-
"ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
-
#endif
-
#ifdef CONFIG_NFSBOOTCOMMAND
-
"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
-
#endif
-
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
-
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
-
#endif
-
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
-
"baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
-
#endif
-
#ifdef CONFIG_LOADS_ECHO
-
"loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
-
#endif
-
#ifdef CONFIG_ETHADDR
-
"ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
-
#endif
-
#ifdef CONFIG_ETH1ADDR
-
"eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0"
-
#endif
-
#ifdef CONFIG_ETH2ADDR
-
"eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0"
-
#endif
-
#ifdef CONFIG_ETH3ADDR
-
"eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0"
-
#endif
-
#ifdef CONFIG_ETH4ADDR
-
"eth4addr=" MK_STR(CONFIG_ETH4ADDR) "\0"
-
#endif
-
#ifdef CONFIG_ETH5ADDR
-
"eth5addr=" MK_STR(CONFIG_ETH5ADDR) "\0"
-
#endif
-
#ifdef CONFIG_IPADDR
-
"ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
-
#endif
-
#ifdef CONFIG_SERVERIP
-
"serverip=" MK_STR(CONFIG_SERVERIP) "\0"
-
#endif
-
#ifdef CONFIG_SYS_AUTOLOAD
-
"autoload=" CONFIG_SYS_AUTOLOAD "\0"
-
#endif
-
#ifdef CONFIG_PREBOOT
-
"preboot=" CONFIG_PREBOOT "\0"
-
#endif
-
#ifdef CONFIG_ROOTPATH
-
"rootpath=" CONFIG_ROOTPATH "\0"
-
#endif
-
#ifdef CONFIG_GATEWAYIP
-
"gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0"
-
#endif
-
#ifdef CONFIG_NETMASK
-
"netmask=" MK_STR(CONFIG_NETMASK) "\0"
-
#endif
-
#ifdef CONFIG_HOSTNAME
-
"hostname=" MK_STR(CONFIG_HOSTNAME) "\0"
-
#endif
-
#ifdef CONFIG_BOOTFILE
-
"bootfile=" CONFIG_BOOTFILE "\0"
-
#endif
-
#ifdef CONFIG_LOADADDR
-
"loadaddr=" MK_STR(CONFIG_LOADADDR) "\0"
-
#endif
-
#ifdef CONFIG_CLOCKS_IN_MHZ
-
"clocks_in_mhz=1\0"
-
#endif
-
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
-
"pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"
-
#endif
-
#ifdef CONFIG_EXTRA_ENV_SETTINGS
-
CONFIG_EXTRA_ENV_SETTINGS
-
#endif
-
"\0"
-
}
因此,要在 include\configs下的相关板子 *.h 文件中添加如下
-
/* uboot 启动之后,是根据以下参数来启动内核的
-
* 从nand flash 中读内核映像文件,
-
* 从nand 的 0x00060000 地址开始读到SDRAM 中,读的长度为0x200000
-
* 在从 SDRAM 中启动内核
-
*
-
* 如果不定义这个宏,uboot不会主动调整到内核的启动,
-
* 必须手动复制内核映像文件到sdram中,在用bootm命令来启动
-
*/
-
#define CONFIG_BOOTCOMMAND "nand read 30000000 0x00060000 0x200000;bootm 30000000"
阅读(646) | 评论(0) | 转发(0) |