U-Boot在LPC2210上的移植分析

发布者:SereneSerenity最新更新时间:2012-03-22 来源: 微计算机信息 关键字:Bootloader  U-Boot  LPC2210 手机看文章 扫描二维码
随时随地手机看文章

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

关键字:Bootloader  U-Boot  LPC2210 引用地址:U-Boot在LPC2210上的移植分析

上一篇:基于LPC2368嵌入式实验平台的构建
下一篇:基于ARM的嵌入式文件系统YAFFS的移植

推荐阅读最新更新时间:2024-03-16 12:56

A FLASH Bootloader for PIC16 and PIC18 Devices--硬译(五)
Author: Ross M. Fosler and Rodger Richey Microchip Technology Inc. 译者: 逐影Linux WRITING CODE The bootloader operates as a separate entity, which means that an application can be developed with very little concern about what the bootloader is doing. This is as it should be; the bootloader should be dorman
[单片机]
A FLASH <font color='red'>Bootloader</font> for PIC16 and PIC18 Devices--硬译(五)
U-BOOT移植心得
最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。 参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。 U-BOOT的两个阶段启动过程:(2010.06经典版来说) 第一阶段:start.S的路径位于arch\\arm\\cpu\\arm920t\\这段汇编代码一般被称作第一阶段初始化代码。主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳
[单片机]
skyeye模拟u-boot在s3c2410上运行
前面成功的移植了u-boot(其实只能是说是编译成功,还谈不上是真正的移植,(*^__ ^*) ),下面开始在skyeye中来运行u-boot 在编译u-boot时,所作的修改如下 #ifdef CONFIG_AMD_LV400 #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */ #define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */ #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000) /* addr of environment */
[单片机]
STM8 bootloader(boot和app皆可使用中断)
STM8 In Application Programming IAP编写的三个要点: 分析STM8启动过程和C运行时环境建立 规划bootloader和application以及各自向量表在内存中的分布 如何重定位STM8中断向量表 思路: 要编写IAP程序首先需要解决的问题是程序在运行过程中,当发生异常时,如何保证程序正常的跳转到相应的异常服务函数(不论程序是运行在bootloader还是application)。 但STM8没有类似NVIC之类的中断控制器管理中断向量的地址,STM8的向量表固定在0x008000,因此在IAP中需要重定位向量表来实现(为了bootLoader和application都可以使用中断,因
[单片机]
STM8 <font color='red'>bootloader</font>(boot和app皆可使用中断)
移植u-boot-2010.09到S3C2440(五)—— 通过OPENJTAG、OPENOCD、ECLIPSE进行调试
OPENJTAG是买的百问网的,坑爹啊,180大洋,贵。这里说一句,OPENJTAG不是百问网的独家正版,这个东西是开源的,百问网说这东西是他自己的,说别人是盗版的,这个嘿嘿。。。。就算别人是根据他的做出来的,做人要谦虚啊。有句话说的好,要做就不要怕别人模仿。话说,好像国内很多个人都做过OPENJTAG。而且,他这个东西里面的插件都是别人的。给的网址都过期N年了。。。当然我自己是做不出来的。 它家的这个硬件性能,极其慢,必须等S3C2440运行一小段时间,稳定了,再连openocd才能连接的上硬件,还有好像是这个usb转串口做的也一般,输入存在丢失。一会的少一堆输入。 不得不说,现在最便宜的在linux下调试的硬件设备,我
[单片机]
U-boot 在 mini2440-S3C2440 上的移植(1)-开发环境搭建-交叉编译工具链的安装
编译U-boot给mini2440时,要编译出能在ARM平台上使用的可执行文件-bin,首先要在ubuntu 中安装交叉编译工具链,因为我使用的是友善之臂的开发板,所以我使用的已经制作好的工具链,当然也可以自己制作工具链:如基于GCC和glibc制作工具链,可以使用cross tools编译; 我使用的工具链的版本是arm-linux-gcc-4.3.3版本,下载地址:下载地址 1.在pc端下载好以后,将压缩包用xftp传输到Ubuntu;当然也可以用其他软件上传;上传后把它放在根目录下的/usr/local文件夹中新建一个arm文件夹,然后把压缩包复制到这个文件夹;注意先建好文件夹再上传,可以减少很多工作量; 一定要上传压缩包,
[单片机]
<font color='red'>U-boot</font> 在 mini2440-S3C2440 上的移植(1)-开发环境搭建-交叉编译工具链的安装
u-boot-2014.10移植(4)识别dm9000
在smdk2440.h里面注释掉CS8900相关的 #if 0 #define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */ #define CS8900_BASE 0x19000300 #define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */ #endif #if !defined(CONFIG_DRIVER_CS8900) #define CONFIG_DRIVER_DM9000 1 #def
[单片机]
从NAND闪存中启动U-BOOT的设计
引言 随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘无法得到广泛的应用。NAND闪存设备就是为了满足这种需求而迅速发展起来的。目前关于U-BOOT的移植解决方案主要面向的是微处理器中的NOR 闪存,如果能在微处理器上的NAND 闪存中实现U-BOOT的启动,则会给实际应用带来极大的方便。 U-BOOT简介 U-BOOT 支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统,主要用来开发嵌入式系统初始化代码bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved