APP下载

基于S3C2440的嵌入式引导程序的开发

2010-08-15华中农业大学工学院

湖北农机化 2010年6期
关键词:源码开发板内核

华中农业大学工学院 王 龙

嵌入式Linux在IT界已经迅猛发展,使用Linux进行嵌入式产品开发有一个很大的优势,就是开发资源丰富,且成本低廉,嵌入式Linux操作系统越来越受到重视,其应用也越来越广泛。而嵌入式Linux系统开发离不开引导程序,这个引导程序就叫作Bootloader。引导程序是嵌入式Linux系统开发不可或缺的部分,在嵌人式Linux中,内核在启动前进行的首要操作就是启动引导程序。U-Boot是构建嵌入式 Linux引导程序的工具,用它作为 Bootloader简单、方便,而且设置灵活。

1 Bootloader介绍

对于计算机系统来说,从开机到操作系统启动需要一个引导过程。嵌入式linux系统同样离不开引导程序,这个引导程序就叫作Bootloader。

简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序。通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射图的功能,从而将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。通常,Bootloader是严重地依赖于硬件实现的,特别是在嵌入式中。因此,在嵌入式世界里建立一个通用的Bootloader几乎是不可能的。

2 U-Boot概述

U-Boot(Universal Bootloader),是遵循 GPL 条款的开放源码项目。它是从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与 Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,而且还支持 NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等嵌入式操作系统。其目前要支持的目标操作系统是 OpenBSD、NetBSD、FreeBSD、4.4BSD、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks,LynxOS、pSOS、QNX、RTEMS、ARTOS。这是 U-Boot中 Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前为止,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。

3 U-Boot的开发与设计

3.1 U-Boot的源码结构

从网上下载得到的 U-Boot源代码包,如 UBoot-1.3.3.tar.bz2,经过解压就可以得到全部的U-Boot源程序,其顶层目录下有30个子目录,分别存放和管理不同的源程序。以下是其中较为重要的几个目录:

board:该目录下存放各厂家生产的开发板型号。

cpu:该目录下存放U-Boot所支持的cpu类型及型号,cpu相关的文件主要是初始化一个执行环境,包括中断的初始化等。

fs:该目录下存放U-Boot所支持的文件系统。

include:该目录下存放各开发板头文件和配置文件,因此只需修改此文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。

drivers:该目录下存放通用设备的驱动程序。

3.2 交叉编译环境的建立

交叉编译环境主要用于跨平台的源码编译,对于ARM平台有好多源码需要编译,如内核、驱动程序、应用程序、Bootloader等。所以在PC环境中建立交叉编译是必要的。

通常,建立交叉编译环境的方法有以下几种:

(1)分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链,该方法比较困难。

(2)通过Crosstool脚本工具来一次编译生成交叉编译工具链。

(3)直接从网上下载已经制作好的交叉编译工具链。该方法最为简单,但是局限性比较大。建立好交叉编译工具链后,在/etc/bashrc文件的最后加上以下程序:exportPATH=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin:$PATH这样就可以使建立的交叉编译工具链成为系统默认的交叉编译工具了。但是对于不同的编译对象,有可能出现版本不匹配的问题,经检验用crosstool-0.43.tar.gz建立的交叉编译环境编译U-Boot-1.3.3.tar.bz2,就可避免此问题的发生。

3.3 U-Boot的编译

U-Boot是由GCC和Makefile组织编译的。首先在顶层的 Makefile下设置开发板的定义,然后递归到各级目录下Makefile,最后由编译过的程序链接成可以下载到开发板的U-Boot映象。

3.3.1 顶层Makefile

每个开发板在顶层Makefile中都有定义,例如:

smdk2410_config:unconfig

@$ (MKCONFIG)$ (@:_config=)armarm920tsmdk2410 NULL s3c24x0

这是smdk2410开发板的定义,其中变量arm,arm920t,smdk2410。S3C24x0含义分别为:

ARCH:arm;CUP :arm920t;

BOARD:smdk2410;

SOC:S3C24x0;

NULL的位置是厂商 (这里没有定义)。

当要编译S3C2440的U-Boot时,在Makefile文件中没有定义,所以得添加开发板配置信息,依照smdk2410,其配置如下:

tcs3c2440_config:unconfig

@$ (MKCONFIG)$ (@:_config=)armarm920tsmdk2410 NULL s3c24x0

