SD卡加载和引导WinCE内核映像的实现

传统的嵌入式系统大部分使用NOR Flash或者NAND Flash等非易失闪存来存储数据和引导系统启动,但是由于读写Flash存储设备需要专用接口,使得传统方法有很多不便之处。本文提出了一种使用SD卡(Secure Digital Memory Card)加载和引导内核WinCE内核映像的方法,可以通过嵌入式系统的SD卡接口方便地实现内核的引导和更新。
  当一款基于WinCE操作系统的嵌入式设备投入使用后,如果在使用的过程中对设备产生了新的需求,把固件系统返回生产厂家进行升级是一件极其麻烦的事情,但是从厂家拷贝符合需求的新内核到SD卡中,使用SD卡更新WinCE系统却是一件轻而易举的事情。因此,SD卡加载和引导WinCE内核有着很好的应用前景。
1 系统架构
  本文采用的硬件核心芯片为Samsung公司的S3C6410处理器,S3C6410是一个16/32位RISC微处理器,含丰富的外设接口,支持高速SD/MMC卡,SD卡通过读卡器在PC机上进行读写。
  软件平台包括内核引导代码Bootloader、嵌入式操作系统软件开发平台。由于WinCE 6.0良好的用户界面和丰富的Windows API函数的支持,大量的车载终端设备和工控设备使用了Windows  CE作为内部的操作系统。平台开发工具为Platform Builder,在Visual Studio 2005中把Platform Builder作为一个插件集成在了套件中,可以实现WinCE系统设计、配置、构建、测试和调试等所需的所有功能。
2 IROM启动方式原理
  为了支持MCU从无法执行程序的非易失性存储设备(例如NAND Flash或者SD/MCC卡)执行启动程序,三星公司设计了一种“Stepping Stone”技术,也就是IROM启动方式。IROM方式的系统引导框图如图1所示。

图1 系统引导框图
2.1 BL1的加载
  从什么类型的设备拷贝BL1到Stepping Stone中,是系统通过引脚GPN[15:13]来判断的。若GPN[15:13]设置为111,就从SD/MMC(CH1)卡中拷贝程序BL1到地址Stepping Stone中。
  对于SD/MMC卡,SD卡的最后一个块(即block,每个block为512 B)要预留下来,倒数第二个block指定用于SD卡的标签(Signature),从[LAST18]到[LAST3]这16块一共8 KB,用于保存BL1代码;而对于SDHC卡,SD卡的最后1025个块(512.5 KB)要预留下来,倒数第1026个块指定用于SD卡的标签(Signature),从[LAST1042]到[LAST1027]这16块一共8 KB,用于保存BL1代码,代码分布结构如表1所列。
表1 SD/SDHC卡引导代码分布结构

  拷贝BL1程序代码的过程,是由S3C6410芯片中IROM的代码执行的,无法更改,因此要根据卡的种类把BL1代码放到卡的合适的位置。
2.2 BL2的加载
  BL1的代码功能首先执行启动文件start.s,start.s的主要任务是对系统进行初始化,为处理器建立良好的运行环境。start.s执行完毕后,跳转到main.c中执行。main.c的主要任务是执行函数CopyMovitoMem(HSMMC_CHANNEL,MOVI_BL2_POS,MOVI_BL2_BLKCNT,(uint*)BL2_BASE,MOVI_INIT_REQUIRED)指令。
  CopyMovitoMem是IROM启动后为用户提供使用的一个函数,函数的指针位于地址0x0C004008中。为了确定BL2代码的起始位置,IROM提供了一个记录SD/MMC卡总扇区的参数globalBlockSizeHide,存放在地址0x0C003FFC中。参数HSMMC_CHANNEL由SD卡插入哪个卡槽决定。参数MOVI_BL2_POS是说明要从SD/MMC中拷贝的第几个扇区开始,对于SD/MMC卡其值为globalBlockSizeHide18BL2,对于SDHC卡其值为globalBlockSizeHide1042BL2。参数MOVI_BL2_BLKCNT为拷贝扇区的数目,这是由BL2代码大小决定的,比如若BL2为512 KB,则提前定义#define  MOVI_BL2_BLKCNT  (0x80000/0x200)。参数BL2_BASE为拷贝到什么位置上,为内存中代码存储的地址。参数MOVI_INIT_REQUIRED决定是否对SD卡进行初始化操作,通常赋值为1。
  代码拷贝完成后,指针是如何跳到BL2中运行的呢?在main.c文件的最后,执行((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))(),处理器就跳到BL2中运行。
