基于PXA272的Bootloader的设计与实现

发布者:cocolang最新更新时间:2012-09-17 来源: 微计算机信息 关键字:PXA272  Bootloader  SD卡 手机看文章 扫描二维码
随时随地手机看文章
1  前言
    
PC机中的引导程序一般由BIOS和位于MBR的OS  Bootloader(例如LILO或者GRUB)一起组成。然而在嵌入式系统中通常没有像BIOS那样的固件程序(有的嵌入式CPU有),因此整个系统的加载启动任务就完全由Bootloader来完成。但是随着嵌入式系统的发展,Bootloader已经逐渐在基本功能的基础上进行了扩展,Bootloader可以更多地增加对具体系统的板级支持,即增加一些硬件模块功能上的使用支持,以方便开发人员进行开发和调试。编写BootLoader是开发WinCE系统第一步,也是关键的一步。只有得到一个稳定工作的Loader程序,才能够更进一步开发WinCE的BSP,直至最后整个系统的成功。

2  硬件平台结构

    我们的硬件平台采用PXA 272 作为处理器,工作频率为512M HZ,内部集成了64 M bytes NOR Flash。Intel PXA27X处理器是Intel公司推出的32位,基于Xscale架构的高性能的嵌入式芯片。【2】硬件平台结构中主要还包括了如下的主要器件:128 M SDRAM、AC97 codec、 LCD 控制器、IrDa芯片、蓝牙UART、USB控制器。另外还集成了3.5吋、240×320 QVGA的TFT-LCD 触摸屏、PCMCIA、SD/MMC等外设接口,WLAN模块。

    Intel的PXA 27X内部支持SD Host的控制模块,有SD Host控制寄存器和可以用于SD Host控制器的IO引脚,可用编程的方法对其功能进行选择;但对于SD卡的检测,写保护和插槽的电源使能

    等功能没有专门的引脚。在本文实现中,对于卡检测、电源引脚,通过GPIO扩展来实现。和SD卡硬件相关的部分引脚定义如表1所示:【3】【4】

                 表1 PXA 272部分GPIO引脚功能定义

信号

方向

Intel 272功能引脚

说明

SD_nPWREN

输入

SDPWEN/GPB2

SD插槽电源使能信号线

SD_DATA3

输入/输出

SDDATA0/GPF5

4bit模式:DATA3

SD_DATA2

输入/输出

SDDATA0/GPF4

4bit模式:DATA2

SD_DATA1

输入/输出

SDDATA0/GPE5

4bit模式:DATA1

SD_DATA0

输入/输出

SDDATA0/GPG2

4bit模式:DATA0

SD_CMD

输入/输出

SDCMD/GPG1

SD命令线

SD_CLK

输入

SDCLK/GPF3

SDIO/SD卡时钟线

SD_nCD

输出

EINT23/GPF1

SD卡检测引脚

SD_WP

输出

GPC3

SD卡写保护引脚

 
3  Bootloader的设计和实现

    一个嵌入式WinCE系统从软件的角度看通常可以分为两部分:Bootloader 和 Wince嵌入式系统。从Bootloader和Wince嵌入式系统的关系看,Bootloader包含两种不同的操作模式:“本地启动”模式和“下载启动”模式。【5】在本地启动模式下Bootloader从Flash上将Wince操作系统加载到RAM中运行。在下载启动模式下,目标机上的Bootloader将通过串口或者网络连接或者USB等从主机下载操作系统文件,也可以直接从SD/MMC卡、CF卡上加载操作系统镜像文件。在下载启动模式下,Bootloader通过串口给用户提供简单的命令行接口。

3.1 Bootloader的流程

    当系统上电后,ARM CPU会从物理地址零处开始执行第一条指令的执行,通常会在该地址处放置一条跳转指令。在我们的硬件平台中物理地址零是64M Flash的物理起始地址。这里值得需要说明的是64M Flash 是固化在Intel PXA 272中的。所以我们的Bootloader烧入也必须从Flash的物理地址零开始。Bootloader二进制文件的最前面的4个字节就是一条跳转指令。

    接着系统会跳转到一段用ARM汇编编写的代码中去执行。其作用是完成系统启动所必须的最小配置,例如配置cpu 的工作频率,配置GPIO,配置时钟等。然后为我们处理器的工作模式设置栈指针。

    接着把Bootloader 从Flash搬运到SDRAM中,配置MMU,创建页表,使能MMU,然后把自己后半部重定位到SDRAM中去执行。在后半部的执行中会根据用户做的动作(是否按住一个按钮)来判断是要本地启动还是下载启动。具体的流程图如图1所示。

    当用户选择特定下载启动方式后,就进入具体的下载流程。首先需要对用户选定的介质的硬件进行必要的初始化。之前做的一些硬件的初始化是不够的,因为没必要在前面进行全面的硬件初始化,现在要具体使用了就需要进行具体的配置。

