WinCE BSP工程文件分析

>

原文地址: http://blog.mcuol.com/User/iwillbeback008/Article/14010_1.htm

 

 

一.pbcxml分析

       

每一个 BSP都有一个工程文件,比如 MyBSP.pbcxml,里面描述了 BSP的信息。下面就来介绍一下 BSP pbcxml文件。

 

文件的大致格式应该是这样的:

<CatalogFile …>

<FileInformation ….>

….

</FileInformation >

<BSP …>

</BSP >

<Item …>

</Item >

<Item …>

</Item >

<Item …>

</Item >

<Item …>

</Item >

</CatalogFile >

 

实际上 相当于一个入口,在这里面包含的就是 WinCE BSP的所有内容了,里面包含几个部分,下面分别介绍每个部分。

 

1. … 项: 这里面包含了 BSP的基本信息,比如 BSP的名字,描述,厂家等。下面是一个模板:

VENDOR:CATALOGFILENAME ">

    

    BSP Description

    Vendor Name

    WinCE Version

    File Version

 

这里不做过多介绍了,一看就应该明白,下面给个实际 BSP中的用到该项描述的例子:

    

    EP94xx BSP Catalog Items

    Cirrus Logic

    6.00

    1.0.0

 

2. … 项: 该项一般在 项后面,用来描述当前的 BSP中都有哪些组件,或者说有哪些 Items。具体模板如下:

    

    BSP Description

    Platform Directory

    Cpu:CPU ID

    Item: VENDOR: VARIABLE

    Item: VENDOR: VARIABLE

    …

 

这里需要做一下解释:

    VENDOR 厂家名称,比如三星提供的 BSP,那么就应该是 SAMSUNG

    BSPDIR 指该 BSP ”/Platform”文件夹下的路径。

    CPU 指该 BSP所支持的 CPU,比如 ARMV4I

    MODULE BSP中的各个模块被编译后所生成的 dll或者 exe的名字,比如 audio.dll,那么这里就应该是 audio

    VARIABLE BSP中和某个模块相关的环境变量。

 

     BSP的标题

    … BSP的一些描述

    … 指该 BSP ”/Platform”目录下的路径。

    … 指所支持的 CPU,比如 ARMV4I

    … BSP中都包含了哪些模块。

 

 

这里要注意的是,有两种表示方法如下:

Method 1 Item: VENDOR: VARIABLE

Method 2 Item: VENDOR: MODULE: BSPDIR

 

可以看一下 WinCE6.0 Platform目录下的一些微软提供的 BSP pbcxml文件,大多采用第二种方法,我个人更喜欢第一种方法,简单。

 

下面也给个例子:

    

    Cirrus EP94xx BSP for WinCE 6.0

    EP94xx

    Cpu:ARMV4I

    Item: Cirrus Logic: bsp_ep94xx_i2s_audio

    Item: Cirrus Logic: bsp_ep94xx_flash

    Item: Cirrus Logic: bsp_ep94xx_nandflash

    Item: Cirrus Logic: bsp_ep94xx_ethernet

    Item: Cirrus Logic: bsp_ep94xx_serial

    Item: Cirrus Logic: bsp_ep94xx_usb

    Item: Cirrus Logic: bsp_ep94xx_touch

    Item: Cirrus Logic: bsp_ep94xx_rtc

 

 

3. … 项: 它会在 项后面,详细描述 项中的每一个模块,也就是描述 BSP中的每一个驱动的相关信息。模板如下:

    

    Driver Description

    BspSpecific

    Variable

    Device Drivers

    

    

    Source Code Path

    

 

前面我们提到了 项中的有两种表示方法,那么实际上和这里的每一个模块的 项是对应的,上面的用哪种方法表示,这里也同样要用相同的方法如下:

Method 1 ……

Method 2   ……

 

这里再对一些定义作个解释:

    VENDOR 厂家名称,比如三星提供的 BSP,那么就应该是 SAMSUNG

    CPU 指该 BSP所支持的 CPU,比如 ARMV4I

    VARIABLE BSP中和该模块相关的环境变量。

 

     该驱动的标题。

    … 该驱动的描述。

    … 对于 BSP中的 Item来说,这里必须是 ”BSPSpecific”

    … 该驱动用到的环境变量,可以不止一个。

    … 指在 PB中的 Catalog Items View中的位置。

    … 描述该驱动的源代码。

    … 指向该驱动的源代码的路径。

    … 描述一个帮助链接链接到帮助页。

 

下面举个例子:

    

    Audio Driver for I2S

    BspSpecific

    BSP_EP94XX_AUDIO

    BSP_EP94XX_I2S_AUDIO

    Device Drivers

    

        

        $(_WINCEROOT)/PLATFORM/EP94XX/SRC/DRIVERS/WAV

    

 

 

上面对 WinCE中的 BSP的工程文件 pbcxml做了个介绍,相信有点描述语言基础,了解一些 WinCE知识的看懂绝对没有问题了。很多时候,在向 BSP中添加驱动或者删除驱动的时候,我们就可以直接用记事本打开该文件,然后在里面编辑就可以了,这样很方便。

 

二.REG文件和DB文件

   

1.        REG 文件

注册表文件,这个和 Windows 操作系统中使用的注册表文件基本一样,在 BSP 中主要是 Platform.reg ,该注册表文件描述了和硬件平台相关的配置,大部分是用来描述驱动的相关信息。

注册标的格式如下:

[KEY1]

"ValueName1"={Value Type}:{data}

"ValueName2"={Value Type}:{data}

[KEY2]

"ValueName1"={Value Type}:{data}

 

其中 Value Type data 相互对应,不同的 Value type 对应不同的 data ,具体如下:

 

Value Type

data

 

REG_SZ

”my string”

字符串类型

REG_DWORD

dword:NNNN(hex number)

DWORD 类型

REG_MULTI_SZ

multi_sz:”my_string_1”,”my_string_2”

多字符串类型

REG_BINARY

hex:xx,xx,xx

二进制类型

HEX

hex(xxxxxxxx):xx,xx,xx,xx

十六进制类型

 

在注册表中,同样可以使用 IF/ENDIF 来进行条件包含,其中条件可以是一个 WinCE 中的环境变量,还可以在该环境变量后加一个空格再加一个惊叹号 (“!”) ,表示没有设置或者不等于的情况,比如:

IF environment variable [= value] [!]

[KEY1]

"ValueName1"={Value Type}:{data}

"ValueName2"={Value Type}:{data}

[KEY2]

"ValueName1"={Value Type}:{data}

ENDIF

 

如果注册表某一行是以分号 (“;”) 开始,表示这行是被注释掉的。当然也有一些例外,比如在支持 Hive 注册表的时候,如下:

; HIVE BOOT SECTION

  ... reg data...

; END HIVE BOOT SECTION

 

关于 Hive 注册表,以前介绍过,这里不多说了。我们在注册表中无非就是创建,删除 key ,赋值等操作。

创建一个注册表 key

[Key1]

"ValueName"="Value Type"

 

删除一个注册表 key

[-KEY1]

 

删除一个注册表值:

"ValueName1"=-

 

BSP 以及硬件平台相关的注册表配置都放在 platform.reg 文件中,和 WinCE 工程相关的配置应该放在 project.reg 文件中。

 

 

2.        DB 文件

数据库文件,同样也有 platform.db project.db 两个文件。但是很少会被用到,特别是 platform.db ,这些数据库文件都是基于 WinCE 的对象存储的,会在 WinCE 启动以后被加载到 RAM 中,掉电就会丢失,具体格式如下:

Database : "db_name" : hex_type : num_sort_order : 1

Record :

Field : field_hex_propid : value

End

End Database

 

可以使用上面的格式在 .db 文件中添加数据库记录,由于本人从未使用过,所以对上述格式没有太多了解,相信搞过数据库的人士,看看上面的格式可能就明白了。

 

 

三. Dirs文件和Sources文件

   

1.  Dirs 文件

关于 Dirs文件,就是指定要编译的路径,这个地球人都知道。还是简单介绍一下。按照文档上面介绍有三种定义: DIRS DIRS_CE OPTIONAL_DIRS

 

DIRS :就是指定要编译的目录。

DIRS_CE :只有目录下的源代码用于 WinCE的映像文件时,才编译该目录。

OPTIONAL_DIRS :指定可以选择编译的目录。比如: OPTIONAL_DIRS=proj1,如果想编译 proj1目录,可以设置 BUILD_OPTIONS=proj1,然后运行 build命令就可以了。

 

举个例子:

DIRS= common /

            drivers /

            oal /

            bootloader

表示需要编译 common drivers oal bootloader目录。

 

 

DIRS=* 

表示编译当前的所有目录。

 

 

 

2. Sources 文件

WinCE BSP中会看到很多 sources文件,一般会和源代码放在同一个目录,当然不是绝对的。这些 sources文件里面就是定义了一些宏,主要用于告诉 Build.exe在编译源代码的时候应该如何编译和链接,告诉 Nmake.exe如何编译源代码以及最后生成什么类型的文件。

 

下面具体介绍一下:

 

TARGETNAME :最后编译完后生成的目标文件的名字,不包括扩展名。

TARGETTYPE :生成的文件的类型。具体值如下:

        LIBRARY ,一个 .lib文件

         DYNLINK ,一个 .dll文件

         PROGRAM ,一个 .exe文件

RELEASETYPE :该宏设置两个环境变量 RELEASEDIR RELEASELIBDIR,就是设置编译后生成文件存放的路径。具体值如下:

         PLATFORM ,生成的文件在 PLATFORM//

         LOCAL ,生成的文件在当前路径下

         CUSTOM ,生成的文件在 TARGETPATH指定的位置

         MANAGED ,生成的文件在 %_PROJECTROOT%/OAK//Managed

         OAK, SDK, DDK ,生成的文件在 %_PROJECTROOT%/Oak/  

TARGETPATH :当上面的 RELEASETYPE=CUSTOM的时候,该宏指定路径

SOURCELIBS :静态链接。函数的实体被链接过来,生成一份拷贝

TARGETLIBS :动态链接。函数的地址被链接过来,系统执行时会加载该库

INCLUDES :指定额外的要搜索的头文件的路径

SOURCES :指定要被编译的文件

ADEFINES :指定汇编器要使用的参数

CDEFINES :指定编译器要使用的参数

LDEFINES :指定连接器要使用的参数

RDEFINES :指定资源编译器 Rc.exe的参数

DLLENTRY :指定 dll的入口函数

DEFFILE :指定该模块的 .def文件

EXEENTRY :指定可执行文件的入口函数

SKIPBUILD :不做实际的 build操作,直接返回成功

WINCECOD :编译后生成一个 .cod的汇编文件,用于查看汇编代码调试

WINCECPU :用于说明为指定的 CPU编译,这样被编译出来的目标文件会被放在 _TGTCPU环境变量所指定的子目录下面,一般该宏在 sources.cmn中定义。

WINCEMAP :编译后生成一个 .map文件,用于调试

WINCEOEM :设置该值表示需要使用 WinCE下的一些公用的库和头文件,该值一般在 BSP中的 sources.cmn中定义。

WINCETARGETFILE0 :用于告诉编译系统在编译当前路径下的源码文件之前,要先由 Build.exe编译的目标文件。

WINCETARGETFILES :用于告诉编译系统在链接当前路径下所有的目标文件之前,要先由 Build.exe编译的目标文件。

WINCE_OVERRIDE_CFLAGS :用于定义用户自己的编译器参数取代默认的编译器参数。

 

 

举个例子:

TARGETNAME=serial_smdk2410

TARGETTYPE=DYNLINK

RELEASETYPE=PLATFORM

TARGETLIBS=$(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /

        $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/ceddk.lib

 

SOURCELIBS=$(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/serpddcm.lib /

        $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/com_mdd2.lib

 

DEFFILE=serial.def

DLLENTRY=_DllEntryCRTStartup

 

SOURCES= ser_smdk2410.cpp /

        pdds3c2410_ser.cpp

 

需要编译的文件为 ser_smdk2410.cpp pdds3c2410_ser.cpp DEF文件为 serial.def DLL的入口函数是 _DllEntryCRTStartup,静态连接 serpddcm.lib com_mdd2.lib两个库,动态链接 coredll.lib ceddk.lib两个库,最终编译为 dll文件,文件名为 serial_smdk2410.dll

 

 

最后总结一下, Dirs文件会和 Sources文件配合使用,但是他们不可能存在同一个目录下面。 Dirs文件指定编译目录, Sources文件指定如何编译.

 

 

四.DAT文件介绍

  

DAT 文件用于在 WinCE 启动的时候,定义文件系统的结构,也就是定义有哪些文件夹,哪些文件在什么位置等。每次冷启动的时候, Filesys 模块会根据 .dat 文件中的内容来创建目录以及目录下的文件。

 

BSP 中我们可以找到 platform.dat 。在创建一个 WinCE 的工程以后,可以在工程目录下面找到 project.dat 。可以在这两个 .dat 文件中定义我们所需的根目录以及相应的子目录和文件,当然 Windows 文件夹及其包含的子文件夹除外。用户可以通过定义快捷方式的方法来引用 Windows 目录下的文件。

 

关于 DAT 文件的具体格式,来举个例子:

root:-Directory("My Documents")

root:-Directory("Program Files")

Directory("/Program Files"):-Directory("My Projects")

Directory("/Program Files"):-Directory("Accessories")

Directory("/Program Files"):-Directory("Communication")

Directory("/Program Files/My Projects"):-File("My Project Program", "/Windows/Myproj.exe")

root:-File("/control.lnk", "/Windows/control.lnk")

 

简单解释一下,上面的内容是先创建 My Documents Program Files 两个根目录,然后在 Program Files 下面创建 My Projects Accessories Communication 三个子目录,然后拷贝被定义在 Windows 目录下的存在于 ROM 中的 Myproj.exe 文件到 My Projects 目录下面,且名字为 My Project Program 。这里需要说明的一点就是,像 Myproj.exe 这样的文件都是从 ROM 中拷贝出来的,所以必须在 BIB 文件中包含了该文件。最后一行意思是在根路径下创建 control.lnk ,该文件来自 ROM 中的 control.lnk 文件,是一个快捷方式文件。

 

对上面的一些格式做个解释:

 

1 Root Directory 的语法格式:

root:[-Directory("dir_name")] [-Permdir("dir_name")]

[-File("target_filename", "source_location")]

 

root 表示根目录。

-Directory(“dir_name”) 定义根目录下的目录名。

-Permdir(“dir_name”) 定义一个永久的目录,用户是不能通过 RemoveDirectory 函数删除的。

-File(" target_filename", " source_location") 定义一个目标文件,该文件从 ROM 中拷贝过来。 target_filename 为目标文件的文件名, source_location ROM 中的文件,指 Windows 目录下的某路径下的文件名。

 

 

2 Directory 的语法格式:

Directory("dir_name"):[-Directory("dir_name")]

[-File("target_filename", "source_location")]

 

Directory(“dir_name”) 表示目录名。 ”/” 表示根目录。

-Directory(“dir_name”) 表示目录下的路径,就是子目录。

-File(" target_filename", " source_location") 定义一个目标文件,该文件从 ROM 中拷贝过来。 target_filename 为目标文件的文件名, source_location ROM 中的文件,指 Windows 目录下的某路径下的文件名。

 

 

DAT 中所使用的语法定义比较简单,看看例子就知道如何修改了,一般我们会通过修改 project.dat platform.dat 来改变 WinCE 启动后的文件路径结构。其中 platform.dat 是和平台相关的,而 project.dat 是和 WinCE 工程相关的。

 

五.BIB文件介绍

   

WinCE 中使用的一个重要的文件就是 BIB 文件,全称 Binary Image Builder File 。在 WinCE 的编译过程中会用到 BIB 文件,应该是在最后的 Makeimg 阶段。所有的 BIB 文件会被合并成 CE.bib 文件,然后 Romimage.exe 会根据 BIB 文件中的描述来决定哪些文件最终被包含到 WinCE image 中。当然, BIB 文件还决定了 WinCE 设备内存的分配,其中定义了 WinCE image 占用哪块内存, Framebuffer 占用哪块内存等。

 

BIB 文件中分为 4 大项: MEMORY 项, CONFIG 项, MODULES 项和 FILES 项。下面分别作个解释:

MEMORY 定义了内存分配的相关设置,一般在 BSP 中的 config.bib 文件中。

CONFIG 在最后的 Makeimg 阶段,为 Romimage.exe 提供一些生成 WinCE image 的配置属性。该项是可选的,一般也在 BSP 中的 config.bib 文件中定义。

MODULES 定义了一些会被打包到 WinCE image 中的模块或者文件,比如 dll exe 等。这些文件会被 Romimage.exe 标记为加载到 RAM 中或者 XIP 。我们可以在这里添加自己的 WinCE 应用程序或者模块,但是不要添加 Managed Binaries ,一般指 .NET 的程序。

FILES 定义了一些操作系统会用到的其他的文件,比如字体文件,图片等。这些文件也会在 WinCE 运行的时候被加载到 RAM 中。

 

 

下面会详细介绍上面的 4 大项:

 

1.        MEMORY

一般都在 config.bib 文件中定义,开头会有 MEMORY 的字样。这里定义了为 WinCE image 以及其他模块预留的 RAM ,同时也定义了 WinCE 可以使用的 RAM 。具体格式如下:

MEMORY

    NAME     Start Address         Memory Size         Type

 

NAME 该内存区域的名字,必须是唯一的。

Start Address 该内存区域的起始地址,用十六进制表示。

Memory Size 该内存区域的大小,用十六进制表示。

Type 内存区域的类型。包涵的多种类型如下。

 

 

类型值

描述

FIXUPVAR

用于在 WinCE 编译的 Makeimg 阶段,就初始化一个内核中的全局变量。

NANDIMAGE

当创建了一个使用 BinFS image 的时候, NAND 设备上的 WinCE kernel 重定向到 RAM 中的区域,当系统访问该区域的时候, BinFS 会负责访问 Nand 设备上相应的位置,并返回数据给系统,实际上就是在 Nand 设备上面实现了 XIP 的功能。

RAM

定义了被 WinCE 系统使用的 RAM 区域,这块内存必须是连续的,这里有一点要注意就是从硬件的角度来说,这块内存不能跨越两片 SDRAM ,也就是说整个区域空间必须在一片硬件 SDRAM 上。

RAMIMAGE

定义了一块内存区域用于加载 WinCE image ,实际上 WinCE 启动以后, image 会被拷贝到这块内存区域上面运行。一个 image 只能有一个连续的 RAMIMAGE 区域。

RESERVED

这块内存区域会被预留出来,一般用于 Frambuffer 或者是 DMA Buffer ,或者是一块共享内存用于 EBOOT 传递参数给 WinCE 系统。

EXTENSION

定义了一块 WinCE image 中的区域作为 ROMHDR extension 的数据区域。

 

 

2 CONFIG

一般在 config.bib 文件中定义,定义了一些额外的配置参数,其中一些对于 WinCE image 来说也很重要。具体格式如下;

CONFIG

     ITEM=Parameter

 

 

ITEM

描述

AUTOSIZE

允许未被使用的 WinCE image RAM 被用作 WinCE 系统的 RAM 。默认值为 ON

COMPRESSION

允许 Romimage.exe 压缩 WinCE image 中的可写入部分。默认值为 ON

BOOTJUMP

定义了跳转跳转页在 RAMIMAGE 空间的地址。而不是默认情况下的 RAMIMAGE 的首地址。默认值为 NONE

FSRAMPERCENT

定义了文件系统使用的内存的百分比。默认值为 0x80808080

Byte 0 :第一个 2MB 中,每 1MB 所包含的 4KB 的倍数。

Byte 1 :第二个 2MB 中,每 1MB 所包含的 4KB 的倍数。

Byte 2 :第三个 2MB 中,每 1MB 所包含的 4KB 的倍数。

Byte 3 :剩下的内存中,每 1MB 所包含的 4KB 的倍数。

KERNELFIXUPS

定义了 Romimage.exe 是否重新定向内核的可写入区域。默认值为 ON ,内核的可写入区域被重新定向到 RAMIMAGE 的起始位置。

OUTPUT

定义了最终生成的 image 存放的路径。默认为 %_FLATRELEASEDIR%

PROFILE

定义了是否在 WinCE image 中包含 profiler 的结构和符号。默认值为 OFF

RESETVECTOR

重新指定跳转页的位置,一般针对 MIPS 芯片从 0x9FC00000 开始引导的问题。

ROMFLAGS

内核标记位,可以进行组合:

0x01 表示禁用按需分页。

0x02 表示禁用完全内核模式,完全内核模式表示所有的线程都运行在内核模式。

0x10 表示只信任 ROM MODULES 中的模块。

0x20 表示停止刷新 TLB

0x40 表示 /base 链接选项中的地址加载 DLL

ROMSTART

WinCE image 在内存中的起始地址。

ROMSIZE

WinCE image 的大小。

ROMWIDTH

指数据总线的宽度。

ROMOFFSET

指定一个偏移量来修改 .bin 文件中的每一个记录的地址。一般用于 ROM 中的 .bin 文件加载到 RAM 来运行的情况,主要是表示存储 .bin 的位置和运行 .bin 的位置不一样。

SRE

使 Romimage.exe 产生一个 .sre 文件。默认值为 OFF

X86BOOT

定义是否插入一条跳转指令,在 x86 复位向量地址的时候。

 

 

3 MODULES 项和 FILES

该项列出了所有被包含在 WinCE image 中的模块以及文件,以及这些模块和文件以什么方式被加载到内存中。具体格式如下:

MODULES

     Name     Path             Memory             Type

 

Name 模块的名字,比如一个 dll 或者 exe 文件的文件名。

Path 路径,一般都是 WinCE 的工程的 Release 目录。

Memory 指定该模块被放在哪个区域,一般都是 NK 区域。

Type 定义了文件的类型。具体如下:

 

 

类型

描述

S

系统文件。

H

隐藏文件。

R

只压缩模块的资源部分。

C

压缩模块的所有部分。

D

禁止调试。

N

模块是不可信任的。

P

告诉 Romimage.exe 不需要检查 CPU 的类型。

K

告诉 Romimage.exe 必需固定该模块的内核地址。有该标记的模块只能被 LoadKernelLibrary 函数加载。

X

告诉 Romimage.exe 对该模块签名。

M

运行时加载整个模块,不要按需分页。

L

告诉 Romimage.exe 不要分离 ROM DLL

 

一般 FILES 项的 Type 只支持 S H N D 几个类型,而 MODULES 项的 Type 是都支持的。

 

举个例子吧:

     INIT.EXE             %_WINCEROOT%/RELEASE/INIT.EXE             NK     SH

    MYDLL.DLL         %_WINCEROOT%/RELEASE/MYDLL.DLL        NK     SHC

 

 

对于 BIB 文件来说同样支持“条件编译”,我们可以通过设置环境变量来选择性地将某些模块打包到 WinCE image 中。一般在 BSP 中,对于一些驱动模块的环境变量我们 IF 来进行条件判断。而对于 WinCE 的系统模块来说,一般都是 SYSGEN 变量,应该使用 @CESYSGEN IF 来判断。

 

 

我们在 BSP 的开发中最常见的主要就是 eboot.bib config.bib platform.bib project.bib 。下面简单介绍一下:

project.bib 该文件主要自创建的 WinCE 工程中所需的一些文件。

platform.bib 该文件包含了和硬件平台相关的文件,主要以驱动程序为主。

config.bib 该文件描述了 WinCE 系统的内存的配置。

eboot.bib 该文件描述了 WinCE eboot 的内存的配置。

 

还有其他的一些 bib 文件,在 WinCE 系统编译后都会背拷贝到工程的 release 目录下面。比如 common.bib ie.bib 等。这些文件列出了 WinCE 的组件相关的文件,根据用户订制的系统,会被选择性的打包到 WinCE image 中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值