您的位置:首页 > 其它

从零开始-uboot的移植-前期准备:uboot是如何启动倒数,启动内核的

2016-07-10 09:55 531 查看
前言:

在移植 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_BOOTARG
4000
S

"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"

转自:http://blog.chinaunix.net/uid-28458801-id-4430886.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: