我的是WINCE6.0的,现在我想写一个GPIO驱动,通过动态连接库来加载这个驱动,也就是说让这个GPIO驱动生成.DLL后,然后手动加载这个驱动来调试。
那我该建立怎么样的工程呢?
在WINCE5.0里提到在新建工程向导里,选择“WINCE Dynamic-Link Library”,建立这样的一个工程即可。但WINCE6.0我却找不到在那里呢。
谢谢了啊。 。。。
由于WinCE下的驱动大多是基于流接口的,所以偶也采用了流接口,做比较起来简单,呵呵
说白了,流接口就是实现以下几个接口:
BOOL WINAPI DllMain(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved);
DWORD XXX_Init(LPCTSTR pContext, LPCVOID lpvBusContext);
BOOL XXX_Deinit(DWORD hDeviceContext);
DWORD XXX_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);
BOOL XXX_Close(DWORD hOpenContext);
BOOL XXX_PowerUp(DWORD hDeviceContext); BOOL XXX_PowerDown(DWORD hDeviceContext);
BOOL XXX_PowerDown(DWORD hDeviceContext);
DWORD XXX_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
DWORD XXX_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count);
DWORD XXX_Seek(DWORD hOpenContext, long Amount, WORD Type);
BOOL XXX_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn,
PBYTE pBufOut, DWORD dwLenOut,
PDWORD pdwActualOut);
XXX是任意的大写字符串(似乎只能是三个字符,偶刚开始用的FM,后面回出问题),且保证与注册表Prefix项后的一样哦
把以上接口给实现了,接下来就是弄注册表咯
在注册表中添加如下项目。(一般放在Platform.reg)
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\DevName]
"Prefix"="XXX"
"Dll"="MyDev.Dll"
"Order"=dword:1
然后在BIB文件中添加项目,将所用到的文件加入BIN文件(一般放在Platform.bib)。
MyDev.dll $(_FLATRELEASEDIR)\MyDev.dll NK SH
注:
DevName为任意与其它项目不重名的字符串.
在platform/你的平台(如:smdk2410)/drivers 下新建一个目录(偶的是FM),然后在drivers目录中的dirs文件中加入以你刚新建的目录名。
在刚新建的目录下,新建你的C源代码文件,在其中实现上面所述的函数,及其功能。新建名称分别为sources, makefile, mydev.def的文件。其内容如下:
makefile: 只需要这样一行
!INCLUDE $(_MAKEENVROOT)\makefile.def
mydriver.def文件定义需要输出的函数,这些函数能够被其它代码用动态加载的方法调用。格式:
LIBRARY MyDev(这个字符串要和将要生成的动态库的文件名一样)
EXPORTS
XXX_Init
XXX_Deinit
XXX_Open
XXX_Close
XXX_PowerOff
XXX_PowerDown
XXX_Read
XXX_Write
XXX_Seek
XXX_IOControl
Sources:这个文件很重要,内容也多,最基本的一个文件该有如下内容。
TARGETNAME=MyDev(指定要生成的动态库的名称)
TARGETTYPE=DYNLINK(指定要生成的是一个动态库)
(下面两项指定需要与哪些动态库链接,一般要第一项就足够了)
TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib
DEFFILE=MyDev.def (指定def文件)
DLLENTRY=DllEntry(指定动态库的入口函数)
SOURCES=(请在这写上你所有源文件的名字,它们将会被编译)
一个流驱动就大功告成咯~~~~~~
楼上的,先谢谢你
驱动我已经写好了,只是按你的方法不是得重新编译内核吗?
在WINCE5.0选择建立“WINCE Dynamic-Link Library”这样一个工程项目,到时候编译只需要编译这个程序就好了,生成的DLL驱动再通过动态加载来加载。
现在我只是不懂的是WINCE6.0建立怎么样的工程项目才对应“WINCE Dynamic-Link Library”呢?
谢谢
貌似没有人 “WINCE Dynamic-Link Library”这样建立的,还不如自己手动呢,反正有别的参考,你以前这样过?我第一个流驱动就是“WINCE Dynamic-Link Library”这样做的,在模拟器下面。
那驱动调试过程,每次修改程序都要重新编译内核吗?或者是另外的方法?请赐教!
引用: 引用 4 楼 andylao62 的回复:
那驱动调试过程,每次修改程序都要重新编译内核吗?或者是另外的方法?请赐教!
作者:ARM-WinCE--------------微软MVP,牛人写的,借个光。
在WinCE下面,创建工程,然后编译是需要花很长时间的。当我们第一编译完工程以后,如果需要改我们的驱动或者BSP,我们是不需要重新编译整个工程的:
1. 如果更改了driver,以WinCE6.0为例,我们可以在菜单里面选择“build”->“Open Release Directory in Build Window” ,然后在弹出的命令行窗口中,通过dos命令切换到你要编译的driver的目录下面,然后运行“build”就可以了。也可以运行“build -c”会强制把所有的文件都编译一遍。被编译后的driver的dll会被自动拷贝到release目录下面,然后再切换的工程的release目录下面,运行一下“make image”就可以了。
2. 如果改变了OAL部分的代码,同样用上面介绍的方法,需要注意的是,OAL部分可能包含多个文件夹,如果改变了OAL里面的代码,不要进入OAL里面的文件夹去编译,一定要在OAL这层进行编译,这样OAL部分的lib,dll才会被重新编译并拷贝到release目录下面。
3. 如果改变了配置文件,比如config.bib,platform.reg文件,那么直接将这些文件拷贝到你的工程目录下面,然后运行一下“make image”就可以了。
4. 如果改变了eboot部分的代码,那按照步骤1的方法就可以了,可能你都不需要运行“make image”命令,因为可能你只需要eboot.bin或者eboot.nb0。
引用: 引用 4 楼 andylao62 的回复:
那驱动调试过程,每次修改程序都要重新编译内核吗?或者是另外的方法?请赐教!
作者:ARM-WinCE--------------微软MVP,牛人写的,借个光。
在WinCE下面,创建工程,然后编译是需要花很长时间的。当我们第一编译完工程以后,如果需要改我们的驱动或者BSP,我们是不需要重新编译整个工程的:
1. 如果更改了driver,以WinCE6.0为例,我们可以在菜单里面选择“build”->“Open Release Directory in Build Window” ,然后在弹出的命令行窗口中,通过dos命令切换到你要编译的driver的目录下面,然后运行“build”就可以了。也可以运行“build -c”会强制把所有的文件都编译一遍。被编译后的driver的dll会被自动拷贝到release目录下面,然后再切换的工程的release目录下面,运行一下“make image”就可以了。
2. 如果改变了OAL部分的代码,同样用上面介绍的方法,需要注意的是,OAL部分可能包含多个文件夹,如果改变了OAL里面的代码,不要进入OAL里面的文件夹去编译,一定要在OAL这层进行编译,这样OAL部分的lib,dll才会被重新编译并拷贝到release目录下面。
3. 如果改变了配置文件,比如config.bib,platform.reg文件,那么直接将这些文件拷贝到你的工程目录下面,然后运行一下“make image”就可以了。
4. 如果改变了eboot部分的代码,那按照步骤1的方法就可以了,可能你都不需要运行“make image”命令,因为可能你只需要eboot.bin或者eboot.nb0。
谢谢你,你这个方法对我来说只适用了一半,我其实只需要修改后的.DLL这个驱动文件,所以并不需要“make image”,再加上我的WINCE启动一次需要很长时间,所以调试过程内核是尽量不去动的,也尽量不去启动WINCE。我之前弄过LINUX驱动就可以通过动态加载的方式来调试驱动的。
引用: 引用 7 楼 andylao62 的回复:
谢谢你,你这个方法对我来说只适用了一半,我其实只需要修改后的.DLL这个驱动文件,所以并不需要“make image”,再加上我的WINCE启动一次需要很长时间,所以调试过程内核是尽量不去动的,也尽量不去启动WINCE。我之前弄过LINUX驱动就可以通过动态加载的方式来调试驱动的。
那估计你要对wince失望了
wince把很多东西包装起来了,反而使东西不容易变化。
你看看PB的帮助——命令介绍那节——我想你使用命令行可以解决问题。
我已经找到方法了,其实WINCE6.0已经不象5.0那样,他可以直接在添加文件方式建立一个“WINCE Dynamic-Link Library”驱动,这样到时候就可以单独编译这个部分的程序即可。
引用: 引用 9 楼 andylao62 的回复:
我已经找到方法了,其实WINCE6.0已经不象5.0那样,他可以直接在添加文件方式建立一个“WINCE Dynamic-Link Library”驱动,这样到时候就可以单独编译这个部分的程序即可。
咋不把详细方法弄出来呢?俺是5.0,也想弄6.0了。
就是在driver目录下,右键add->new sources subproject,然后就看到“WINCE Dynamic-Link Library”,这样就OK了,和之前的WINCE5.0建立一个“WINCE Dynamic-Link Library”工程一样的效果。