1.引言
Bootloader是嵌入式软件开发的第一个环节,它为最终加载操作系统内核映像建立了正确的环境。U-Boot是一个开放源代码的启动引导加载程序。笔者以PHILIP公司生产的LPC2210 处理器为硬件基础,详细分析了U-Boot软件启动流程,以及针对U-Boot源码本身并不支持的LPC2210处理器应用U-Boot作为 Bootloader的移植方法,最后给出了U-Boot在LPC2210上的移植实例。
2.Bootloader简介
Bootloader(引导加载程序)是系统加电后运行的第一段软件代码。通过运行Bootloader程序,可以初始化硬件设备,建立系统的内存空间映射图,从而将系统的软硬件环境带到一个适合的状态,以便为最终调用操作系统内核准备好正确的环境。最终,Bootloader把操作系统内核映像加载到RAM中,并将系统控制权传递给它。通常Bootloader对硬件的依赖性非常强,特别是在嵌入式系统世界,因此,在嵌入式系统世界里建立一个通用的Bootloader几乎是不可能的。这就要求开发人员根据不同的硬件环境来开发适合自己开发板的Bootloader程序。
3.U-Boot软件结构
U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持多种主流嵌入式操作系统。这是U-Boot 中universal的一层含义。另外一层含义则是U-Boot能够支持MIPS、ARM、XScale等诸多常用系列的处理器。这两个特点正是U- Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。U-Boot软件在顶层目录下有18个子目录,分别存放和管理不同的源程序。这些目录按照其不同的规则可以分为三类:
(1)与处理器体系或开发板硬件直接相关,例如:/board,/cpu,/include等;
(2)一些通用的函数或者驱动程序,例如:/lib_arm,/driver,/Dtt,/common等;
(3)U-Boot的应用程序,工具或者文档,/tools,/Doc,/Fs,/Post,/net等。
4.启动流程分析
U-Boot软件的启动程序分为Stage1和Stage2两个阶段。依赖于CPU体系结构的代码,通常都放在Stage1中,Stage1主要完成:硬件设备初始化;为加载Stage2准备RAM空间,复制Stage2到RAM空间中;设置堆栈;跳转到Stage2的C入口点。Stage2通常用 C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和移植性,在Stage2主要完成:初始化本阶段要使用的硬件设备;检测系统内存映射;将kernel映像和根文件系统映像从Flash上读到RAM空间;设置内核启动参数,调用内核。
5.LPC2210下移植实例
5.1移植前准备工作
移植过程中要从软件和硬件两个方面准备。首先在Linux操作系统平台下移植适合LPC2210处理器的交叉编译环境,直接下载arm-elf- tools-20040427.sh,将它拷贝到根目录并增加其可执行权限,通过/arm-elf-tools-20040427.sh命令运行脚本,查看/usr/local/bin目录下有arm-elf开头的编译环境文件则证明交叉编译环境安装成功。
开发板硬件平台是基于ARM7TDMI RISC内核的LPC2210处理器,由于Bootloader软件是和底层的硬件是紧密相关的,所以在移植前要充分了解与移植有关的开发板硬件信息包括:系统硬件器件地址空间分配,初始化CPU流程、NOR FLASH,RAM驱动及擦写芯片时序、网络芯片驱动等。移植相关的硬件框图如图1所示:
硬件框图 图1[page]
U-Boot移植相关硬件地址空间分配为:FLASH 2MB 0x80000000~0x801FFFFF;PSRAM 8MB 0x81000000~0x817FFFFF;以太网控制器RTL8019 0x83400000~0x8340001F。由于U-Boot源码包中已经包含强大的网络技术的支持和丰富的硬件驱动代码,因此移植U-Boot到新的开发板我们上只需修改和硬件相关代码。
移植U-Boot工作就是添加开发板硬件相关文件、配置选项、然后配置编译。由于目前U-Boot并不支持LPC2210处理器,比较后我们选择与 LPC2210同基于ARM7TDMI-S架构的S3C44B0处理器及相关的B2开发板,以S3C44B0和B2开发板为基础来完成移植工作。
首先在cpu目录下建立lpc2210目录并在其下建立和处理器移植相关文件,为开发板取名为dx2210并在board文件夹下建立dx2210 子目录,在SHELL环境下输入命令cp –rf board/dave/B2 board/dx2210将B2开发板的内容复制到dx2210中,并注意修改文件中开发板名称;在include/configs文件夹中建立配置头文件dx2210.h,用命令cp include/configs/B2.h include/configs/dx2210.h将B2.h文件的内容复制到dx2210.h中以便与后面修改;修改顶层Makefile文件为开发板建立新的编译选项,由于U-Boot的源代码是通过GCC和Makefile组织编译的。在源代码顶层目录下的Makefile首先设置开发板的定义,然后递归地调用各级子目录下的Makefile文件,最后把编译过的程序链接成U-Boot可执行映像。因此利用vim在Makefie文件中添加配置命令:
dx2210_config : unconfig
@ ./mkconfig $(@ : _config=) arm lpc2210 dx2210 NULL
各项定义如下:
arm CPU架构(ARCH)
lpc2210 CPU的类型(CPU),其对应于cpu/lpc2210子目录
dx2210 开发板型号(BOARD), 其对应于board/dx2210子目录
NULL 开发板或硬件经销商(VENDER)
这样在执行配置命令make dx2210_config,通过./config脚本可生成include/config.mk的配置文件,硬件平台依赖文件的目录文件可以根据这些定义来确定。
5.2修改include/configs/dx2210.h文件
在include/configs/dx2210.h文件中包含了大部分的全局宏定义。主要修改的宏定义有:#define CONFIG_LPC2210 1 //CPU配置型号
#define CONFIG_LPC2210_CLOCK_SPEED 60 //最大CPU操作频率
#define CONFIG_DRIVER_RTL8019 1 //定义以太网控制器型号
#define RTL8019_BASE 0x83400000 //RTL8019的硬件地址
#define CONFIG_SERIAL 1 //串口设置
#define CFG_LOAD_ADDR 0x81008000 //kernel映像加载到RAM空间中的起始地址
此外还需要修改开发板的波特率,配置网络信息,FLASH ROM和RAM的容量大小、地址信息,操作时序等参数。
5.3 cpu/lpc2210目录下相关文件
该目录中包含了Makefile、config.mk、cpu.c、interrupts.c、serial.c、start.S几个文件。其中汇编文件start.S是整个Bootloader程序的入口,主要设置系统堆栈和工作方式为进入C程序奠定基础。根据RAM地址将中断向量表起始地址 0x0c000000修改为0x81000000,根据LPC2210的芯片手册完成设置CPU速度和时钟频率、为加载Stage2准备RAM空间并将 Stage2加载到RAM中执行、设置堆栈、看门狗、屏蔽所有中断部分的修改。这里注意的是TEXT_BASE变量是在board/dx2210 /config.mk文件中定义,它规定了主程序TEXT段在内存RAM中的起始地址,当u-boot从FLASH中启动后会把Stage2阶段的代码和数据重定位到这个地址开始的RAM中运行以提高速度。复制时要明确Stage2的可执行映像在固态存储设备的存放的起始地址和终止地址,一般来说给 Stage2部分在RAM地址顶端分配1MB的空间,因此经过计算得出TEXT_BASE=0x81700000;serial.c文件是串口设备的驱动代码,在调试部分主要依靠串口产生调试信息,串口波特率设置为115200bit/s;cpu.c文件初始化CPU、由于LPC2210中并没有指令 Cache和数据Cache,则应用源码提供的icache_disable(void)和dcache_disable(void)两个函数禁止这部分代码功能;interrupt.c文件设置系统的各种中断和异常,在Bootloader阶段应禁止中断的产生。[page]
5.4 board/dx2210开发板相关文件
在这个目录中主要包含dx2210.c、config.mk、flash.c、memsetup.S、u-boot.lds几个文件。在 dx2210.c文件中主要工作为初始化开发板,在文件中编写int board_init(void)函数定义各个复用I/O端口的信息、初始化RAM芯片等完成初始化工作。由于在u-boot代码中是用抽象成一种结构体来描述开发板硬件信息以便于移植工作,因此在文件中修改:
gd->bd->bi_arch_number=MACH_TYPE_LPC2210; //开发板架构ID号
gd->bd->bi_boot_params=0x81000100; //传递给ucinux内核的参数
gd->bd->bi_dram[0].start=PHYS_SDRAM_1;
gd->bd->bi_dram[0].size=PHYS_SDRAM_1_SIZE; //RAM内存配置
u-boot.lds是给Linker程序使用的配置文件,主要修改部分:
SECTIONS
{ .=0x80000000; //起始地址为0x80000000
.=ALIGN(4); //4字节对齐
.text :
{ cpu/LPC2210/start.o (.text)
*(.text) //text段的起始是start.S的text段
memsetup.S汇编文件主要是用来初始化RAM,在memsetup.S文件中配置开发板用到的存储器组,然后根据MT45W4MW16芯片手册驱动RAM;Flash芯片的驱动代码在flash.c文件中,由于开发板的Flash芯片SST39VF160与B2开发板芯片相同,直接复制后即可。
6.生成目标文件完成移植工作
移植工作完成后在SHELL环境下依次运行如下命令:make clean; make dx2210_config;make。成功编译后生成4个映像文件分别是:u-boot.hex文件: U-Boot映像原始的INTEL HEX格式文件;u-boot.map文件:U-Booty映像的符号表;u-boot.srec文件:U-Boot映像的S-Record格式文件;System.map文件: U-Boot映像的符号表。使用Flash烧写工具将u-boot.hex文件按照16进制格式下载到Nor Flash中,再将uclinux内核映像文件和根文件系统影响文件init.img烧写到Nor Flash的指定地址后,可以看到如图2所示的存储空间分布:
图2 存储空间映射
其中u-boot映像文件存放在Flash的起始地址0x80000000处,相当于程序的逻辑地址0x0处与硬件确定的复位向量相符合;u-boot在stage2部分将Flash中的内核映像和根文件系统映像复制到从0x81008000开始的2MB内存范围内,空出来的32K内存空间主要来存放uclinux内核的一些全局的数据结构,如启动参数和内核页表等信息。
7.结束语
本文首先阐述了Bootloader引导程序得基本原理,在介绍了开放源代码Bootloader程序U-Boot软件基础上,以LPC2210 ARM7处理器及其相关开发板为例,完成了U-Boot软件的移植工作。前期的启动引导程序的移植工作是嵌入式系统开发的重要环节,在此基础上可以更加深入的进行嵌入式系统开发。
本文作者创新点:本文在详细的分析U-Boot软件的基础上,针对U-Boot软件本身并不支持的ARM7 LPC2210,本文介绍了在U-Boot软件中添加相关代码的方法并完成移植的实例,为更加深入的后续嵌入式开发打下良好基础。
参考文献:
[1] The Denx U-Boot and Linux Guide. http://www.denx.de/twiki/bin/view/DULG/Manual.
[3] 周立功等.ARM嵌入式系统基础教程[M].北京航空航天大学出版社.2005.1; 129-154
[4] 孙琼.嵌入式Linux应用程序开发详解[M].人民邮电出版社.2006.7; 108-128
[5] 白伟平,包启亮.基于ARM的嵌入式Boot Loader浅析[J].微计算机信息,2006,4:99-100
上一篇:基于LPC2368嵌入式实验平台的构建
下一篇:基于ARM的嵌入式文件系统YAFFS的移植
推荐阅读最新更新时间:2024-03-16 12:56
设计资源 培训 开发板 精华推荐
- CGD和Qorvo将共同革新电机控制解决方案
- 是德科技 FieldFox 手持式分析仪配合 VDI 扩频模块,实现毫米波分析功能
- 贸泽开售可精确测量CO2水平的 英飞凌PASCO2V15 XENSIV PAS CO2 5V传感器
- 玩法进阶,浩亭让您的PCB板端连接达到新高度!
- 长城汽车研发新篇章:固态电池技术引领未来
- 纳芯微提供全场景GaN驱动IC解决方案
- 解读华为固态电池新专利,2030 叫板宁德时代?
- 让纯电/插混车抓狂?中企推全球首款-40℃可放电增混电池,不怕冷
- 智驾域控知多少:中低端车型加速上车,行泊一体方案占主体
- Foresight推出六款先进立体传感器套件 彻底改变工业和汽车3D感知