uboot移植(六)——uboot启动第二阶段(init_sequence)
2016-08-04 23:03
477 查看
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { hang (); } }通过前面的定义init_fnc_t **init_fnc_ptr;可以知道init_fnc_ptr是一个二重指针,而init_sequence是一个函数指针数组里面存放的都是函数的函数名,这些函数都是板级初始化函数,*init_fnc_ptr解引用得到的就是一个函数指针,这个for循环的作用就是去遍历这个函数指针数组,而遍历的目的就是去执行这个函数指针数组里面的函数,从而对开发板的部分外设进行初始化。当遍历到最后一个元素NULL的时候跳出这个for循环。
init_fnc_t *init_sequence[] = { cpu_init, /* basic cpu dependent setup */ #if defined(CONFIG_SKIP_RELOCATE_UBOOT) reloc_init, /* Set the relocation done flag, must do this AFTER cpu_init(), but as soon as possible */ #endif 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, #endif dram_init, /* configure available RAM banks */ display_dram_config, NULL, };(1)cpu_init:cpu内部初始化,实际这个函数是个空函数
(2)board_init:初始化网卡和DDR
(3)interrupt_init:初始化定时器4(用来计时比如bootdelay),这里设置的10ms计时一次
(4)env_init:环境变量设置
(5)init_baudrate:初始化波特率
(6)serial_init:串口初始化(串口在uboot启动的第一阶段已经完成了),这里实际啥也没干
(6)console_init_f控制台初始化的第一阶段(实际上我们没有用到控制台)
(7)display_banner:打印uboot的版本信息
(8)print_cpuinf:初始化时钟
(9)checkboard:打印时钟信息
(10)init_func_i2c:这里没有用到I2C的设备,所以无实际作用
(11)dram_init:gd->bd中关于DDR配置部分全局变量的赋值(大小 起始地址 等)
(12)display_dram_config:打印DDR的配置信息
(13)NULL:用于跳出for循环。
以上是uboot在第二阶段做的主要事情
env_relocate ();
环境变量的重定位,将SD卡中的环境变量读取到DDR中
需要注意的是SD卡中一开始是没有环境变量的,uboot第一次启动时环境变量是使用uboot中的配置头文件(如x210sd.h)中硬编码的一套默认的环境变量,当我启动uboot后使用saveen命令才会把环境变量写到SD卡的raw分区。以后使用的也是SD卡中的这一份环境变量。
uboot启动第二阶段的最后是进入一个死循环,输入命令 解析命令
for (;;) { main_loop (); }main_loop函数执行一次代表了一次命令的输入 解析 和执行。内核启动阶段也是从这个函数开始的。
相关文章推荐
- BootISO:从 ISO 文件中创建一个可启动的 USB 设备
- 路由器启动的顺序
- 1 秒内启动Linux的方法
- 免安转MySQL服务的启动与停止方法
- 解决Mysql服务器启动时报错问题的方法
- C#实现开机自动启动设置代码分享
- VC++实现程序开机启动运行的方法
- Oracle数据库的启动和关闭顺序实例讲解
- Linux系统下Oracle数据库的安装和启动关闭操作教程
- 详解Linux系统中Oracle数据库程序的启动和关闭方式
- Oracle监听器服务不能启动的解决方法
- 使用VBS禁用、启动USB存储设备
- windows下如何安装和启动MySQL
- C#实现将应用程序设置为开机启动的方法
- ip修改后orcale服务无法启动问题解决
- 使用批处理实现启动和停止服务的代码分析(net start&net stop)
- 计算机名称修改后Oracle不能正常启动问题分析及解决
- log引起的mysql不能启动的解决方法
- MySQL服务器的启动和关闭
- JS启动应用程序的一个简单例子