3.2 软件实现的关键

    Bootloader是依赖于硬件而实现的,特别是在嵌入式系统中。不同的体系结构需求的Bootloader是不同的;除了体系结构,Bootloader还依赖于具体的嵌入式板级设备的配置。所以根据不同的板级配置需要修改相应的Bootloader。【5】我们使用的bootloader是Microsoft提供的和Wince配套的Eboot。下面几点是在我们的硬件平台上修改Eboot的关键。

3.2.1  配置内存映射表

    WinCE嵌入式系统通过定义OEMAddressTable来定义虚拟内存到物理内存的映射表.这个表在我们的实现中是bootloader和WinCE系统公用的。【5】当然这不是强制性的.我们需要根据硬件平台的不同定制自己的映射表。在我们的设计中,这个表把4GB的物理空间映射到512M的内核虚拟空间。

    表中的每一项由虚拟地址,物理地址,和映射的M数组成。其格式如下所示

OEMAddressTable

DCD SDRAM_BASE_C_VIRTUAL,      SDRAM_BASE_PHYSICAL,       64

DCD SDRAM1_BASE_C_VIRTUAL,     SDRAM1_BASE_PHYSICAL,      64   

DCD IM_STORAGE_BASE_C_VIRTUAL, IM_STORAGE_BASE_PHYSICAL,  1

.....

DCD 0x00000000,                     0x00000000,           0 

    第一项和第二项分别使64M的虚拟地址映射到64M物理地址,因为我们采用两条64M的SDRAM。第二项使1M的内部内存的虚拟地址映射到物理地址,因为我们使用1M大小的内部存储。最后一项必须是零,因为建立页表的时候程序通过它来判断是否结束映射过程。在配置MMU的时候会使用这个表来完成虚拟地址到物理地址的映射的页表的建立。[page]

3.2.2    为中断模式设置分配堆栈

    我们知道ARM的堆栈是分模式的,在程序中要为每种要用到的模式分配堆栈。如果没有为某种模式分配堆栈,那么在进入这种模式之后系统不能继续运行了。系统首先运行在SVC模式。在下载模式中,我们要通过USB ,网络,SD/MMC和CF接口等下载文件,而这些都要用到中断。所以我们要为中断模式分配堆栈,其代码片段如下:

ldr      r2, =(Mode_IRQ :OR: NoIntsMask)                  ;中断模式

msr      cpsr_c,r2

ldr sp,=(EBOOT_IRQ_STACK_TOP+SDRAM_VIR_C_EBOOT_PARTITION) ;分配堆栈

    在为中断模式分配堆栈之后,还要进行堆栈切换,使程序重新回到SVC模式运行。

3.2.3    通过SD卡加载系统镜像的实现

    当用户选取SD卡作为下载系统镜像的目标后,bootloader就进入对SD处理的流程。首先通过SD卡检测引脚判断是否有SD卡插在插槽。如果有就要对SD控制的硬件进行初始化,例如SD插槽电源使能,设置时钟,设置功能GPIO等。

    其中需要说明的是Intel PXA 272的时钟管理比较复杂,它有两个锁相环路PLL:外围设备锁相环路,核心锁相环路。其中外围设备锁相环路为外围总线和USBC,I2S接口,SD接口等外围设备提供时钟。在时钟控管理寄存器里,寄存器CKEN用来控制如USB,UART,SD等接口模块的时钟使能。【1】

    接着是对SD卡协议栈的软件实现.为了减少Bootloader中SD Host驱动的复杂性,能够易于调试,实现了总线驱动模块,客户端驱动模块和FAT16文件系统模块。所以在我们的实现中对SD卡上的文件系统要有一定的限制,必须是格式化成FAT16的文件系统才能被我们的bootloader识别。当然在具体的实现中我们还可以使用另外的文件系统格式。其协议栈结构如图2所示:

3.3  实验结果

    我们使用一个22.7M的WinCE镜像,在Bootloader中分别用USB,SD卡,TFTP,本地四种方式使用进行加载启动测试,分别测试了50次。因为在Bootloader中SD Host的实现没有使用DMA方式,为了进行性能比较,我们又调用WinCE系统下使用DMA的SD Host驱动加载同样大小的文件进行了50次测试。表2是我们测试的结果。表中数据为平均值。
                           表2  测试结果

 

