[UP] add some viki files, knowledge.
[arrow.git] / viki / uboot / uboot-porting-apply.viki
blobdbde299da50c6c6ac81b9957151f1116768bdffb
1 ref: http://blog.chinaunix.net/u/26525/showart_215104.html
2 引导装载程序U-Boot的移植与应用
3 摘要:U-Boot是支持多种体系结构嵌入式处理器、功能强大的开源引导装载程序。本文以U-Boot在S3C44B0X微处理器上的移植过程为例,介绍了U-Boot的移植技巧和要点,以及利用U-Boot提供的TFTP引导功能启动μClinux操作系统的方法,具有一定的通用性。为在其他嵌入式处理器中进行μClinux操作系统的Boot-Loader程序设计提供了参考。
4 关键词:引导装载程序;U-Boot;移植;TFTP;μClinux
5 1.      引言
6 引导装载程序(Boot-Loader)是系统加电后运行的第一段软件代码。它负责完成整个嵌入式系统的引导装载任务。通常嵌入式系统Boot- Loader的编写对硬件的依赖性非常强,不仅依赖于系统所使用的嵌入式处理器的体系结构,还依赖于具体的嵌入式系统上所使用的硬件设备的配置。而嵌入式系统的主要特点之一就是它的专用性,因此在嵌入式系统世界里建立一个通用的Boot-Loader几乎是不可能的。尽管如此,仍然可以对嵌入式Linux 系统中的Boot-Loader程序归纳出一些通用的概念和规则,来指导Boot-Loader程序的设计和编写。由于Boot-Loader的实现依赖于CPU的体系结构,因此大多数Boot-Loader都划分为Stage 1和Stage 2两大部分。依赖于CPU体系结构的代码都放在Stage 1中,通常用汇编语言来实现,以达到程序简洁高效的目的,移植时的代码修改工作主要在这部分; Stage 2则通常用C语言来实现,以实现更复杂的功能,同时使得代码具有更好的可移植性[1]。功能强大的Boot-Loader程序U-Boot就是上述结构的突出代表。
7 U-Boot是由德国工程师Wolfgang Denk从8xxROM代码发展而来的,目前支持多种体系结构的嵌入式处理器的开源引导装载程序项目。最新的U-Boot 1.1.3支持的处理器体系结构包括有ARM、Intel i386、Intel XScale、MIPS、MPC、NIOS、NIOS 2和PowerPC。U-Boot的源代码配置裁剪方法简单,易于移植,提供十分强大的网络功能,支持多种文件格式的下载,已经在许多嵌入式系统开发过程中被采用。
8 2.      U-Boot在S3C44B0X上的移植
9 下面就以基于Samsung S3C44B0X的嵌入式系统目标板为例,详细说明在Fedora Core 4操作系统环境下移植U-Boot的过程。笔者所使用的嵌入式系统目标板的主要配置如下:
10 处理器:基于ARM7TDMI体系结构的Samsung S3C44B0X
11 Flash存储器:4MB Intel TE28F320C3BA100
12 SDRAM:8MB Winbond W986416EH-7
13 以太网控制器:CIRRUS LOGIC CS8900A-CQ3
14 串行通信接口:2个标准RS-232接口
15 以太网接口:1个RJ-45以太网接口
16 调试接口:1个14针JTAG接口
17 2.1 安装交叉编译环境
18 由于Fedora Core 4操作系统运行在笔者的基于Intel x86 CPU的PC上,而U-Boot运行的目标环境是ARM7TDMI体系结构的S3C44B0X处理器,二者体系结构不同。因此为了能够在PC上编译出可以运行在S3C44B0X处理器上的U-Boot的二进制代码,必须在Fedora Core 4中安装交叉编译环境。从http://www.lart.tudelft.nl/download.php3下载压缩过的cross-3.0.tar.bz2,以root身份登录并在终端中使用命令tar -jxvf corss-3.0.tar.bz2解压后会在当前目录下产生一个名为3.0的目录,在3.0目录的bin子目录中所有可执行程序就是该交叉编译环境所提供的编译器、连接器和工具程序。然后使用vi编辑器修改/root/.bashrc文件,将/root/3.0/bin目录加到系统环境变量$PATH 中,即加入以下两行:
19 PATH=$PATH:/root/3.0/bin
20 export PATH
21 保存对.bashrc的修改并退出。关闭当前所有的终端窗口之后,再打开终端窗口,输入arm-linux-gcc --version并回车,如果能看到有输出“3.0”即代表$PATH的设置正确,交叉编译环境的安装工作结束。
22 2.2 下载最新的U-Boot源代码
23 U-Boot项目注册在SourceForge.net中,项目的主页位于http://sourceforge.net/projects/u-boot/,主页上提供了U-Boot的最新稳定发行版本源代码的下载。将下载到的u-boot-1.1.3.tar.bz2用命令tar -jxvf u-boot-1.1.3.tar.bz2解压后,会在当前目录下产生一个名为u-boot-1.1.3的目录。该目录中存放的就是U-Boot的全部源代码。其中的board目录下是U-Boot目前已支持的目标板有关文件;cpu目录下是目前已支持的CPU体系结构有关文件;drivers目录下是目前已支持的通用设备驱动程序;include目录下是U-Boot所使用的头文件,其中的configs子目录下则存放的是各个目标板的配置文件;net 目录下则是BOOTP、RARP、TFTP协议和网络功能的实现代码;lib_arm目录下是与ARM体系结构相关的代码。在开始移植工作之前,首先应当尝试用U-Boot目前已经支持的目标板配置编译U-boot,以测试交叉编译环境和U-Boot的源代码是否正常。
24 2.3 对U-Boot源代码的修改
25 根据已经被U-Boot支持的同样是使用S3C44B0X处理器的B2开发板的配置和U-Boot的README文件中提供的移植步骤对U-Boot源代码进行修改:
26 1、修改顶层目录下的Makefile和MAKEALL脚本,为要进行移植的目标板添加相应的条目;
27 2、在board目录下新建jx44b0子目录用以存放针对目标板的文件,包括Makefile、jx44b0.c、low_level_init.S、 config.mk和u-boot.lds。参考board/dave/B2目录下的相应文件,针对要进行移植的目标板进行修改;
28 3、新建include/configs/jx44b0.h配置文件,参考同一目录下的B2.h文件中的配置,针对要进行移植的目标板进行正确配置;
29 4、所有修改完成之后,在u-boot-1.1.3目录下执行命令make jx44b0_config,对U-Boot进行配置;
30 5、在正确配置之后,在u-boot-1.1.3目录下执行命令make就会生成用以烧写到Flash中的的u-boot.bin二进制文件。
31 6、调试和修正在上述过程中出现的任何错误。
32 2.4 U-Boot移植技巧和要点
33 1、选择移植参考板[2]
34 对于使用开源软件来说,最大的好处是可以参考已有的代码。移植U-Boot最方便的做法就是首先根据目标板的CPU、Flash和RAM的型号等硬件配置,在已被U-Boot支持的众多处理器中确定一个与目标板最接近的移植参考板作为模仿的对象,针对笔者的目标板当然选择同样使用S3C44B0X处理器的 B2板,然后针对目标板进行相应的修改。同时还应广泛借鉴U-Boot中已有的其他目标板的代码,实现更多具体的功能。
35 2、如何正确配置U-Boot
36 由于U-Boot提供了相当丰富的功能,如何正确地定制适合目标板和功能需求的配置头文件于是成为了整个U-Boot移植过程中的重要环节。首先是参考README文件中对于各个配置选项的分类说明;其次是参考其他目标板的配置头文件中各个选项的用法和相关注释;还有位于http://www.denx.de/wiki/DULG/Manual的The DENX U-Boot and Linux Guide。下面以笔者为S3C44B0X目标板编写的配置头文件include/configs/jx44b0.h为例,讲解一些重要的配置选项的意义和用法:
37 CONFIG_S3C44B0_CLOCK_SPEED 用于设定经由S3C44B0X内部的锁相环(PLL)电路倍频后提供给各片内外设使用的时钟MCLK的频率。目标板上的S3C44B0X外接了一个 10MHz的晶振,经由PLL电路放大6倍后送给各片内外设使用,所以此处CONFIG_S3C44B0_CLOCK_SPEED定义为60。
38 CONFIG_DRIVER_CS8900,由于目标板上使用CS8900A作为以太网控制器,因此定义此选项为1,在编译U-Boot时增加对CS8900A的驱动,同时设置 CS8900_BASE为CS8900A内部的RAM映射到S3C44B0X的存储空间中的基地址0x04000300,最后设置 CS8900_BUS16为1告诉驱动程序CS8900A和S3C44B0X接口的数据总线位宽为16位[3]。
39 CONFIG_IPADDR用于设置目标板的IP地址;CONFIG_ETHADDR用于设置CS8900A的MAC地址;CONFIG_NETMASK用于设置子网掩码;CONFIG_SERVERIP用于指定运行TFTP服务器的PC的IP地址。
40 CONFIG_BOOTFILE用于指定执行tftpboot命令时下载的TFTP服务器中的文件名称,这里为"zImage"。而CFG_LOAD_ADDR则指定了默认的TFTP下载文件在目标板上的存储地址,这里设定为SDRAM中的地址0x0c480000。
41 CONFIG_BOOTCOMMAND 用于指定在CONFIG_BOOTDELAY所指定的自动引导延时结束之后执行的默认引导命令,这里指定为"tftpboot\; go 0c480000",即首先执行tftpboot命令下载zImage文件,然后执行go 0c480000命令执行下载到该地址处的zImage文件,注意命令之间要用分号分隔,并使用“\”进行转义。
42 CFG_FLASH_CFI和 CFG_FLASH_CFI_DRIVER用于指定是否使用通用Flash接口驱动程序(Common Flash Interface, CFI)。由于笔者的目标板使用的Flash存储器Intel 28F320C3B支持CFI[4],因此定义这两个选项为1,在编译U-Boot时增加对支持CFI的Flash存储器的驱动。
43 CFG_FLASH_PROTECTION 用于指定目标板所使用的Flash存储器是否具有硬件级扇区保护功能。U-Boot的代码从软件上提供了对Flash存储器的扇区保护功能,而当 Flash存储器自身从硬件上实现了扇区保护功能的时候,就必须进行相应的硬件驱动来使用保护功能。Intel 28F320C3B中的每个扇区在上电之后都处于锁定状态[4],具有硬件级扇区保护功能,因此定义这个选项为1,在编译U-Boot时增加对Flash 存储器硬件扇区保护功能的支持。
44 在完成配置工作后,必须使用make jx44b0_config命令重新配置U-Boot,让新的配置选项生效,然后再编译U-Boot。
45 3. 应用U-Boot的TFTP引导功能调试μClinux
46 U- Boot提供了强大的网络功能,TFTP引导功能就是其中之一。利用TFTP引导功能可以很方便地从TFTP服务器端将编译好的μClinux内核压缩映像文件zImage下载到目标板上的SDRAM指定地址处,然后利用U-Boot提供的go命令跳转到该地址处执行二进制代码,从而启动μClinux操作系统。TFTP引导功能使得μClinux开发人员在调试时不必每次都将编译好的μClinux内核压缩映像文件zImage烧写到Flash存储器中,只需每次将编译好的内核映像文件拷贝到TFTP服务器的/tftpboot目录下,然后给目标板加电运行U-Boot即可,U-Boot会自动下载内核映像文件并启动μClinux。在调试无误之后再将映像文件烧写到Flash中,节省了宝贵的时间。根据笔者的经验,在使用U-Boot的TFTP引导功能时要注意以下几点:
47 1、首先要在目标板的配置头文件中指定U-Boot在编译时加入网络相关的命令,通过将CFG_CMD_NET以逻辑或的方式加入到CONFIG_COMMANDS中即可;
48 2、如前文所述,正确配置与网络和tftpboot命令相关的配置选项,注意目标板的IP地址应和TFTP服务器的IP地址要在同一个网段内;
49 3、正确安装和配置TFTP服务器,开始下载之前用对接网线将目标板和运行TFTP服务器的PC直接连接,关闭运行有TFTP服务器的PC机上的防火墙和其他网络应用程序;
50 4、 TFTP协议是一种典型的停止等待协议,数据包的正确传输建立在客户端和服务器之间的超时和重传机制之上。因此,如果U-Boot中默认的超时时间和超时重传次数不能满足完整下载zImage文件的需要,可以尝试合理增大U-Boot源代码net/tftp.c中常数TIMEOUT和 TIMEOUT_COUNT的默认值。
51 另外,在完成以上工作后,必须重新配置和编译U-Boot,并将生成的二进制文件烧写到目标板的Flash存储器中。
52 4. 结束语
53 Boot -Loader是嵌入式系统软件开发的第一个环节,它把操作系统和硬件开发平台紧密结合在一起,对于嵌入式系统的后续软件开发十分重要。目前,笔者移植的 U-Boot已经能够稳定地运行在目标板上,并且可以从Flash或通过TFTP加载μClinux映像文件,为后续的基于μClinux操作系统的应用程序开发奠定了良好的基础。
54 参考文献
55 [1] 陈渝 李明 杨晔,等. 源代码开放的嵌入式软件分析与实践[M]. 北京:北京航空航天大学出版社,2004. 136-138
56 [2] 宋国军 张侃谕 林学龙. 嵌入式系统中U-Boot基本特点及其移植方法[J]. 单片机与嵌入式系统应用,2004(10):78-81
57 [3] 陈赜. ARM嵌入式技术实践教程[M]. 北京:北京航空航天大学出版社,2005. 173
58 [4] Intel Corporation. Intel Advanced+ Boot Block Flash Memory(C3)[EB/OL]. http://www.intel.com