# tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz
(5)拷贝头文件到/root/usr/3.3.2/arm-linux/ 下?然后删除 /skiff
# cp -dR /skiff/local/arm-linux/include /root/usr/3.3.2/arm-linux
# rm -fr /skiff
这样就建立了arm linux 交叉编译环境。
(6)增加/root/usr/local/arm/3.3.2/bin到路径环境变量
path=$path:/root/usr/local/arm/3.3.2/bin? 可以检查路径变量是否设置正确。# echo $path
3.4 移植的预先编译
移植u-boot到新的开发板上仅需要修改与硬件相关的部分即可。主要包括两个层面的移植,第一层是针对CPU的移植,第二层是针对BOARD的移植。由于u-boot 1.1.1里面已经包含S3C44B0的移植,所以笔者对板子myboard的移植主要是针对BOARD的移植。移植之前需要仔细阅读u-boot目录下的readme文件,其中对如何移植做了简要的介绍。为了减少移植的工作量,可以在include/config目录下选一个和要移植的硬件相似的开发板,笔者选的是b2开发板。具体步骤如下:
(1)u-boot 1.1.1 下的CPU文件夹里已经包括了S3C44B0的目录,其下已经有start.s?interrupts.c以及 cpu.c?serial.c几个文件,因而不需要建立与CPU相关的目录。
(2)在board目录下创建myboard目录以及my-board.c、flash.c、memsetup.s和u-boot.lds 等文件。不需要从零开始创建,只需选择一个相似的目录直接复制过来,然后修改文件名及内容即可。笔者在移植u-boot过程中选择的是u-boot 1.1.1/board/dave/B2目录。
(3)在include/configs目录下添加myboard.h,在这里可放入全局的宏定义等?也不需要从头创建,可以在include/configs目录下寻找相似的CPU的头文件进行复制,这里笔者用的是B2.h文件来进行相关的修改。
(4) 对u-boot根目录下的makefile文件进行修改,加入
myboard_config : unconfig
@./mkconfig $(@:_config=)arm S3C44B0 myboard
(5) 修改u-boot根目录下的makefile文件,加入对板子的申明。然后在makefile 中加入myboard、LIST ARM7=″B2 ep7312 impa7 myboard″。
(6)运行make clobber,删除错误的depend文件。
(7)运行make myboard config。
(8)执行到此处即表示整个软件的makefile已建立,这时可修改生成的makefile中的交叉编译选项,然后打开makefile 文件,并找到其中的语句:
ifeq($(ARCH),arm)
CROSS_COMPILE=arm-linux-
end if
接着将其改成
ifeq($(ARCH),arm)
CROSS COMPILE=/root/usr/local/3.3.2/bin/arm-linux-
end if
这一步和上面的设置环境变量只要有一个就可以了。
执行make,报告有一个错误,修改myboard/flash.c中的#include ″../common/flash.c"为"u-boot/board/dave/common/flash.c″,重新编译即可通过。
4 移植时的具体修改要点
若预先编译没有错误就可以开始硬件相关代码的移植,首先必须要对移植的硬件有清楚地了解,如CPU、CPU的控制寄存器及启动各阶段程序在Flash?SDRAM中的布局等。
笔者在移植过程中先修改/include/config /my-board.h头文件中的大部分参数(大部分的宏定义都在这里设置),然后按照u-boot的启动流程逐步修改。修改时应熟悉ARM汇编语言和C语言,同时也应对u-boot启动流程代码有深入的了解。B2板的CPU频率为75MHz、Flash为4Mbit、SDRAM为16Mbit、串口波特率为115200bit/s、环境变量放在EEPROM中。根据两个开发板的不同,需要修改的有:CPU的频率、Flash和SDRAM容量的大小、环境变量的位置等。由于参考板已经有了大部分的代码,因此只需要针对myboard进行相应的修改就可以了。与之相关的文件有/include/config /myboard.h(大部分的宏定义都在这里设置)、/board/myboard/flash.c?Flash的驱动序?、/board/myboard /myboard.c(SDRAM的驱动程序)、/CPU/S3C44B0/serial.c(串口的驱动使能部分)等。
/include/config /myboard.h是全局宏定义的地方,主要的修改有:
将#define CONFIG S3C44B0 CLOCK SPEED 75改为
#define CONFIG S3C44B0 CLOCK SPEED 64;
将 #define PHYS SDRAM 1 SIZE 0x01000000 /* 16 MB */ 改为
#define PHYS SDRAM 1 SIZE 0x00800000 /* 8 MB */;
将 #define PHYS FLASH SIZE 0x00400000 /* 4 MB*改为
#define PHYS FLASH SIZE 0x00200000 /* 2 MB */;
将 #define CFG MAX FLASH SECT 256 /* max number of sectors on one chip */改为
#define CFG MAX FLASH SECT 35 ;
将 #define CFG ENV IS IN EEPROM 1 /* use EEPROM for environment vars*/改为
#define CFG ENV IS IN FLASH 1
其它(如堆栈的大小等)可根据需要修改。
由于Flash、SDRAM的容量会发生变化,故应对启动阶段程序在Flash、SDRAM中的位置重新作出安排。笔者将Flash中的u-boot代码放在0x0开始的地方,而将复制到SDRAM中的u-boot代码安排在0xc700000开始的地方。
Flash的修改不仅和容量有关,还和具体型号有关,Flash存储器的烧写和擦除一般不具有通用性,应查看厂家的使用说明书,针对不同型号的存储器作出相应的修改。修改过程中,需要了解Flash擦写特定寄存器的写入地址、数据命令以及扇区的大小和位置,以便进行正确的设置。
SDRAM要修改的地方主要是初始化内存控制器部分,由start.s文件中的 cpu init crit完成CPU cache的设置,并由 board/myboard/memsetup.s中的memsetup完成初始化SDRAM。S3C44B0提供有SDRAM控制器,与一些CPU需要UPM表编程相比,它只需进行相关寄存器的设置修改即可,因而降低了开发的难度。
串口波特率不需要修改(都是115200bit/s),直接用B2板的串口驱动即可。串口的设置主要包括初始化串口部分,值得注意的是:串口的波特率与时钟MCLK有很大关系,详见CPU用户手册。
配置好以后,便可以重新编译u-boot代码。将得到的u-boot.bin通过JTAG口下载到目标板后,如果能从串口输出正确的启动信息,就表明移植基本成功。实际过程中会由于考虑不周而需要多次修改。移植成功后,也可以添加一些其它功能(如LCD驱动等),在此基础上添加功能相对比较容易。
5 结束语
u-boot是一个功能强大的bootloader开发软件,适用的CPU平台及支持的嵌入式操作系统很多。本文是笔者在实际开发过程中根据相关资料进行摸索,并在成功移植了u-boot的基础上总结出来的。对于不同的CPU和开发板,其基本的方法和步骤是相同的,希望能对相关嵌入式系统的设计人员有所帮助。
本文关键字:暂无联系方式嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术