- 论坛徽章:
- 0
|
u-boot的作用有两种:
1、初始化硬件 2、加载启动操作系统
u-boot执行流程(.c .S)分为两个阶段,内容如下:
第一阶段启动流程:
1)设置为svc模式,禁止中断
2)cpu_init_crit
设置一级缓存,二级缓存
禁止MMU
设置电路
3)lowlevel_init
1.关看门狗
2.系统时钟初始化
3.外接内存初始化
4.uart初始化
5.nand初始化
4)判断当前运行地址是否为链接时指定的地址
如果不相等则执行copy_from_nand
完成代码由nand到外接的ram拷贝工作
代码框架如下:
copy_from_nand
copy_uboot_to_ram
nandll_read_blocks(CFG_PHY_UBOOT_BASE, COPY_BL2_SIZE);
0x23e00000, 512k
nandll_read_page(buf, i + skipped_page)
nand_readpage
总结: 实现将nand 0 地址开始的512K内容搬移到外接RAM 0x23e00000
5)使能MMU
6)清空BSS功能
7)跳转到start_armboot去执行
ldr pc, _start_armboot
_start_armboot:
.word start_armboot
第二阶段启动流程
1)该阶段的硬件初始化工作
2)初始化环境变量
3)倒数计时
执行bootcmd中指定的命令
4)进入for(:
readline(CFG_PROMPT)
run_command(cmd)
{
解析输入的字符串“;”
匹配单条命令
run_cmd()
}
源码追踪如下:
入口函数
lib_arm/board.c
start_armboot(){
1)相关硬件的初始化工作
cpu_init();
board_init()
{
gd->bd->bi_arch_number = MACH_TYPE;
gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);
}
......
for (; { board.c 793行
main_loop ();
}
void main_loop (void)
{
s = getenv ("bootdelay" ; main.c 550行
s = getenv ("bootcmd" ; main.c 574行
}
if (bootdelay >= 0 && s && !abortboot (bootdelay)) main.c 582行 读秒没有被打断,则执行内核程序,否则跳到646行
{
"nand read.jffs2 0xc0008000 kernel;bootm 0xc0008000"
run_command (s, 0); 582行
}
for (; main.c 646行
{
len = readline (CFG_PROMPT); main.c 655行
int readline (const char *const prompt) main.c 1141行
{
return readline_into_buffer(prompt, console_buffer);
}
strcpy (lastcommand, console_buffer); main.c 659行
run_command (lastcommand, flag); main.c 680行
}
int run_command (const char *cmd, int flag) main.c 1486行
{
/* Look up command in command table */ main.c 1566行
if ((cmdtp = find_cmd(argv[0])) == NULL) {
printf ("Unknown command '%s' - try 'help'\n", argv[0]);
rc = -1; /* give up after bad command */
continue;
}
/* OK - call function to do the command */ main.c 1596行
if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {
rc = -1;
}
}
} |
|