3 SD卡加载和引导WinCE内核的实现
3.1 BL2的加载的实现
  为了实现SD卡加载和引导内核映像的功能,首先要使WinCE 6.0的Bootloader支持SD卡启动。为了实现这一目的,把Bootloader分成两块:一块称为Stepldr,大小为8 KB,编译链接后产生的就是代码BL1;另一块称为EBOOT,除了通常的利用网口和串口下载更新内核的代码外,添加利用SD卡下载和更新内核代码,以及FAT32文件系统代码,构成新的EBOOT代码,编译链接后就是代码BL2。
  当执行完IROM代码后,系统指针跳转到BL1首地址。处理器首先执行startup.s代码,为CPU准备一个合适的运行环境。然后,跳转到main.c函数。在这里,主要调用CopyMovitoMem函数实现BL2下载并跳转到相应位置执行。所以main.c主函数为:
void main(void){
  CopyMovitoMem(1,globalBlockSizeHide18EBOOT_NB0_SIZE, EBOOT_NB0_SIZE, (unsigned int *)LOAD_ADDRESS_PHYSICAL, 1);
  ((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();
}
3.2 内核加载和更新的实现
  BL2是由EBOOT编译产生的,为了实现从SD卡加载和引导内核的功能,需要完成以下3步工作:
①  把SD卡驱动移植进EBOOT;
②  把FAT文件系统移植进EBOOT;
③  在EBOOT中下载内核镜像部分,添加通过SD卡下载镜像功能。
  SD卡驱动部分可参考WinCE 6.0的BSP包的关于SD卡驱动源码。在SDInterface.c文件中暴露SD卡读写函数接口供OEM函数OEMPreDownload调用。FAT文件系统使用网络上的开源DLL库,把库的函数接口放在fat.h文件中供SD卡操作函数调用[5]。为了实现SD卡下载镜像,首先在PC机上把相应内核的bin类型文件拷贝到SD卡中,当Bootloader执行到OEMPreDownload函数时,调用SDInterface.c对SD/MMC卡接口进行初始化,然后下载镜像到SDRAM中,实现WinCE内核的加载。接着就可以把Bootloader和NK存储到系统的Flash中以便下次使用,实现WinCE内核的更新[6]。
3.3 程序写入SD卡的方法
  为了识别SD卡,首先要把SD卡格式化成FAT32文件系统。有两种方法可以把代码写入SD卡。
  方法一:Samsung公司设计了在PC机运行的应用程序IROM_Fusing_Tool.exe和IROM_Fusing_Tool_SDHC.exe,分别适合于把代码写到SD/MMC卡和SDHC卡中,修改EBOOT下的makefile.c文件,可以把代码BL2和BL1编译成一个文件EBOOT_SD.nb0,然后通过上述工具就可以把EBOOT_SD.nb0写到SD卡的相应位置。
  方法二:使用WinHex软件直接读写SD卡数据,该软件可以方便地把相关代码写到SD卡的合适位置。
结语
  使用SD/MMC卡在Samsung公司的S3C6410处理器上加载和引导WinCE内核,已经成功实现。与传统的NAND Flash引导系统启动的方式相比,使用SD卡更加方便简单,为WinCE嵌入式系统加载和引导内核提供了一种很好的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值