一、启动流程

系统完整启动流程分为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首先从MMC1SD卡启动。

2.2一级启动代码x-loader

        x-loaderu-boot的精简版本,其主要功能是配置DPLL时钟,初始化外部RAM,然后从NADFLASHSD卡读取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-bootRAM中并运行。

2.3二级启动代码u-boot

        u-boot是二级引导程序,分为stage1stage2两个阶段,第一阶段为汇编代码,位于/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_initDDR BANKS配置信息,起始地址和长度;

        如果函数指针数组内部任一初始化函数失败,u-boot将终止运行,导致启动失败。成功初始化完该函数指针数组成员后,通过操作两个数据结构(gd_tbd_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):初始化以太网卡设备。

Logo

更多推荐