uboot启动第二阶段分析( 二 )


的定义如下
init_fnc_t *init_sequence[] = {cpu_init,/* basic cpu dependent setup */board_init,/* basic board dependent setup */interrupt_init,/* set up exceptions */env_init,/* initialize environment */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#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)init_func_i2c,#endifdram_init,/* configure available RAM banks */display_dram_config,NULL,};
只有当允许了中断的情况下才会做中断栈的设置工作,因为我们 uboot 中没有允许中断,所以这里相当于什么都没做
这里进行了网卡的初始化,本人使用的开发板使用的网卡芯片是,所以使用了进行预初始化操作
网卡的驱动是不需要修改的,关键是移植,需要做的事就是移植相关,就像 stm32 一样,使用 GPIO 前,需要进行初始化的工作,这里就是做这些的工作
除了网卡的初始化,这里还在 bd 中添加了机器码和参数内存地址
机器码是用来软件和开发板之间配对用的,避免将软件下载到错误的开发板导致损失 。机器码是唯一的,需要向 uboot 进行申请,当然学习 uboot 的时候可以随意填写,只要 uboot 中配置的机器码和 linux 内核中的机器码一致即可
这里的参数地址中存放的是需要想内核中传送的字符串参数()的地址,uboot 启动的时候是通过 r0 r1 r2 来传递参数,其中一个寄存器放的就是 bd-> 中的值
这里是对定时器4做的相关初始化,进行了10ms的定时
这里是环境变量的初始化,通过 .h 中定义的宏分析可以知道,应该使用的是 .c 中定义的
首先是从 uboot 环境变量中读取波特率,如果环境变量中没有定义波特率就使用 .h 定义的波特率
uboot 环境变量可以在 uboot 中使用 print 查看
串口初始化,主要工作在汇编中完成了,这里没有做什么事
控制台初始化第一阶段,一般第一阶段后缀为 _f,第二阶段后缀为 _r
用来输出 uboot 的 logo
const char version_string[] =U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")"CONFIG_IDENT_STRING;
uboot 启动时输出的是定义在主中的,在编译时自动生成的 /d.h 就会包含相关信息
这里可以输出 CPU 的相关信息
CPU:S5PV210@1000MHz(OK)APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHzMPLL = 667MHz, EPLL = 96MHzHclkDsys = 166MHz, PclkDsys = 83MHzHclkPsys = 133MHz, PclkPsys = 66MHzSCLKA2M= 200MHz
这里做的是 ddr 软件方面的初始化
因为嵌入式设备是定制性的,不像 PC 机都是标准化的,可以自动获取 ddr 的片数、大小
因此在 uboot 中,需要人为添加 ddr 的相关配置信息,相当于是将 ddr 的配置信息写入 gd->bd-> 这个数组中
打印 dram 信息
堆管理器初始化
mem_malloc_init (CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE);
这样堆的地址如下图
开发板专有初始化
为了保证 uboot 的通用性,三星使用了宏来判断当前的开发板的型号,并做对应的初始化
这里的初始化是针对 MMC 的,通过中的脚本,配置开发板是 sd 还是启动;然后对 MMC 的初始化根据宏做相应的处理
环境变量重定位
uboot 的环境变量需要重定位到 ddr 中才能使用
在中,先是通过宏判读环境变量是否嵌入在代码段中;本人的开发板的环境变量在 SD 卡中,所以直接跳过,直接分配一个缓存准备用来存放环境变量