基于PXA272的Bootloader的设计与实现
内核虚拟空间。
表中的每一项由虚拟地址,物理地址,和映射的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的时候会使用这个表来完成虚拟地址到物理地址的映射的页表的建立。
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等接口模块的时钟使能。
接着是对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嵌入式系统镜像的功能.
参考文献:
杜春雷.ARM体系结构与编程.北京:清华大学出版社,2004-12
Intel PXA 27X Processor Family Developer's Manual[M]. Intel, 2004-04
J?rg Henkel, Xiaobo Sharon Hu, Shuvra S. Bhattacharyya. Taking on the Embedded System Design Challenge[J], IEEE Computer (4): 35-37 (2003)SD-Memory Card Specifications /Part1 Physical Layer Specification Version 1.01[M]. SD Group, 2001
陈向群王雷 马洪兵.Windows.CE.NET 系统分析及实验教程.北京:机械工业出版社,2003
万永波 张根宝 田泽 杨峰. 基于ARM的嵌入式系统Bootloader启动流程分析.微计算机信息. 2005年第11-2期.第一页
PXA272 Bootloader SD卡 相关文章:
- PXA272启动引导程序的实现和功能扩展(04-16)
- WinCE系统下BootLoader的开发(04-10)
- 嵌入式linux启动信息完全注释(04-24)
- PIC18单片机的一种新颖的Bootloader设计(03-28)
- 基于WinCE的嵌入式图像采集系统设计(04-20)
- BLOB启动流程分析及引导程序可移植性研究(07-25)