转自:http://www.cnblogs.com/we-hjb/archive/2008/10/07/1305926.html
为一个新的硬件设备定制 WinCE6.0操作系统,一般需要完成以下几个主要步骤:
1. 针对特定的硬件设备创建板级支持包 (Board Support Package缩写为 BSP), BSP必须包括 BOOTLOADER、 OEM适配层 (OEM Adaptation Layer缩写为 OAL)和一些必要的驱动。
2. 利用创建的 BSP,定制一个系统设计 (OS Design)。即通过 VS2005创建一个 Platform Builder的工程。该工程可编译产生最终的运行时映像文件( Rum-time Image)。
3. 针对板上的外围设备创建相关驱动,并添加到 BSP中。
4. 通过创建子工程和 Catalog Items的方式,修改 OS Design。
5. 编译 OS Design,下载编译得到的运行时映像文件到目标设备。此时,可通过远程调试工具进行调试。
6. 在完成所有的调试工作之后,导出该运行时映像对应的 SDK(Software Development Kit),应用程序的开发人员可基于此 SDK编写该设备的应用程序。
可以看出,在整个 WinCE操作系统的移植过程中, BSP的移植是最基础也是最关键的一步。而创建 BSP的过程主要包括以下几个内容:
1. 创建 BOOTLOADER。 BOOTLOADER在开发的过程中用于下载操作系统映像文件。
2. 创建 OAL。 OAL最终被链接到内核映像文件,它主要完成硬件的初始化和管理。
3. 创建设备驱动。设备驱动是板上外围设备的软件支持。
4. 修改运行时映像的配置文件。配置文件主要包括 BIB、 REG等文件。
BOOTLOADER的主要作用是将操作系统运行时映像加载到内存,并跳转到 OS的启动程序处。它的这一作用跟前一篇介绍的 NBOOT的作用完全一致。 BOOTLOADER获取运行时映像(一般对应的文件名为 NK)一般有两种方法。它可以通过有线连接的方式象网络 (Ethernet)、 USB或串口从外部下载 NK。它也可以从本地的存储器 (Flash、 Hard Disk)中加载 NK。通常, BOOTLOADER通过 Ethernet下载操作系统映像故将其称为 EBOOT。在开发的过程中使用 EBOOT,可以提高开发效率。通过使用 EBOOT,你可以很快速的下载 NK到目标设备中。而利用 Flash编程工具或者是通过 JTAG下载则很慢。在一些产品最终发布时, EBOOT是可以去掉的,但也有一些则必须包括 BOOTLOADER,像 X86的平台就是如此。
至此,我们已经了解了 EBOOT的主要功能,为了实现这些功能, EBOOT必须完成以下工作:
1. 初始化 MCU。包括初始化 MCU的相关寄存器、中断、看门狗、系统时钟、内存和 MMU。前面几项跟 NBOOT基本一致,但这里增加了对 MMU的初始化。
2. 在完成所有的初始化工作之后,调用 BootloaderMain()。这个函数的定义在 WinCE6.0中对应的文件是 C:"WINCE600"PLATFORM"COMMON"SRC"COMMON"BOOT"BLCOMMON"blcommon.c
3. BootloaderMain()主要依次调用以下几个函数, OEMDebugInit()、 OEMPlatformInit()、 OEMPreDownload()、 OEMLaunch(),而这些函数必须由 EBOOT的代码来实现。
4. 最终跳转到 OAL.exe的 StartUp处,进而启动 WinCE操作系统。
整个流程如下图所示:
EBOOT的代码可参考 C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT目录。这里针对S3C2410的 EBOOT做几点说明。前一篇介绍NBOOT加载EBOOT的方法时提到,NBOOT必须将EBOOT放在内存中指定的位置,这个位置是由EBOOT的来 决定的。具体的,在EBOOT中的体现是boot.bib里的内存配置,如下图所示。
NBOOT加载 EBOOT到内存的地址必须与此地址对应。由于在 NBOOT中没有使用 MMU,所以 NBOOT使用的实际地址应该为 0x30021000,否则系统将不能正常启动。第二点,如果没有采用 NBOOT加载 EBOOT的方法,而是将 EBOOT直接存储在 NOR Flash中,此时必须在 EBOOT的代码中实现自加载的过程,即将 NOR Flash中的 EBOOT全部加载到 RAM中,并执行,实现代码如下:
; ------------------------------------------------------------------------------
; Copy boot loader to memory
ands r9, pc, # 0xFF000000 ; see if we are in flash or in ram
bne % f20 ; go ahead if we are already in ram
; This is the loop that perform copying.
ldr r0, = 0x21000 ; offset into the RAM
add r0, r0, #PHYBASE ; add physical base
mov r1, r0 ; (r1) copy destination
ldr r2, = 0x0 ; (r2) flash started at physical address 0
ldr r3, = 0x10000 ; counter ( 0x40000 / 4 )
10 ldr r4, [r2], # 4
str r4, [r1], # 4
subs r3, r3, # 1
bne % b10
; Restart from the RAM position after copying.
mov pc, r0
nop
nop
nop
; Shouldn ' t get here.
b .