




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Windows CE BootLoader的软件框架和支持库第2章Windows CE BootLoader的软件框架和支持库2.1以Eboot为实例学习Windows CE BootLoader的软件框架嵌入式系统由于其硬件设计的特殊性,使得事先为嵌入式系统设计开发完全符合目标平台硬件特性的可直接运行的嵌入式软件系统成为不可能,技术和经济实力强如微软也无法完全做到。但是Windows CE是一款商业的嵌入式操作系统软件,它的开发厂商为自己产品的销路考虑,要尽最大限度地让客户满意,首要的就是要减轻用户在基于Windows CE的软件开发时的工作量。其原则就是即使微软不能做所有的事情,那也要做尽可能多的事情。微软为Windows CE的BootLoader精心设计了一个与具体硬件平台无关的软件框架,但是这个软件框架不能直接编译运行,它需要调用一些操作嵌入式硬件的函数才能实现自身的功能。这些函数与目标平台的嵌入式硬件设计直接相关,它们的函数名和所需完成的功能由微软明确地定义,由具体的BootLoader的开发者负责实现。基于这种指导思想和设计准则,微软将Windows CE的BootLoader划分成几个相对独立的软件模块。其中大部分由微软负责实现,小部分与目标嵌入式硬件设计直接相关的留待OEM用户开发实现。以Eboot为例,BootLoader的软件代码可以被划分成以下5个部分。(1)BLCOMMON。(2)OEM代码。(3)Eboot特定代码。(4)存储管理代码。(5)EDBG驱动程序。图2-1显示了这5个部分之间的相互调用关系,上层模块调用下层模块的功能,下层模块向上提供服务。图2-1Boot Loader软件代码各部分之间的关系表2-1列出了上述各部分的存储位置和相关介绍。表2-1Boot Loader软件代码与部分的存储位置及相关介绍模块名功能介绍OEM用户可否修改源代码的目录位置BLCommon实现通用的Boot Loader框架否%_WINCEROOT%PublicCommonOakDriversEthdbgBlcommonOEM代码需要用户实现的代码必须Eboot以太网操作相关的函数否%_WINCEROOT%PublicCommonOakDriversEthdbgEboot存储管理存储分区管理和Flash驱动可能%_WINCEROOT%PublicCommonOakDriversEthdbgBootpartEDBG驱动程序EBoot使用的驱动程序可能%_WINCEROOT%PublicCommonOakDriversEthdbg在Windows CE 6.0版本中,上述的BLCommon、Eboot、存储管理和EDBG驱动程序4部分的源代码都是微软通过Platform Builder开发工具向OEM用户全部开放的,理论上用户可以根据需要修改。但是BLCOMMON和Eboot特定代码这两部分是与具体硬件设计完全无关的,而且是经过了微软精心设计与优化的,用户的改动反而会造成不可预知的问题,所以不建议用户修改,只需调用其功能即可。BLCOMMON这BootLoader Common的合体缩写,这是一个最重要的BootLoader支持库,它的源代码存放在%_WINCEROOT%PUBLICCOMMONOAKDRIVERSETHDBGBLCOM- MON目录下,主要源文件是blcommon.c,对应的静态库文件是blcommon.lib。blcommon.c源文件的内容相当简单,主要是一个BootloaderMain函数和几个被BootloaderMain函数调用的功能函数。在下一章讲述的BootLoader实例中将会看到BLCOMMON在BootLoader软件执行流程中的具体位置和工作原理。BLCOMMON包含了BootLoader最普遍实现的并且几乎不与硬件相关的工作,包括:解析下载的操作系统镜像文件、对下载的镜像数据执行校验、跟踪下载进度等。微软将这部分内容抽取出来精心设计,一方面提供标准的函数接口(其实只是一个唯一的BootloaderMain函数)供OEM用户开发BootLoader使用,另一方面将其需要的硬件操作功能定义出标准的函数接口(函数名和功能定义)由用户负责实现,由这些称为OEM函数的功能函数负责操作目标嵌入式硬件并且向BLCOMMON库提供所需的功能。与此同时,用户在实现这些OEM函数时又可以并且推荐调用由微软提供的Eboot支持库和EDBG驱动程序的功能,这种设计恰好与操作系统中间层和设备驱动程序的关系相似。Eboot也是一个BootLoader支持库,它的代码也与具体硬件平台无关,但仅适用于Eboot类型的BootLoader,即使用以太网端口从开发计算机下载镜像的情况。Eboot库代码的普遍通用性高于存储管理代码和EDBG驱动程序代码,但低于BLCOMMON库,BLCOMMON支持库适用于所有类型的Windows CE BootLoader。Eboot库的源代码位于%_WINCEROOT% PublicCommonOakDriversEthdbgEboot目录下,它对应的静态库文件是eboot.lib。Eboot支持库主要实现了DHCP、TFTP、UDP等网络协议供BootLoader下载镜像使用。嵌入式系统中有两类外设是最经常被BootLoader使用到的:以太网端口和Flash存储器。前者是Eboot类型的BootLoader所必不可少的,用于下载操作系统或者BootLoader自身的镜像文件;后者用于存储BootLoader和下载所得的操作系统镜像。微软对这两类外设抽象出了统一的驱动代码接口,它们也被称作驱动程序,分别命名为EthDbg驱动和FMD驱动,并且提供了带有典型性的常用类型的以太网接口和Flash存储设备的驱动程序。需要注意的是,在BootLoader中使用的EthDbg和FMD驱动不同于Windows CE操作系统的设备驱动程序,其接口和功能定义是不同的。虽然微软提供了一些常用类型的以太网接口和Flash存储设备的EthDbg驱动和FMD驱动程序,但是不可能包含所有硬件类型的这两种驱动,所以OEM用户在必要时需要开发实现符合自己需求的这两种驱动程序。图2-1所示的BootPart支持库在本书用作示例的DeviceEmulator的BootLoader中没有使用,因为DeviceEmulator的虚拟硬件平台使用大容量的Nor Flash存储器作为唯一的非可易失的存储设备,而Nor型的Flash对CPU来说是可以像RAM内存一样直接寻址访问的存储设备。BootPart支持库向BootLoader提供了包括存储分区、底层读写和擦除、低级格式化等对存储设备的直接底层操作的功能,它使得BootLoader不再需要直接操作底层存储设备的硬件而只需调用这个支持库的接口函数,有利于提高代码的可复用性和可维护性。2.2BLCOMMON支持库微软对Windows CE的BootLoader所建议实现的功能和特性中,其中之一就是要求开发BootLoader的OEM用户应该尽可能地利用BootLoader支持库中的函数实现。这不仅是因为使用这些支持库可以大大减小BootLoader的开发工作量,缩短开发时间,也是为了保证不同的人员所开发的Windows CE BootLoader能够最大限度地保持一致,为以后的软件维护和管理做好准备。BLCOMMON是最重要的BootLoader支持库,它适用于所有类型的Windows CE BootLoader。BLCOMMON库所提供的功能包括:复制BootLoader自身到RAM以加速运行、解析下载的.bin格式的镜像文件内容、对镜像数据执行校验、跟踪下载的进度等。BLCOMMON支持库对开发者提供的向上接口函数或者称之为入口函数只有一个BootloaderMain,一般情况下BootLoader在系统上电运行或者复位时使用StartUp函数完成初步的硬件初始化之后即跳转到这个函数执行。BootloaderMain的函数定义既没有参数也没有返回值。2.3Eboot支持库Eboot支持库的普遍适用性不及BLCOMMON库,它仅适用于使用以太网接口下载镜像的Eboot类型的Windows CE BootLoader。不过这并不有损Eboot库的实用价值,毕竟Eboot是最常见的、使用最广泛的BootLoader类型。Eboot支持库主要是向BootLoader的开发者提供了DHCP、TFTP、UDP等网络协议的功能函数调用。Eboot支持库提供给BootLoader开发者使用的接口函数主要是以下3个,现将它们的函数名及功能定义为列表2-2。表2-2Eboot主要接口函数介绍函数名功能定义EbootInitEtherTransport本函数负责初始化供下载镜像使用的以太网传输端点。这里的初始化不同于Startup函数和OEMPlatformInit函数的硬件初始化,本函数主要是初始化所需的以太网协议,比如,通过DHCP协议获取一个动态IP地址,初始化与开发计算机上的Platform Builder工具之间的TFTP协议等续表函数名功能定义EbootWaitForHostConnect本函数的功能是与开发计算机上的Platform Builder软件进行通话以获取一个EDBG_OS_CONFIG_DATA结构体数据。这个结构体中包含的数据包括Platform Builder的用户设置、开发计算机的IP地址及端口号等信息,它们主要供Windows CE操作系统而不是BootLoader使用EbootEtherReadData本函数从以太网端口读取指定数量的字节数据到调用者指定的内存缓冲区中Eboot类型的BootLoader中通过以太网端口下载镜像的程序实现可以用最简洁的代码表达如下,由此可见Eboot支持库函数的重要地位和使用的方法。if (!EbootInitEtherTransport (.) while (1); / spin forever/ main loop of downloadWhile (EbootEtherReadData (.) / process the data ProcessData (.);/ download complete, wait for host to connectpCfgData = EbootWaitForHostConnect (.);库函数EbootInitEtherTransport的使用稍有些复杂,它的函数原型在头文件%_WINCEROOT%PUBLIC COMMONOAKINC halether.h中定义如下:BOOL EbootInitEtherTransport (EDBG_ADDR *pEdbgAddr, LPDWORD pdwSubnetMask, BOOL *pfJumpImg, / will be set to TRUE if eshell asked us to jump to existing image DWORD *pdwDHCPLeaseTime, / this parameter is overloaded. Pass NULL to indicate static IP UCHAR VersionMajor, UCHAR VersionMinor, char *szPlatformString, char *szDeviceName, UCHAR CPUId, DWORD dwBootFlags);对以上各参数的含义描述见表2-3。EbootInitEtherTransport函数的返回值为BOOL型,返回TRUE表示函数执行成功,FALSE代表执行失败。表2-3EbootInitEtherTransport函数参数函数参数描述pEdbgAddr该参数是指向一个EDBG_ADDR结构体数据的指针,这个结构体中包含有目标设备的IP地址、MAC地址和UDP端口号等数据。如果BootLoader使用静态IP地址,则这是一个输入参数;如果BootLoader通过DHCP协议获取动态IP地址,则它将输出获取所得的动态IP地址pdwSubnetMask该参数是目标设备IP地址的子网掩码。如果BootLoader使用静态IP地址,则这是一个输入参数;如果BootLoader通过DHCP协议获取动态IP地址,则它将输出获取所得的动态IP地址的子网掩码pfJumpImg这是一个BOOL型的输出参数,它的输出数值来源于用户对Platform Builder的选项设置,它决定了OEMPreDownload函数的返回值。如果pfJumpImg参数输出TRUE,则OEMPreDownload函数返回BL_JUMP,表示BootLoader加载存储在本地的操作系统镜像并且跳转至运行;如果pfJumpImg参数输出FALSE,则OEMPreDownload函数返回BL_DOWNLOAD,表示BootLoader将从网络下载操作系统镜像并且跳转至运行。如果OEMPreDownload函数执行失败,则返回BL_ERRORpdwDHCPLeaseTime如果BootLoader通过DHCP协议获取动态IP地址,则该指针参数所指向的内存区域用于输出动态IP地址的出租(Lease)时间;如果BootLoader使用静态的IP地址,则该参数被赋值为NULL。EbootInitEtherTransport函数根据这个参数的输入数据判断调用者的意图,如果pdwDHCPLeaseTime的输入数值为NULL,表示BootLoader使用静态IP地址;如果该参数输入数值为非NULL,则BootLoader通过DHCP协议获取动态IP地址续表函数参数描述VersionMajorBootLoader的主版本号VersionMinorBootLoader的次版本号szPlatformString用作产生目标设备名字的平台字符串,比如XSC1BDszDeviceName目标设备的全名字符串,它通常由在平台字符串之后加上由MAC地址计算得到的随机数产生,比如XSC1BD1234CPUId这个参数是CPU的标识符,比如EDBG_CPU_ARM720dwBootFlags不使用的参数,取值总是0被EbootInitEtherTransport函数用作参数类型的EDBG_ADDR是一个在头文件%_WINCEROOT%PUBLIC COMMONOAKINChalether.h中定义的结构体类型,其中记录着嵌入式设备的IP地址、MAC地址及UDP端口号等以太网传输端点属性数据:/* struct EDBG_ADDR | Addressing info for the debug Ethernet subsystem * * For speed, all values are stored in net byte order (big endian). Use the * htonl/ntohl/htons/ntohs macros to convert to/from local byte order. */typedef struct _EDBG_ADDR DWORD dwIP; / field IP address (net byte order)USHORT wMAC3; / field Ethernet address (net byte order)USHORT wPort; / field UDP port # (net byte order) - only used if appropriate EDBG_ADDR;在头文件%_WINCEROOT%PUBLICCOMMONOAKINCethdbg.h中定义了一系列代表CPU标识符的宏,它们可被用作EbootInitEtherTransport函数的CPUId参数的取值。/ Defs for CPUId#define EDBG_CPU_TYPE_SHX 0x10#define EDBG_CPU_TYPE_MIPS 0x20#define EDBG_CPU_TYPE_X86 0x30#define EDBG_CPU_TYPE_ARM 0x40#define EDBG_CPU_TYPE_PPC 0x50#define EDBG_CPU_TYPE_THUMB0x60#define EDBG_CPU_SH3 (EDBG_CPU_TYPE_SHX | 0)#define EDBG_CPU_SH4 (EDBG_CPU_TYPE_SHX | 1)#define EDBG_CPU_R3000 (EDBG_CPU_TYPE_MIPS | 0)#define EDBG_CPU_R4101 (EDBG_CPU_TYPE_MIPS | 1)#define EDBG_CPU_R4102 (EDBG_CPU_TYPE_MIPS | 2)#define EDBG_CPU_R4111 (EDBG_CPU_TYPE_MIPS | 3)#define EDBG_CPU_R4200 (EDBG_CPU_TYPE_MIPS | 4)#define EDBG_CPU_R4300 (EDBG_CPU_TYPE_MIPS | 5)#define EDBG_CPU_R5230 (EDBG_CPU_TYPE_MIPS | 6)#define EDBG_CPU_R5432 (EDBG_CPU_TYPE_MIPS | 7)#define EDBG_CPU_i486 (EDBG_CPU_TYPE_X86 | 0)#define EDBG_CPU_SA1100 (EDBG_CPU_TYPE_ARM | 0)#define EDBG_CPU_ARM720 (EDBG_CPU_TYPE_ARM | 1)#define EDBG_CPU_PPC821 (EDBG_CPU_TYPE_PPC | 0)#define EDBG_CPU_PPC403 (EDBG_CPU_TYPE_PPC | 1)#define EDBG_CPU_THUMB720 (EDBG_CPU_TYPE_THUMB | 0)EbootEtherReadData库函数的原型定义也在头文件%_WINCEROOT%PUBLICCOMMON OAKINC halether.h中:BOOL EbootEtherReadData (DWORD cbData, LPBYTE pbData);EbootEtherReadData函数的功能是从以太网端口读取参数指定数量的数据到指定的内存缓冲区中。cbData是输入参数,它的数值是以字节为单位的从以太网端口待读取的数据量。pbData是输出参数,它是指向调用者提供用以存放读取到以太网数据的内存缓冲区的指针。函数的返回值是BOOL型,返回TRUE表示函数执行成功,FALSE表示执行失败。EbootWaitForHostConnect库函数也在头文件%_WINCEROOT%PUBLICCOMMONOAK INChalether.h中定义函数原型如下:EDBG_OS_CONFIG_DATA *EbootWaitForHostConnect (EDBG_ADDR *pDevAddr, EDBG_ADDR *pHostAddr);两个输入参数pDevAddr和pHostAddr分别是指向存放嵌入式目标设备和运行Platform Builder的开发计算机的以太网属性的EDBG_ADDR结构体数据的指针。EbootWaitForHost- Connect函数的功能是从开发计算机处获取用户对Platform Builder的配置选项设置,以及各自相关的IP地址及端口号等信息,这些信息使用一个EDBG_OS_CONFIG_DATA结构体表达,它就是函数的返回值数据。EDBG_OS_CONFIG_DATA结构体在头文件%_WINCEROOT%PUBLICCOMMONOAK INCethdbg.h中定义如下:/ Configure message - Sent to device to configure OS components for ethernet/ support. Sent as data field of JUMPIMG command, as well as OS_CONFIG.typedef struct _EDBG_OS_CONFIG_DATA UCHAR Flags; / Flags that will be used to determine what features are / enabled over ethernet (saved in driver globals by bootloader)#define EDBG_FL_DBGMSG 0x01 / Debug messages#define EDBG_FL_PPSH 0x02 / Text shell#define EDBG_FL_KDBG 0x04 / Kernel debugger#define EDBG_FL_CLEANBOOT 0x08 / Force a clean boot UCHAR KitlTransport; / Tells KITL which transport to start / The following specify addressing info, only valid if the corresponding / flag is set in the Flags field. DWORD DbgMsgIPAddr; USHORT DbgMsgPort; DWORD PpshIPAddr; USHORT PpshPort; DWORD KdbgIPAddr; USHORT KdbgPort; EDBG_OS_CONFIG_DATA, *PEDBG_OS_CONFIG_DATA;2.4EthDbg驱动程序Windows CE的BootLoader的EthDbg驱动程序严格地讲不能称为库,它的通用性仅比OEM代码略高。EthDbg驱动程序负责操作目标嵌入式设备的以太网端口,但它不同于Windows CE的以太网端口控制器的驱动程序。EthDbg驱动程序除为BootLoader服务外,还为Windows CE的KITL功能提供服务,后者的程序代码属于OAL的组成部分,这两者使用完全相同的编程接口操作以太网端口硬件。在头文件%_WINCEROOT%PUBLICCOMMONOAKINChalether.h中定义了以下的一系列函数接口类型,它们实质上构成了供Windows CE的BootLoader和KITL模块使用的EthDbg驱动程序的标准用户接口。/ Prototypes for Ethernet controller library functionstypedef BOOL(*PFN_EDBG_INIT)(BYTE*pbBaseAddress,DWORD dwMultiplier,USHORT MacAddr3);typedef void(*PFN_EDBG_ENABLE_INTS)(void);typedef void(*PFN_EDBG_DISABLE_INTS)(void);typedef DWORD(*PFN_EDBG_GET_PENDING_INTS)(void);typedef UINT16(*PFN_EDBG_GET_FRAME)(BYTE *pbData, UINT16 *pwLength );typedef UINT16(*PFN_EDBG_SEND_FRAME)(BYTE *pbData, DWORD dwLength );typedef BOOL(*PFN_EDBG_READ_EEPROM)(UINT16 EEPROMAddress, UINT16 *pwVal);typedef BOOL(*PFN_EDBG_WRITE_EEPROM)(UINT16 EEPROMAddress, UINT16 Data );typedef DWORD(*PFN_EDBG_SET_OPTIONS)(DWORD dwOptions);typedef void(*PFN_EDBG_CURRENT_PACKET_FILTER)(DWORD dwFilter);typedef BOOL(*PFN_EDBG_MULTICAST_LIST)(PUCHAR pucMulticastAddresses,DWORDdwNoOfAddresses);typedef BOOL(*PFN_EDBG_INIT_DMABUFFER)(ULONG StartAddress, ULONG Size);Windows CE对以上EthDbg驱动程序函数接口的功能定义见表2-4。表2-4EthDbg驱动程序函数接口功能定义函数接口功能定义PFN_EDBG_INIT该类型的EthDbg接口函数负责初始化以太网控制器硬件,它通常被BootLoader的平台初始化函数OEMPlatformInit(间接)调用PFN_EDBG_ENABLE_INTS该类型的EthDbg接口函数负责启用以太网控制器的中断请求功能。BootLoader一般都是一个单执行流的单片机程序,它以轮询而非中断的方式操作所需的目标平台外设,这也包括以太网端口。但是OAL的KITL模块需要以中断的方式使用以太网端口PFN_EDBG_DISABLE_INTS该类型的EthDbg接口函数负责禁用以太网控制器的中断请求功能。和PFN_EDBG_ENABLE_INTS一样,它也是主要供KITL使用PFN_EDBG_GET_PENDING_INTS该类型的EthDbg接口函数负责获取由以太网控制器发出的待处理的中断请求PFN_EDBG_GET_FRAME该类型的EthDbg接口函数负责从以太网端口读取一帧(Frame)网络数据。PFN_EDBG_GET_FRAME和PFN_EDBG_SEND_FRAME具体执行对以太网端口的数据读写任务,是最重要的两个EthDbg接口函数PFN_EDBG_SEND_FRAME该类型的EthDbg接口函数负责往以太网端口写入一帧(Frame)网络数据PFN_EDBG_READ_EEPROM该类型的EthDbg接口函数负责读取以太网控制器的EEPROM存储。嵌入式的以太网接口控制器通常使用一块自带的小容量的EEPROM存储器存放自身的需掉电保存的配置数据PFN_EDBG_WRITE_EEPROM该类型的EthDbg接口函数负责向以太网控制器的EEPROM存储写入数据PFN_EDBG_SET_O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省【中职专业高考】2025年中职高考对口升学(理论考试)真题卷【土木建筑大类】模拟练习
- 2025年春季黑龙江大庆油田有限责任公司高校毕业生招聘50人考前自测高频考点模拟试题附答案详解(黄金题型)
- 2025湖南泸溪县汇金产业投资集团有限公司招聘工作人员拟聘用人员考前自测高频考点模拟试题及答案详解(考点梳理)
- IG8-生命科学试剂-MCE
- 2025年河北唐山市直属公立医院第一次公开选聘工作人员18名模拟试卷带答案详解
- 2025广东广州市中山大学孙逸仙纪念医院耳鼻喉科医技岗位招聘1人考前自测高频考点模拟试题及完整答案详解
- 安全培训效果测验课件
- 2025湖南开放大学高层次人才公开招聘25人模拟试卷及答案详解(全优)
- 2025福建福州罗源县卫健系统事业单位招聘控制数12人模拟试卷(含答案详解)
- 行政事务处理流程模板与指南
- 农村厕所改建技术培训-三格化粪池式厕所课件
- 砖混框架房屋拆除专项施工方案
- 学生学习力评价量表
- 藏餐培训教学计划5篇
- 技术需求征集表
- 三年级上册美术课件-第1课 五星红旗我为你骄傲|辽海版
- 中职心理健康教育第一课-PPT课件
- 文化引领学校特色化课程体系的建构
- 安全现场文明施工措施费用清单
- 蓝色多瑙河(课堂PPT)
- 生物波能量与养生健康知识问答手册
评论
0/150
提交评论