另外,在顶层 Makefile中还有交叉编译器和目标平台的定义,在文件中必须根据目标平台作相应的配置所示:

ifeq($(ARCH),arm)

CROSS-C0MPILE=arm-linux-

说明当目标平台为arm时,用amn-linux-gcc交叉编译器编译。

3.3.2 开发板配置文件

创建一个新目录用来存放开发板配置文件,这里以smdk2410开发板为原型,执行如下命令:

#cdboard

#cprsmdk2410 tcs3c2410

#cdtcs3c2440

#ls

#config.mkflash.clowlevel_init.S Makefilesmdk2410.cu-boot.1ds

将smdk2410.c改成tcs3c2440.c

#mvsmdk2410 tes3c2440

修改Makfefile,将其中的COBJS变量改成COBJS:=tcs3c2440.oflash.o。

在编译U-Boot时,需要头文件的支持,因此必须为开发板配置头文件:

#cdinclude/configs

#cpsmdk2410.htcs3c2440.h

至此,开发板文件就暂时配置好了,这时可以直接在终端键入make来检验上述建立的交叉编译环境是否可以编译这个版本的U-Boot。

3.4 U-Boot移植配置

如果以 SMDK2410为模板移植,必须知道目标硬件平台与它之间的区别,然后再对其做相应的修改。从SMDK2410到S3C2440主要考虑NAND FLASH,由于S3C2440采用的启动方式是NANDFLASH启动,因此将SMDK2410的FLASH启动改为NAND FLASH启动。

(1)将start.s位于cup/arm920t下面,其主要作用是初始化硬件环境,把U-Boot从FLASH加载到SDRAM中。在此需要修改start.s内容以实现U-Boot从NAND FLASH启动。

(2)为了实现读取 NAND FLASH的功能,需要拷贝VlVI中的读 NAND FLASH文件 nand_read.c到/board/tes3c2440下,并将nand_read.c添加到/board/Makefile的编译目标文件中,并做如下修改:

OBJS:=tekkaman2440.onand_read.oflash.o

(3)修改/include/configs/tes3c2440.h,添加NANDFLASH相关寄存器的定义,以及对它的读写操作实现的具体过程。

(4)每次NAND FLASH启动都需要进行初始化,所以需要在/board/tcs3c2440/tcs3c2440.c文件中添加对其的初始化函数nand_init()函数。

3.5 编译U-Boot并下载到开发板执行

配置好上述文件后,退到顶层 Makefile所在目录执行命令:

#make

在该目录下会生成System.map(uboot映象符号表)、uboot(uboot映象ELF格式)、u-boot.bin(uboot映象二进制格式)、u-boot.srec(uboot映象S-Record格式)4个文件,其中后3个文件都可以下载到 NAND FLASH中,一般将 uboot.bin文件通过并口-JTAG下载到开发板即可。然后重新启动开发板,嵌入式开发板最终成功从NANDFLASH启动。

4 总结

近年来由于U-Boot开放源代码的特点和它支持各类处理器的广泛程度,使其备受嵌入式开发人员青睐。随着嵌入式硬件的发展,U-Boot支持的外围器件也越来越多。本文以添加U-Boot的NANDFLASH启动为例,使U-Boot实现了从NANDFLASH启动的功能,为特定的目标平台移植UBoot提供了一般方法。

[1]杨水清,张剑,施云飞等编著.ARM嵌入式linux系统开发技术详解 [M].电子工业出版社.

[2]李亚锋,欧盛文.Hnux系统开发从入门到精通[M].北京:清华大学出版社,2007.

[3]鸟哥的Linux私房菜基础学习篇 [M].2版.北京:科学出版社,2005.

[4]杜春雷.ARM体系结构与编程 [M].北京:清华大学出版社,2008.

[5]韦东山.嵌入式Linux应用开发完全手册 [M].北京:人民邮电出版社.2008.

[6]魏永明,耿丘,钟书毅.Linux设备驱动程序 [M].第3版.北京:中国电力出版社,2006.

猜你喜欢

源码开发板内核
面向数据可靠传输的高译码率带反馈的LT码
强化『高新』内核 打造农业『硅谷』
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
浅谈开源操作系统的历史
企业如何保护源码
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
浅析单片机开发板的设计与制作
微生物内核 生态型农资
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证