WINCE第一个驱动续
上文介绍了WINCE一个简单驱动的编写,这节我们接着介绍一些配置文件的编写。涉及到的文件有.platform.bib,platform.reg,dirs,source,SimpleDriver.def,其中后面两个文件在前文已有介绍,这里就以前两个配置文件为主。
首先,从注册表说起,先简单的介绍一下注册表:Makeimg.exe使用.reg文件来为CE镜像建立注册表并添加默认的键值。也就是说,在.reg中写入的注册表的键值会被默认地放入CE镜像的初始化注册表中。其中Platform.reg定义了目标设备硬件的注册表设置,Project.reg定义基于Windows CE项目工程的注册表设置。注册表键值的类型如下:
1. REG_SZ表示一个字符串类型,如reg_sz:”my string”。
2. REG_DWORD表示一个双字节类型,如dword:12345678(十六进制数)。
3. REG_MULTI_SZ表示多字符串类型,如multi_sz:“my string”,“my string”。
4. REG_BINARY 二进制类型。
在实际应用中可以使用IF/ENDIF关键字来引入一个注册表设置块,通过设置一个环境变量或一个特殊的值来达到这个目的。
为了包含一个注册表设置块,当一个环境变量没有被设置或者没有等于一个特定的值的时候,引入的注册表设置块的行尾应使用一个空格和“!”。
这里比较好找,一目了然,在目录D:\WINCE600\PLATFORM\SMDKXXXX\Files\platform.reg下添加:
"Prefix"="SPL"
"Dll"="SimplDriver.Dll"
"FriendlyName"="Simple Driver"
"Order"=dword:0
"Index"=dword:0
这样在WINCE启动时,就自动加载该驱动了。
接着我们介绍platform.bib文件,关于bib文件,这里做一个简要的介绍:二进制镜像文件构建文件(.bib)定义了哪个模块或者文件被包含到运行时的CE镜像中。在编译期间,makeimg.exe使若干个.bib文件合并成ce.bib文件,然后,romimage.exe使用ce.bib决定哪些文件应该被打包进运行时CE镜像中,它同时还使用ce.bib来决定如何加载模块和文件到CE镜像(下载到目标设备的CE镜像)所在的内存中。
按照功能划分,.bib文件可以分为如下几种类型。
(1) Platform.bib。Platform.bib位于目录D:\WINCE600\PLATFORM\SMDK6410\Files,它包含硬件平台相关的模块和文件,如目标设备的驱动文件。这些模块和文件是CE镜像的入口,比如.exe文件,如波形音频文件(.wav)等。
(2) Project.bib。Project.bib weiyumulu D:\WINCE600\PUBLIC\CEBASE\OAK\FILES,如果我们新建一个工程项目(OSDesign1)则这个工程位于目录:D:\WINCE600\OSDesigns\OSDesign1\OSDesign1\Wince600\SMDK6410_ARMV4I\OAK\files下。Project.bib文件定义与创建CE镜像的工程相关的模块,如果在OSDesign1中创建了一个自己的模块或者应用程序,那么就要把它们添加到Project.bib文件中的MODILES部分。
(3) Common.bib。Common.bib位于目录D:\WINCE600\PUBLIC\COMMON\OAK\FILES下,它定义了CE镜像文件包含的通用显示驱动和核心系统模块。
(4) Config.bib。Config.bib位于目录D:\WINCE600\PLATFORM\SMDK6410\Files下,它定义了ROM和RAM的配置信息。它同样包含了CE镜像文件的MEMORY和CONFIG部分。Config.bib的MEMORY部分定义了运行时CE镜像内存分配表,指定了名称、地址、大小和MEMORY区域的类型。
.bib文件可以被分为四个部分,分别是MEMORY、CONFIG、MODULES和FILES。下面将分别说明这四个部分各自的含义。
(1) MEMORY。定义可用的物理内存,包括起始地址、大小和内存类型。
(2) CONFIG。定义romimage.exe输出的配置选项。默认情况下,这个区域是在config.bib文件中。不过,也并不是.bib文件中必须要包含CONFIG部分。
(3) FILES。指定放在CE镜像中的文件列表。
(4) 指定放在CE镜像总的模块列表,包括EXE和DLL文件,与FILES的区别是放在MODULES中的文件通常是代码文件,并且构建系统时不会压缩这些文件。
这里我们主要介绍Modules部分。
Modules部分指定了哪些基于Windows CE的模块包含到CE镜像中,以及如何给加载到config.bib文件中的MEMORY部分建立内存表。这个部分可以包含200个模块,这些模块有源代码和数据两个部分组成。
MODULES的语法格式如下:
; Name Path Memory block Section override Memory Type
; --------- -------- ---------------- ----------- -------------
各参数之间用空格分隔。
NAME:这个参数指定了MODULES模块的名称。通常情况下,它就像被路径引用的文件名称一样。
PATH:指定要打包进CE镜像的MODULES模块的完整路径。
MEMORY BLOCK:这个参数指定romimage.exe加载目标模块到内存区域的ramimage部分。这个内存位于config.bib文件中memory部分指定的某一段内存。
SECTION OVERRIDE:这个参数的设置时可选的,它可以为modules、files或者空。如果设置了这个参数,那么构建系统就会根据它来决定这一项是modules还是files。
TYPE:这个参数指定文件的类型,主要有以下几种类型,在实际的使用中可以选用其中的一种或者多种组合。
1. S:定义一个系统文件
2. H:定义一个隐藏文件
3. R:压缩资源,只应用于MODULES部分
4. C:如果应用于一个模块,则压缩全部内容
5. D:运行时不允许调试。
6. N:标记一个模块为不可信任的,只应用MODULES部分。
7. K:指定romimage.exe必须修正模块到一个内核地址。在这个过程中,romimage.exe分配一个固定的虚拟地址给DLL,设置了此标志的模块只可以被loadKernelLibrary()函数加载。
8. P:指定romimage.exe禁止在头文件中检查指定的CPU类型。这个旗标只用于资源dll,可以在一种CPU伤编译,在不同CPU上使用。
9. M:表示对此页禁止按序调页。
10. U:表示不压缩此文件。
在目录D:\WINCE600\PLATFORM\SMDKXXXX\Files\platform.bib文件中有如下定义:
; Name Path Memory Type
; -------------- ---------------------------------- -----------
;-------------
;--------------Simple Driver (caichang714@hotmail.com) ------------------------------------------------------
simpledriver.dll $(_FLATRELEASEDIR)\simpledriver.dll NK SHK
; @CESYSGEN ENDIF CE_MODULES_DEVICE
;---------------------------------------------------------------------------------------
其中,_$(_FLATRELEASEDIR)\ 指的是D:\WINCE600\OSDesigns\SMDKXXXX\SMDKXXXX\RelDir
结合上面的说明,我们可以知道,上面的语句的意思是将编译生成的simpledriver.dll模块加载到CE运行时镜像NK中。它的文件属性是系统文件,隐藏文件和内核模块,由romimage.exe分配一个固定的虚拟地址给simpledriver.DLL。
接着在D:\WINCE600\PLATFORM\SMDKXXXX\Src\Drivers目录下找到dirs文件,在里面添加:SimpleDriver\
最后点击build或者在dos环境下build -c