SD卡

USB

TFTP

使用DMA的SD

本地启动

加载时间(秒)

51

96

53

28

3

    从表中数据可知,本地启动是最快的,这是不容置疑的。其次是通过SD卡启动。另外值得说明的是,通过USB和TFTP下载启动在都需要的在通信的另一端软件的支持和用户的介入操作。而SD卡的数据通信传输完全由硬件实现,这也是SD卡加载相对比较快的主要原因。而且使用TFTP下载还需要进行相对复杂的配置。而在使用SD的加载中Bootloader会自动去搜寻系统镜像,自动下载。这对用户的使用来说是方便快捷的。

    另外从使用DMA的SD 驱动下载文件和Bootloader中的实现做比较,可以看出使用DMA后大大提高了使用SD下载的性能。当然我们也可以在Bootloader中使用DMA方式来实现以提高性能。但这样一来会大大增加Bootloader的复杂性。我们在Bootloader中实现使用SD做加载启动的主要目的是方便开发和调试SD硬件模块,而且实际使用中绝大部分会是本地启动。我们的实现中目的已经达到,所以可以不考虑这些。

4  结束语

     Bootloader是操作系统和硬件的枢纽,相对于操作系统内核来说它是一个硬件抽象层。嵌入式领域中操作系统的移植关键在于Bootloader的移植和操作系统内核硬件相关部分移植。所设计并实现的基于Intel PXA 272嵌入式处理器的从SD卡加载并启动WinCE系统的Bootloader能提高WinCE操作系统移植的稳定性并加快WinCE操作系统移植的周期。

     本文作者创新点: 在基于Intel PXA 272 处理器的bootloader中实现了SD卡的协议栈,并实现了从SD卡加载并启动WinCE嵌入式系统镜像的功能.

参考文献:
【1】杜春雷.ARM体系结构与编程.北京:清华大学出版社 ,2004-12
【2】Intel PXA 27X Processor Family Developer\'s Manual[M]. Intel, 2004-04
【3】Jörg Henkel, Xiaobo Sharon Hu, Shuvra S. Bhattacharyya. Taking on the Embedded System Design Challenge[J], IEEE Computer (4): 35-37 (2003)【4】SD-Memory Card Specifications /Part1 Physical Layer Specification Version 1.01[M]. SD Group, 2001
【5】陈向群王雷 马洪兵.Windows.CE.NET 系统分析及实验教程.北京:机械工业出版社,2003
【6】万永波 张根宝 田泽 杨峰. 基于ARM的嵌入式系统Bootloader启动流程分析.微计算机信息. 2005年第11-2期.第一页

关键字:PXA272  Bootloader  SD卡 引用地址:基于PXA272的Bootloader的设计与实现

上一篇:MPEG一4编码器在Intel PXA27X平台上的实现
下一篇:Cortex-M3的直流无刷电机控制系统的设计

推荐阅读最新更新时间:2024-03-16 13:08

