APP下载

U—Boot在mini2440平台上的移植过程分析

2012-04-29李宇飞嵇启春刘浩洋

计算机时代 2012年11期
关键词:嵌入式系统

李宇飞 嵇启春 刘浩洋

(西安建筑科技大学信息与控制工程学院, 陕西 西安 710055)

摘要: 引导加载程序是嵌入式系统开发的重要环节,它使得操作系统和硬件平台联系起来,对嵌入式系统的后继软件开发十分重要。为此,介绍了当前嵌入式开发中功能强大、稳定可靠的引导加载程序U-Boot的目录结构、启动流程及其移植的思路和引导内核的方法;给出了移植Uboot-2010-06到ARM微处理器S3C2440上所需操作环境的搭建,具体代码的修改,具体参数的设置,以及所需的操作命令等要点。最后将编译生成的U-Boot.bin文件下载到ARM微处理器S3C2440上,测试显示,U-Boot可以达到设计的功能要求并能够稳定运行,而且通过对其进行正确的配置可以引导内核。

关键词: 嵌入式系统; Bootloader; U-Boot; S3C2440; Linux

中图分类号:TP319文献标志码:A 文章编号:1006-8228(2012)11-04-04

Analysis of transplant process of U-boot to platform based on mini2440

Li Yufei, Ji Qichun, Liu Haoyang

(Xi'an University of Architecture and Technology, Xi'an, Shanxi 710055, China)

Abstract: Bootloader (boot loader) plays an important part in combining the operating system with hardware platform, and also is crucial for embedded system of software development. Directory structure, workflow, a porting thought and a booting kernel method of a powerful, stable U-Boot program in the development of the current embedded systems are proposed. The problems in transplanting uboot-2010-06 to S3C2440 are discussed, including particularly the environment establishment, the specific changes to the file, the specific settings to parameter and the demand of operation command. Finally the compiled U-Boot.bin will be downloaded to ARM microprocessor. The result shows that U-boot can reach the project request, operate steadily and boot the kernel successfully through the proper configuration.

Key words: embedded system; Bootloader; U-Boot; S3C2440; Linux

0 引言

在嵌入式软件开发中,嵌入式Linux系统通常包括引导加载程序、Linux内核、文件系统和用户应用程序四部分[1]。引导加载程序包括固化在固件(firm-ware)中的boot代码(可选)和Bootloder。简言之,Bootloader就是在操作系统内核运行之前运行的一段小程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核[2]。由于Bootloader的实现非常依赖于具体的硬件,即使是基于同一种处理器构建的不同开发板,具有相同的CPU,它的外设(比如FLASH)也可能不同,所以不可能有一个通用的Bootloader来支持所有的CPU,而可能的是,让一个Bootloader代码支持多种不同的构架和操作系统,并让它有很好的可移植性。U-Boot就是支持多平台多操作系统的一个杰出代表,移植U-Boot是为下一步引导内核和文件系统做准备,但U-Boot移植完成后由于开发途径的不同还需要做些设置才能引导内核和文件系统。本文重点是针对最小硬件系统的Bootloader移植的研究。

1 U-boot的概述及启动过程

1.1 U-Boot简介

U-Boot (universal boot loader)是德国DENX软件工程中心开发的一款遵循GPL条款的开放源码软件产品,其对现在市场上主流的操作系统,CPU都能提供良好的支持,除了支持Linux系统的引导外,还支持NetBSD、VxWorkd、LynxOS等嵌入式操作系统,并且支持ARM、PowerPC、NIOS、XScale等处理器。U-Boot的程序框架清晰,功能强大,具有较高的稳定性和可靠性,丰富的设备驱动源码,移植方便。这些特点是它被选择移植到mini2440开发板上的原因。

1.2 U-Boot的源码结构

本文主要是针对U-Boot-2010-06的分析与移植。其源码可以在官方网站下载,解压后可以得到它的全部代码。

