TQ2440 学习笔记—— 31、移植U-Boot【U-Boot 的启动过程第二阶段源码分析】

2019-07-13 03:46发布

(韦东山——嵌入式Linux 应用开发完全手册) 二、U-Boot第二阶段代码分析
U-Boot 第二阶段流程图
移植U-Boot 的主要工作在于对硬件的初始化、驱动,所以下面的重点放在硬件的操作上。 (1)初始化本阶段要使用到的硬件设备 最主要的是设置系统时钟、初始化串口,只要这两个设置好了就可以从串口看到打印信息。 board_init 函数设置MPLL、改变系统时钟,它是开发板相关的函数,在board/EmbedSky/EmbedSky.c 中实现。 board_init 函数还保存了机器类型ID,这将在调用内核时传给内核代码如下:

串口的初始化函数主要是 serial_init,它设置 UART 控制器,是CPU 相关的函数,在cpuarm920ts3c24x0serial.c 中实现。
(2)检测系统内存映射 对于特定的开发板,其内存的分布是明确的,所以可以直接设置。board/EmbedSky/EmbedSky.c 中的dram_init 函数指定了本开发板的内存起始地址为0x30000000,大小为4000000(在对应的头文件中可找到)。代码如下:
这些设置的参数,将在后面向内核传递参数时用到。
(3)U-Boot 命令的格式 U-Boot 中的每个命令都通过U_BOOT_CMD 宏来定义,格式如下:
U_BOOT_CMD 在 include/command.h 中定义,如下图:
Struct_Section 也是 在 include/command.h 中定义,如下图:

(4)为内核设置启动参数 U-Boot 也是通过标记列表向内核传递参数。