从零开始-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
在移植 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
相关文章推荐
- 从零开始-uboot的移植-前期准备:uboot是如何启动倒数,启动内核的
- header()
- SimpleAdapter学习
- 内核增加支持yaffs2错误问题汇总
- 从零开始-uboot的移植-前期准备:uboot是如何启动倒数,启动内核的
- 从零开始-uboot的移植-前期准备:uboot是如何启动倒数,启动内核的
- requests module --客户端请求服务器端
- 【爬虫-反爬虫】系列一:-尾篇(7)
- 字符串匹配的KMP算法
- HDU-2027 统计元音
- 离职信之鸿宇篇
- Android之SurfaceView学习(一)
- java关键字static
- js生成随机数(指定范围)的实例代码
- tinyhttpd源码详解 转载自 技术菌的blog
- maven
- CSP考试 2015年03月第4题 网络延时 C语言实现
- Android开发之scrollview嵌套listview相关布局的解析
- Java读取包内包外的配置文件
- 优秀博客转载