U-Boot-2010-06根目录下共有29个子目录,根据其作用可以分为开发板类型相关、平台相关、通用的函数、通用的设备驱动、文档示例程序、工具等几类。表1给出了U-Boot的主要目录结构[3]。

1.3 U-Boot的启动流程

由于本次移植采用的硬件平台是友善之臂的mini2440开发板,而U-boot-2010-06没有提供基于S3C2440芯片的开发板支持,我们可以通过修改与其结构相近的smdk2410的配置文件和相关源代码,去实现U-Boot对s3c2440的支持[4]。Bootloader的启动过程可以分为单阶段和多阶段。从固态存储设备上启动的Bootloader是两个阶段的启动过程。第一阶段用到的文件为cpu/xxx/start.S和board/xxx/lowlevel_init.S文件中,这两个文件用汇编语言写成;第二阶段的代码通常放在lib_xxx/board.c文件中,用C语言写成,主要任务是初始化本阶段用到的硬件、检测系统内存映射、将内核镜像和根文件系统镜像从Flash上读到RAM空间中并为内核设置启动参数最终启动内核。

表1U-Boot主要目录说明

[[U-Boot目录\&功能说明\&board\&一些已经支持的开发板相关文件\&common\&与处理器体系结构无关的通用代码\&cpu\&与处理器相关的文件\&disk\&Disk驱动分区相关信息代码\&doc\&U-Boot的说明文档\&drivers\&通用设备驱动程序,如:网卡、FLASH、串口、USB总线等\&fs\&支持文件系统的文件,如:cramfs、fat、fdos、jffs2等\&include\&U-Boot头文件,还有各硬件平台的汇编文件,系统配置文件\&Lib_xxx\&处理器体系结构相关文件,如:lib_arm包含的是ARM体系结构\&net \&与网络功能相关的文件,如:bootp 、nfs、tftp等\&post\&上电自检文件目录\&tools\&用于创建U-Boot、S-Record和Bin镜像文件的工具\&]]

[系统复位转入U-BOOT

的stage1入口点][设置异常向量][设置CPU的时钟、速度、

频率及终端控制寄存][初始化内存控制器][拷贝U-BOOT的stage2到代码到RAM空间][设置堆栈、初始化数据段][本阶段硬件设备初始化] [Stage1部分][跳转到stage2的

C入口点][初始化FLASH设备][初始化NAND、显示、

网络等设备][初始化系统内存][将kernel和根文件系统映射从FLASH读到ARM中][设定内核启动参数和调用内核][本阶段硬件设备初始化] [Stage2部分]

图1U-Boot的启动流程图

2 U-Boot的移植

在移植U-Boot之前首先要建立开发环境,然后根据具体的应用平台的要求生成相应的U-Boot.bin二进制文件,再将U-Boot.bin下载到目标板上,本文采用的是友善之臂的mini2440开发板,此开发板采用405MHZ的ARM920T内核的处理器S3C2440,下面是具体的移植过程。

2.1 移植环境

2.1.1 所需要的软件环境

软件环境为:Vm-ware6.0、Ubuntu/Redhat、TFTP Server、J-Link、Samba服务器、arm-linux-gcc-4.3.2.tgz、U-Boot-2010.

06.tar.gz2等。

2.1.2 Windows所需开发环境

⑴ 安装TFTP Server,此软件用于开发板和Windows的交互,通过它可以把编译好的U-Boot的二进制文件和内核二进制文件烧录到开发板上。

⑵ 使用超级终端通过串口显示U-Boot的运作信息。

⑶ 安装J-Link,此软件的作用是把生成U-Boot.bin烧写到目标板上。

⑷ 安装Vm-ware6.0用于安装Linux操作系统。

2.1.3 Linux所需开发环境

⑴ 建立Linux和Windows的交互平台Samba服务。使得Linux和Windows之间可以通过一个共享目录互相传送文件。

⑵ 交叉编译环境的搭建。将arm-linux-gcc-4.3.2.tgz通过Samba服务器传送到Linux内,然后解压,输入命令:

#tar -xvfarm-Linux-gcc-4.3.2.tgz -C /