BootLoader启动引导方式分析(sd卡引导)
引言   BootLoader通常称为“系统的引导加载程序”,是系统加电或复位后执行的第一段程序代码 。这段程序的主要任务是,实现硬件设备初 始化并建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。通 常,BootLoader包含两种不同的加载和启动引导方式,即启动加载方式和下载方式。   ① 启动加载(boot loading)方式。这种引导方式也称为“自主(autonomous)引导方式”,也即BootLoader从目标机的某个固态存储设备上将操作系统 加载到RAM中并引导运行,整个过程并没有用户的介入。这种引导方式是BootLoader的正常工作模式下普
[单片机]
<font color='red'>BootLoader</font>启动引导方式分析(<font color='red'>sd卡</font>引导)
ARM下启动linux条件-bootloader
为了启动在ARM板上启动linux系统,需要在启动kernel之前运行一小段叫bootloader的程序,bootloader初始化各种设备后调用kernel,并向其传递一些参数; 言之,bootloader必须完成以下作用: (1) 设置并初始化内存; (2) 初始化一个串口; (3) 判断平台设备类型; (4) 设置启动参数列表;//标记列表(tagged list) (5) 启动内核; 1 . 设置并初始话内存 bootloader用于寻找并初始化kernel启动后在RAM内存中存储的易丢失性数据,按某个机器特定方式执行(或者用基本的算法自动加载数据和计算RA
[单片机]
mc9s08dz60添加BootLoader实现CANboot下载更新功能
为了以后项目升级方便的需要,在原始程序添加CanBoot下载功能; 1、 把Bootloader安排在高地址区间 (比如0xEE00~0xFFAF),然后固化NVC寄存器的值,将这块Flash区域保护起来; 2、中断向量的搬移,将原来0xFFC0所对应的中断向量搬移到0xEDC0; Bootloader的代码无非就是启动、查找用户程序入口,跳转至用户程序,从用户程序跳转至bootloader,与上位机通信(UART或者CAN),擦除Flash,写入Flash等功能; 具体操作就是修改两部分; 1、修改Project.prm文件,重新划分分区。我划分的分区如下所示: SEGMENTS /* Here all RAM/RO
[单片机]
基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级
最近一直利用业余时间写自己的“基于AVR-BootLoader”,启发是由于一次在ourAVR论坛看到了绍子阳的bootloader,联想到公司在用AVR MCU,但每次升级程序都要花费很大的力气车马劳顿的跑到工程现场,而且很多机器还安装在国外,为了升级一次程序发费了很多的人力物力财力,加上公司的机器目前大部分都配有远程监控系统,所以本人决定写一个具有自有产权的“AVR-BootLoader”。 特别说明:本“AVR-BootLoad”软件代码属上海霜蝉版权所有,在此贡献发布,仅限于个人免费使用不得用于商业用途,本人也不保证代码的严谨性,如在升级中出现任何问题与本人无关,本人已测试过Atmega64A与Atmega12
[单片机]
基于AVR-<font color='red'>BootLoader</font>,通过霜蝉远程串口可实现单片机的远程升级
S3C6410裸机SD卡驱动(SDIO模式)
花了几天写了SD卡裸机驱动,现在还不完善,只支持4G以内的卡,以后再加上;现在经过修改可以写入数据了,亲测没问题. S3C6410_SDIO.C #include s3c6410_system.h #include s3c6410_sdio.h /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //配置 //块大小寄存器(0通道)BLKSIZE0 #define BLKSIZE0_BLKSIZE
[单片机]
bootloader对uClinux的S3C44B0移植
S3C44B0是Samsung公司推出的一款为手持设备或其他通用设备开发的32位处理器,它基于ARM7TDMI核,没有内存管理单元(MMU)。在采用无MMU的微处理器的嵌入式系统中广泛采用的就是uClinux系统,作为linux的衍生系统,其具有支持多任务、内核精简、高效稳定和源代码开放的优点。系统移植的基本过程包括:获取较新版本的linux-2.6.9内核源码,根据目标平台对源码中与硬件平台相关部分进行修改,添加必要的外设驱动程序,对系统进行针对目标平台的交叉编译,生成的内核映像文件的下载调试等。 硬件环境介绍 硬件平台以S3C44B0为核心,采用的外部晶振频率为6MHz,内核主频最高可达到66MHZ,平台以2MB的AMD2
[单片机]
<font color='red'>bootloader</font>对uClinux的S3C44B0移植
一种新颖Bootloader设计方案
本文基于Microchip公司的MPLAB软件开发环境设计了一种新颖的 Bootloader ,并配套编写了PC机端上位机界面程序。其特点是控制灵活,使用便利,系统升级安全可靠。   1 Bootloader的实现   1.1 Bootloader的操作模式   Bootloader在单片机上电/复位后、用户程序之前先运行,运行后判断当前是否需要进入升级状态。如果不需要升级,就直接运行原有的程序;如果需要升级,首先擦除旧的程序,然后从串口接收用户程序,同时写入Flash中。Bootloader有2种操作模式:   ①启动加载模式,也称为“内核启动”模式。即Bootloader从目标机上的某个固态存储设备上将操作系统加载
[单片机]
一种新颖<font color='red'>Bootloader</font>设计方案
Maxim推出高速USB至SD卡桥接器
  日前,Maxim推出高速USB至SD卡桥接器MAX14502,可将便携式电子设备中的SD卡读/写速度提升40倍。这款IC采用集成的处理器进行数据传输,无需以往USB应用中的低速处理器。MAX14502还省去了费时且复杂的软件驱动开发工作,使设计者能够很容易地为其设备添加高速USB功能。该器件非常适合蜂窝电话、PDA、MP3播放器、DSC及GPS设备等消费类电子产品。   MAX14502支持SDHC,可使用一个或两个SD卡端口进行工作。该款IC仅需通过单个GPIO或I²C接口控制(两端口选项),节省了宝贵的I/O资源。   器件工作在-40°C至+85°C扩展级温度范围,提供无铅封装。单端口版本提供5mm x 5m
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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