u-boot第二阶段代码(4)
2016-09-23 13:52
357 查看
开篇:
1.第二阶段代码一开始进行各种设置和初始化,包括串口,nand,nor,网卡等,为u-boot后面提供基础
2.初始化完之后,u-boot会从环境变量中读取bootdelay的参数,然后倒数计时,假如在这期间没有空格按下,那么u-boot就会运行启动内核的命令,从而一去不复返
3.假如有空格按下,u-boot将进入死循环即串口控制台,等待用户输入命令来解析运行该命令。
u-boot第二阶段代码分析:
board.c /lib_arm:
start_armboot:
Main.c /common
main_loop:
1.第二阶段代码一开始进行各种设置和初始化,包括串口,nand,nor,网卡等,为u-boot后面提供基础
2.初始化完之后,u-boot会从环境变量中读取bootdelay的参数,然后倒数计时,假如在这期间没有空格按下,那么u-boot就会运行启动内核的命令,从而一去不复返
3.假如有空格按下,u-boot将进入死循环即串口控制台,等待用户输入命令来解析运行该命令。
u-boot第二阶段代码分析:
board.c /lib_arm:
start_armboot:
/*分配一个gd_t结构体和一个bd_t结构体初始化为0*/ gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); memset ((void*)gd, 0, sizeof (gd_t)); gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); memset (gd->bd, 0, sizeof (bd_t)); /*循环执行这些函数*/ //当函数指针指向NULL时退出for循环 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { hang ();//初始化不成功就打印错误信息 } } init_fnc_t *init_sequence[] = { cpu_init, /* basic cpu dependent setup 设置IRQ,FIQ的棧*/ board_init, /* basic board dependent setup 设置时钟频率 */ gd->bd->bi_arch_number = MACH_TYPE_S3C2440; /* arch number of SMDK2440-Board 设置机器ID与内核交互*/ interrupt_init, /* set up exceptions 初始化定时器*/ env_init, /* initialize environment 检查flash中参数是否有效*/ init_baudrate, /* initialze baudrate settings */ serial_init, /* serial communications setup 初始化串口控制台*/ console_init_f, /* stage 1 init of console */ display_banner, /* say that we are here */ #if defined(CONFIG_DISPLAY_CPUINFO) print_cpuinfo, /* display cpu info (and speed) */ #endif #if defined(CONFIG_DISPLAY_BOARDINFO) checkboard, /* display board info */ #endif dram_init, /* configure available RAM banks 检测系统内存映射 */ gd->bd->bi_dram[0].start = PHYS_SDRAM_1; /*记录下内存起始地址和大小,与内核交互*/ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; display_dram_config, NULL, }; size = flash_init (); //初始化norflash 使其能写能读 mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); //初始化用于malloc的内存 puts ("NAND: "); nand_init(); /* nandflash初始化,使其能读写 */ /* initialize environment */ env_relocate (); /*将环境参数读入内存指定位置*/ gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");/*获得IP地址*/ i = getenv_r ("ethaddr", tmp, sizeof (tmp)); /*获得MAC地址*/ cs8900_get_enetaddr (gd->bd->bi_enetaddr); /*网卡初始化*/ for (;;) { main_loop (); /*进入main_loop 死循环*/ }
Main.c /common
main_loop:
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) s = getenv ("bootdelay"); /*获得bootdelay的参数*/ bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY; /*转化成数字*/ s = getenv ("bootcmd"); if (bootdelay >= 0 && s && !abortboot (bootdelay)) /*倒数计时如果没有按入空格健就会执行"bootcmd"命令来启动内核*/ { printf("Booting Linux ...\n"); run_command (s, 0); } run_command("menu", 0); //有空格健按下就运行菜单 /*再次进入死循环,进入u-boot控制台界面,等待命令*/ for (;;) { len = readline (CFG_PROMPT); //读到命令 flag = 0; /* assume no special flags for now */ if (len > 0) strcpy (lastcommand, console_buffer); else if (len == 0) flag |= CMD_FLAG_REPEAT; rc = run_command (lastcommand, flag); //运行命令 }
相关文章推荐
- U-Boot启动第二阶段代码分析
- U-Boot 第二阶段代码分析
- u-boot第二阶段代码(仅启动linux)
- U-boot启动代码第二阶段之 gd_t和bd_t 以及 *gd asm ("r8")
- u-boot源码分析 --- 启动第二阶段 ,基于2410 启动代码 分析
- U-Boot启动第二阶段代码
- U-Boot启动第二阶段代码分析
- u-boot源码分析 --- 启动第二阶段 ,基于2410 启动代码 分析
- U-Boot学习-第二阶段代码分析
- U-Boot启动第二阶段代码分析
- U-boot第二阶段代码分析
- U-Boot启动第二阶段代码分析
- U-Boot启动第二阶段代码分析
- 对U-BOOT的第1阶段代码的分析
- 图解U-Boot:第二阶段源码分析
- 对U-BOOT的第1阶段代码的分析
- u-boot第二阶段之start_armboot()函数
- u-boot第二阶段之gd_t和 bd_t结构体
- 六、uboot第二阶段代码简要分析 (2011-03-11 16:21)
- u-boot-2010.06 源码分析<3>--第二阶段