1. U-Boot移植
U-Boot的源码是通过GCC和Makefile组织编译的。顶层目录下的Makefile首先设置开发板的定义,然后递归地调用各级子目录下的Makefile,最后把编译过的程序链接成U-Boot映像。
移植U-Boot工作就是添加开发板相关的文件、配置选项,然后配置编译。开发移植U-Boot前,要熟悉硬件电路板和处理器。确认U-Boot是否已经支持新开发板的处理器和I/O设备,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次是处理器体系结构相同,然后是以太网等外围接口。
U-Boot移植过程如下:
1.1移植准备
修改Makefile文件,在U-Boot中建立自己的开发板文件(以友善之臂的sbc2410x为基础)。
1.1.1 添加开发板的配置选项
进入U-Uoot根目录,修改Makefile文件,参考smdk2410的配置选项修改如下:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
各项的意思如下:
arm : CPU的架构(ARCH)
arm920t : CPU的类型(CPU),其对应于cpu/arm920t子目录。
mini2440: 开发板的型号(BOARD),对应于board/ mini2440目录。
NULL: 开发者/或经销商(vender),NULL为没有。
s3c24x0 : 片上系统(SOC)。
同时在“ifndef CROSS_COMPILE ”之前加上自己交叉编译器的路径,比如我使用crosstool-0.43制作的基于2.6.27.4内核和gcc-4.1.1-glibc-2.3.2的ARM9TDMI交叉编译器,则:
CROSS_COMPILE=arm-9tdmi-linux-gnu-
特别注意:
在u-boot1.3.3及以上版本Makefile有一定的变化,使得对于24x0处理器从nand启动的遇到问题。也就是网上有人说的:无法运行过lowlevel_init。其实这个问题是由于编译器将我们自己添加的用于nandboot的子函数nand_read_ll放到了4K之后造成的(到这不理解的话,请仔细看看24x0处理器nandboot原理)。运行失败后,利用mini2440的4个LED调试发现u-boot根本没有完成自我拷贝,然后看uboot根目录下的System.map文件可知道原因。解决办法其实很简单,将下面这个语句:
__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
改为:
__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))
1.1.2 在/board子目录中建立自己的开发板mini2440目录
目录结构为board/mini2440。如果开发者/经销商(vender)不为NULL,则目录结构为board/verder_name/mini2440,否则编译会出错。然后,将smdk2410目录下的文件考入此目录中,并将其中的smdk2410.c改名为mini2440.c。同时还得修改board/mini240/Makefile文件:
COBJS := mini2440.o flash.o
1.1.3 在include/configs/中建立配置头文件
将smdk2410.h 复制一份在相同目录下,并改名为 mini2440.h。
1.1.4 测试编译能否成功
回到U-Boot主目录,(若之前有编译过,最好执行一下make clean) make mini2440_config,再make,编译生成u-boot.bin成功。