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

(韦东山——嵌入式Linux 应用开发完全手册)

二、U-Boot第二阶段代码分析

U-Boot 第二阶段流程图

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

移植U-Boot 的主要工作在于对硬件的初始化、驱动,所以下面的重点放在硬件的操作上。

(1)初始化本阶段要使用到的硬件设备

最主要的是设置系统时钟、初始化串口,只要这两个设置好了就可以从串口看到打印信息。

board_init 函数设置MPLL、改变系统时钟,它是开发板相关的函数,在board/EmbedSky/EmbedSky.c 中实现。

board_init 函数还保存了机器类型ID,这将在调用内核时传给内核代码如下:


串口的初始化函数主要是 serial_init,它设置 UART 控制器,是CPU 相关的函数,在cpu\arm920t\s3c24x0\serial.c 中实现。


(2)检测系统内存映射

对于特定的开发板,其内存的分布是明确的,所以可以直接设置。board/EmbedSky/EmbedSky.c 中的dram_init 函数指定了本开发板的内存起始地址为0x30000000,大小为4000000(在对应的头文件中可找到)。代码如下:

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

这些设置的参数,将在后面向内核传递参数时用到。


(3)U-Boot 命令的格式

U-Boot 中的每个命令都通过U_BOOT_CMD 宏来定义,格式如下:

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

U_BOOT_CMD 在 include/command.h 中定义,如下图:


Struct_Section 也是 在 include/command.h 中定义,如下图:



(4)为内核设置启动参数

U-Boot 也是通过标记列表向内核传递参数。

你可能感兴趣的:(处理器【S3C2440】,嵌入式开发【U-Boot】)