运行成功后会在usr/local/arm下生成目录4.3.2。在根目录下输入命令:

#gedit /etc/environment

修改environment,在PATH中添加“/usr/local/arm/4.3.2/”,指定arm-linux-gcc编译器的位置。添加完后保存退出,在根目录键入命令:#su或者重新启动Linux操作系统,让新增加的配置生效。

⑶ 解压U-Boot-2010.06.tar.gz2。方法和解压arm-linux-

gcc-4.3.2.tgz类似。

2.2 移植文件操作

移植U-Boot除了依赖CPU的体系结构外,还依赖于具体的嵌入式板级设备的配置,只需选择与自己板子最为相近的作为基础。与CPU相关的文件位于U-Boot根目录下CPU/arm920t目录及子目录S3C24x0中。与Board相关的文件位于U-Boot根目录下的board/sbc2410x目录下。该版本U-Boot并不支持本文使用的ARM微处理器S3C2440,但是对于同一个系列的另一款微处理器S3C2410却有很完善的支持。两款芯片使用相同的ARM核,片内集成的功能以及寄存器的使用都很接近,所以U-Boot的移植工作在S3C2410和对应的开发板SMDK2410的基础上展开;并且随着U-Boot版本的不断升级许多目录的内容做了很多改动,例如U-Boot-2010-06和以前的版本就有变化,它的/cpu/arm920t下的很多内容移放到了drivers目录下,因此/drivers目录下也需要修改,对此就不作详细介绍,在此我们重点介绍移植的思路[5]。

⑴ 进入u-boot的根目录,并修改Makefile文件。

修改Makefile的命令如下:

$ cd u-boot-2010.06/

$ gedit Makefile

首先搜索CROSS_COMPILE,将CROSS_COMPILE=?改为交叉编译工具链CROSS_COMPILE ?= arm-linux-,然后搜索smdk2410,并仿照它建立自己开发板的配置选项,在smdk2410_config: unconfig @$(MKCONFIG) $(@:_config=) arm arm920t s3c2410NULL s3c24x0下添加mini2440_config: unconfig @$(MKCONFIG) $(@:_config=) arm arm920tmini2440 jason s3c24x0然后保存。

说明:

arm:CPU的架构(ARCH)。

arm920t:CPU的类型。

mini2440:对应在board目录下建立新的开发板项目的目录。

jason:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL。

s3c24x0:CPU型号。

注意:编译选项格式的第二行在@前面要用Tab键开始,否则编译会出错。

⑵ 建立mini2440开发板的板子目录文件。

① 复制smdk2410的板子目录文件为mini2440,命令如下:

$ mkdir -p board/jason

$ cd board/jason/

$ cp -rf ../samsung/smdk2410/ mini2440

② 重命名smdk2410.c为mini2440.c并修改对应的Makefile文件:

$ mv smdk2410.c mini2440.c

COBJS :=mini2440.o flash.o

SOBJS :=lowlevel_init.o

⑶ 在根目录下定位到include/configs,建立mini2440开发板的配置头文件。

修改头文件smdk2410.h。该文件的作用是对CPU内部寄存器相对位置安排和命名寄存器的名称。将smdk2410.h复制并粘贴到当前目录下,将其重命名成mini2440.h,命令如下:

$ cp include/configs/smdk2410.h include/configs/mini2440.h

⑷ 修改开发板的终端中命令行提示符。

用gedit打开include/configs/mini2440.h头文件,定位到117行,其中的“SMDK2410#”就是开发板在终端显示的提示符,现在将其改为“[u-boot@MINI2440]#,如下所示:

#define CONFIG_SYS_PROMPT “[u-boot@MINI2440]#”

/*Monitor Command Prompt */

⑸ 注释掉不需要的LED代码。

① $ gedit arch/arm/cpu/arm920t/start.S

下面这两行是AT91RM9200DK开发板的LED初始化,注释掉。

// bl coloured_LED_init

// bl red_LED_on

② $ gedit arch/arm/lib/board.c

删除不需要的指示进度LED功能。

