2.2.2 stage2部分
接下来进入到U-Boot stage2,即C语言代码部分,入口是start_arml300t,位于lib_arm/board.c中。startarmboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个U-Boot的主函数,该函数主要完成的操作为:初始化本阶段要使用到的硬件设备;检测系统内存映射;将内核映像和根文件系统映像从FLASH拷贝到SDRAM中;为内核设置启动参数;调用内核。
在stage2部分,首先初始化全局数据表;然后顺序执行函数指针数组init_sequence中的初始化函数;接下来调用FLAsH_init()函数初始化CFI FLAsH(针对NOR FLASH);接着调用env_relocate()函数初始化环境变量;然后获取目标板的网络地址,包括IP地址和MAC地址;接着调用commend/console.c中定义的函数console_init_r()初始化串口控制台;最后进入main_loop循环,以接收用户命令。至此Bootloader的任务已经完成:初始化硬件,为内核传递参数,加载内核。
3 U-Boot的移植
3.1 移植的目标与主要工作
在移植之前,需要清楚移植的目标是什么。为了达到这个目标,需要做哪些工作。一般的开发板上U-Boot所需的最小功能,包括:串口、FLASH和网卡,由此可得移植目标是:
(1)将U-Boot移植到目标板FLASH上;
(2)U-Boot能够在目标板上运行起来;
(3)U-Boot能够读写目标板上FLAsH等存储设备;
(4)U-Boot能够使网卡正常工作,能通过网卡下载数据。
根据以上的移植目标,所做的主要工作应该包括:
移植U-Boot与目标CPU相应的代码;移植U-Boot的FLASH驱动;移植U-Boot,的网卡驱动。
3.2 参考板的选取
U-Boot本身已经支持多种开发板,所以在移植的过程中一般不需要从零开始,可以选择一个与自己目标板最接近的参考板,在参考板的基础上进行修改。所以选择适当的参考板是十分重要的,选择参考板的原则是参考板和目标板具有相同的处理器,至少类似的处理器;参考板和开发板具有相同的外围接口电路,至少基本接口相同。总之尽量重用已成熟的代码。
这里目标板的CPU为PXA255,在board目录里选择lubbock开发板作为参考板。对于相应的FLASH设备由于Intel FLAsH支持CFI(Common FLAsHInterface),选择drivers/cfi_FLAsH.c作为FLASH设备驱动。由于目标板使用LAN91C96网卡,所以选择drivers/lan91c96.c作为网卡驱动。
3.3 建立目标板支持文件
选择好参考板后,就可以依据参考板按照下面的步骤建立起目标板的支持文件:
在board目录下,通过“cp-rlubbock xsbase255”建立起目标板的支持目录,将lubbock.c改名为xsbase255.c,在Makefile里把lubbock.o改名为xsbase255.o。
在inclLlde/configs目录里.通过“cp 1ubbock.h xs-base255.h”命令建立起目标板的配置文件,这个文件需要经常修改。
在U-Boot根目录里的MakefiIe中加入如下的命令以创建目标板的编译环境:
xsbase2 5 5 config:unconfig
@$(MKCONFIG)$(@:_config=)arm pxa xsbase255
注意在@$(MKCONFIG)$(@:_config=)arm
pxa xsbase255前面的空白处是由Tab键生成的,千万不能以空格代替。至此,U-Boot已经为目标板配置好了支持文件。
3.4 修改相关代码
从移植U-Boot最小要求U-Boot能正常启动的角度出发,主要修改如下文件:
incIude/configs/xsbase255.h文件,大多数的寄存器参数都是在这一文件中设置完成的。通过宏定义,用于对平台无关的代码进行平台相关的定制,包括U-Boot命令、缺省的环境变量等。
board/xsbase255/xsbase255.c文件,只需进行基本的配置,包括设置math-type,启动参数首地址,获取系统的RAM信息等。
board/xsbase255/config.mk文件,设置TEXT-BASE,即设置U-Boot:自己启动时将自己复制到RAM中的起始地址。
驱动程序文件,主要包括网卡驱动和FLASH驱动程序。