AM3517开发板bootloader启动流程分析
一、启动流程系统完整启动流程分为4个阶段:ROMCode---àx-loader---àu-boot---àLinux系统。二、各阶段详细分析2. 1 ROM Code 该阶段代码固化在芯片内部ROM中,TI不开源。AM3517支持多种方式的启动,并且可以设置启动顺序,设置功能是通过7个引脚sys_boot0~sys_boot6电平来控制的,其中sys_boot
一、启动流程
系统完整启动流程分为4个阶段:ROM Code---àx-loader---àu-boot---àLinux系统。
二、各阶段详细分析
2. 1 ROM Code
该阶段代码固化在芯片内部ROM中,TI不开源。AM3517支持多种方式的启动,并且可以设置启动顺序,设置功能是通过7个引脚sys_boot0~sys_boot6电平来控制的,其中sys_boot6控制选择时钟,sys_boot0~sysboot5设置启动顺序。如0b10101首先从NANDFLASH启动,0b10010首先从MMC1即SD卡启动。
2.2一级启动代码x-loader
x-loader是u-boot的精简版本,其主要功能是配置DPLL时钟,初始化外部RAM,然后从NADFLASH或SD卡读取u-boot并运行。其启动过程如下:
(1)x-loader第一个运行文件是位于/cpu/omap3/下的汇编程序start.S。
(2)在start.S中会调用 /board/am3517evm/platform.S中的lowlevel_init函数,该函数又会调用C语言函数s_init(位于/board/am3517evm/Am3517evm.c中),该函数会依次完成下列工作:
(a)关闭看门狗2(watchdog_init()函数);
(b)解锁存储器(try_unlock_memory()函数),这是OMAP系列MPU的保护机制,不解锁的话将无法写一些寄存器;
(c)配置相关资源引脚的模式(set_muxconf_regs());
(d)配置各个模块时钟(prcm_init()):Core_DPLL:332MHz;MPU_DPLL:380MHz;PER_DPLL: 432MHz;
(e)配置外部RAM(config_emif4_ddr()):
(3)之后x-loader进入第二阶段,入口函数是/lib/board.c程序中的start_armboot();
(4)x-loader第二阶段的主要功能是通过读取sys_boot~-sys_boot0引脚的值判断是从NANDFLASH还是从SD卡启动,并从判断结果中拷贝u-boot到RAM中并运行。
2.3二级启动代码u-boot
u-boot是二级引导程序,分为stage1和stage2两个阶段,第一阶段为汇编代码,位于/cpu/arm_cortexa8/start.S中,启动过程同x-loader;第二阶段为C语言代码,位于/lib_arm/board.c中的start_armboot(void)函数,它是整个启动代码的C语言的主函数,同时也是整个u-boot的主函数。下面重点分析void start_armboot(void)函数。
进入start_armboot()函数后,首先定义了一个函数指针数组init_fnc_t *init_sequence[],通过这个数组,程序按顺序执行初始化工作。
board_init:初始化GPMC控制器(NANDFLASH);
timer_init:初始化定时器Gptimer2,在这个地方就是空跑,没有其他意义;/** Nothing really to do with interrupts, just starts up a counter. We run the counter with 13MHz, divided by 8, resulting in timer frequency of 1.625MHz. With 32bit counter register, counter overflows in ~44min*/
console_init_f;控制台前期初始化(common/console.c)由于标准设备还没有初始化(gd->flags & GD_FLG_DEVINIT=0),这时控制台使用串口作为控制台,函数只有一句:gd->have_console = 1;
init_func_i2c:初始化I2C控制器;
dram_init:DDR BANKS配置信息,起始地址和长度;
如果函数指针数组内部任一初始化函数失败,u-boot将终止运行,导致启动失败。成功初始化完该函数指针数组成员后,通过操作两个数据结构(gd_t和bd_t)继续运行u-boot.
nand_init:NADN FLASH配置信息,起始地址、容量等;
stdio_init:初始化标准输入输出设备,该函数又调用了以下函数:drv_video_init初始化DSS控制器(LCD),并显示特定LOGO;
console_init_r():控制台设备完整的初始化,stdio_init()函数中注册了LCD为标准输入输出设备,因此可以将LCD屏作为显示控制台;
eth_initialize(gd->bd):初始化以太网卡设备。
更多推荐
所有评论(0)