#if 0

/************************************************************************/

* Coloured LED functionality

……

void blue_LED_off(void)__attribute__((weak,alias("__blue_LED_off")));

#endif

⑹ 在include/configs/mini2440.h头文件中添加宏定义如下:

#define CONFIG_S3C2440 1 /* specifically a SAMSUNG

S3C2440 SoC */

#define CONFIG_MINI2440 1 /* FriendlyARM Mini2440 */

⑺ 修改lowlevel_init.S 文件。

注:lowlevel_init.S文件是开发板相关的,这表示如果外接的设备不一样,可以修改lowlevel_init.S文件中的相关宏。

部分修改代码如下:

#if defined(CONFIG_S3C2440)

#define Trp 0x2 /* 4clk */

#define REFCNT 1012

#else

#define Trp 0x0 /* 2clk */

#define REFCNT 1113

……

⑻ 增加对S3C2440一些寄存器的支持,添加中断禁止部分和时钟设置部分。

① 修改cpu/arm920t中的start.S文件,U-Boot的阶段1代码通常放在此文件中。

中断禁止部分添加代码如下:

# if defined(CONFIG_S3C2440) //添加s3c2440的中断禁止部分

ldr r1, =0x7fff //根据2440芯片手册,INTSUBMSK寄存器有15位可用

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

由于u-boot-2010-06并不支持S3C2440,所以要添加s3c2440的时钟部分使其工作在405MHz:

# if defined(CONFIG_S3C2440) //添加s3c2440的时钟部分

#define MPLLCON 0x4C000004 //系统主频配置寄存器基地址

#define UPLLCON 0x4C000008 //USB时钟频率配置寄存器基地址

ldr r0, =CLKDIVN //设置分频系数FCLK:HCLK:PCLK=1:4:8

mov r1, #5

str r1, [r0]

ldr r0, =MPLLCON //设置系统主频为405MHz

ldr r1, =0x7F021 //这个值参考芯片手册“PLL VALUE SELECTION

TABLE”部分

str r1, [r0]

ldr r0,=UPLLCON //设置USB时钟频率为48MHz

ldr r1,=0x38022 //这个值参考芯片手册“PLL VALUE SELECTION

TABLE”部分

str r1,[r0]

# else

……

② 修改与Board相关的文件mini2440.c,该文件主要完成对GPIO和PLL的配置。

修改代码如下:

#define FCLK_SPEED 2 //设置默认等于2,即下面代码部分有效

#elif FCLK_SPEED==2/* Fout=405MHz */

#define M_MDIV 0x7F //这三个值根据S3C2440芯片手册“PLL

VALUE SELECTION TABLE”部分进行设置

#define M_PDIV 0x2

#define M_SDIV 0x1

#define USB_CLOCK 2//设置默认等于2,即下面代码部分有效

#elif USB_CLOCK==2/* Fout=48MHz */

#define U_M_MDIV 0x38//这三个值根据S3C2440芯片手册

“PLL VALUE SELECTION TABLE”部分进行设置

#define U_M_PDIV 0x2

#define U_M_SDIV 0x2

③ 修改cup/arm920t/s3c24x0/speed.c文件,根据设置的分频系数FCLK:HCLK:PCLK=1:4:8修改获取时钟频率的函数。由于s3c2410和s3c2440的MPLL、UPLL计算公式不一样,所以修改get_PLLCLK和函数加入以下代码:

#if defined(CONFIG_S3C2440)

if(pllreg == MPLL)

{ //参考S3C2440芯片手册上的公式:PLL=(2*m*Fin)/(p*2s)

return((CONFIG_SYS_CLK_FREQ*m*2)/(p<

}

#endif

……

#if defined(CONFIG_S3C2440)

return(get_FCLK()/4);

#endif

⑼ 借用S3C2410的代码修改s3c24x0_cpu.h、s3c24x0.h、timer.c。

① 修改s3c24x0_cpu.h

在这个文件中添加对S3C2440芯片的支持。例如:

将defined (CONFIG_S3C2410)改成defined (CONFIG_S3C2410)||(defined CONFIG_S3C2440)。

② 修改头文件s3c24x0.h

该文件的作用是对CPU内部寄存器相对位置安排和命名寄存器的名称,具体修改可参照s3c2440数据手册,例如:

使用命令$ gedit arch/arm/include/asm/arch-s3c24x0/s3c24x0.h分别定位到81、91、95、106、144、400行,将#ifdef CONFIG_S3C2410改为#if defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)。

然后在struct s3c24x0_clock_power结构体中加入2440 的NAND FLASH 的数据结构成员CAMDIVN定义,具体代码为:

#if defined (CONFIG_S3C2440)

u32 CAMDIVN; //for mini2440

#endif

注:这个结构是用来封装时钟寄存器的,要在其中增加一项CAMDIVN寄存器是2410所没有的,而2440在配置时钟的时候又必须用到,看名字我们就知道是用来配置CAMERA时钟的,即用来配置摄像头的时钟的。

③ 修改timer.c

在defined(CONFIG_SMDK2410) || \ 下添加defined(CONFIG_MINI2440) || \。

3 U-boot的生成、测试

3.1 目标文件的生成

现在编译u-boot,在根目录下会生成一个u-boot.bin文件。我们利用mini2440原有的supervivi把u-boot.bin下载到RAM中运行测试(注意:我们使用supervivi进行下载时已经对CPU、RAM进行了初始化,所以我们在u-boot中要屏蔽掉对CPU、RAM的初始化),用gedit打开cpu/arm920t/start.S,定位到如下代码:

//#ifndef CONFIG_SKIP_LOWLEVEL_INIT

//bl cpu_init_crit

//#endif

3.2 测试编译

以root用户登陆Linux操作系统,在U-Boot主目录下依次运行以下命令:

$ make distclean

$ make mini2440_config

Configuring for mini2440 board...

$ make

编译成功会生成一个二进制文件u-boot.bin,通过特制的Flash烧写程序J-Link将二进制文件U-boot.bin烧入Flash的零地址。烧写成功后,拔掉J-Link接口复位开发板。

从超级终端输出如下信息:

u-Boot 2010.06 (Aug 16 2012 -14:13:18)

DRAM: 64MB

Flash:512KB

In: serial

Out:serial

Err:serial

Net:cs8900-0

[u-boot@MINI2440]#

在超级终端显示的信息表明,CPU和串口已经正常工作,能进入U-Boot界面。接下来我们用命令测试Flash、SDRAM、网络等。测试结果表明,U-Boot移植成功并且可以在系统板上稳定地运行。

4 结束语

U-Boot作为目前使用最广泛的嵌入式Bootloader,一直都是嵌入式系统研究的重点。针对S3C2440的特点,我们详细介绍了U-boot的移植过程。通过上述方法移植的U-Boot目前能稳定地运行在开发板上,实现了串口与PC机的通信,查看和修改内存,以及引导Linux内核等的功能,为后续嵌入式系统软件的开发提供了良好的环境。

参考文献:

[1] 田会峰.基于S3C2440的Bootloader设计与实现[J].自动化技术与

应用,2010.29(7):29-32

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

[3] Current Versions.DENX software engineering [EB/OL].http://

www.denx.de/wiki/DULG/Manual.2010.12.

[4] 李军,张华春.U-Boot及Linux2.6在S3C2440A平台上的移植方法

[J].电子器件,2008.10:1667-1670

[5] u-boot-2010.06在mini2440上的移植[EB/OL].http://blog.

chinaunix.net/uid-26552187-id-3128489.html.2012.3.

[6] 孙天泽.嵌入式设计及Linux驱动开发指南[M].电子工业出版社,

2005.

猜你喜欢

嵌入式系统
办公自动化系统的设计
基于物联网项目驱动的嵌入式系统教学改革的研究与实践
嵌入式系统课程“中断、异常与事件”教学实践及启示
面向实践创新人才培养的嵌入式系统教学研究