请问建立一个动态驱动怎么建立?

iqtao   2008-10-21 16:27 楼主
我的是WINCE6.0的,现在我想写一个GPIO驱动,通过动态连接库来加载这个驱动,也就是说让这个GPIO驱动生成.DLL后,然后手动加载这个驱动来调试。
那我该建立怎么样的工程呢?
在WINCE5.0里提到在新建工程向导里,选择“WINCE Dynamic-Link Library”,建立这样的一个工程即可。但WINCE6.0我却找不到在那里呢。
谢谢了啊。 。。。

回复评论 (11)

由于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=(请在这写上你所有源文件的名字,它们将会被编译)

一个流驱动就大功告成咯~~~~~~
点赞  2008-10-21 16:35
楼上的,先谢谢你
驱动我已经写好了,只是按你的方法不是得重新编译内核吗?
在WINCE5.0选择建立“WINCE Dynamic-Link Library”这样一个工程项目,到时候编译只需要编译这个程序就好了,生成的DLL驱动再通过动态加载来加载。
现在我只是不懂的是WINCE6.0建立怎么样的工程项目才对应“WINCE Dynamic-Link Library”呢?
谢谢
点赞  2008-10-21 16:42
貌似没有人  “WINCE Dynamic-Link Library”这样建立的,还不如自己手动呢,反正有别的参考,你以前这样过?我第一个流驱动就是“WINCE Dynamic-Link Library”这样做的,在模拟器下面。
点赞  2008-10-21 16:53
那驱动调试过程,每次修改程序都要重新编译内核吗?或者是另外的方法?请赐教!
点赞  2008-10-21 16:55
引用: 引用 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。

点赞  2008-10-21 17:04
引用: 引用 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。

点赞  2008-10-21 17:04
谢谢你,你这个方法对我来说只适用了一半,我其实只需要修改后的.DLL这个驱动文件,所以并不需要“make image”,再加上我的WINCE启动一次需要很长时间,所以调试过程内核是尽量不去动的,也尽量不去启动WINCE。我之前弄过LINUX驱动就可以通过动态加载的方式来调试驱动的。
点赞  2008-10-21 17:16
引用: 引用 7 楼 andylao62 的回复:
谢谢你,你这个方法对我来说只适用了一半,我其实只需要修改后的.DLL这个驱动文件,所以并不需要“make image”,再加上我的WINCE启动一次需要很长时间,所以调试过程内核是尽量不去动的,也尽量不去启动WINCE。我之前弄过LINUX驱动就可以通过动态加载的方式来调试驱动的。


那估计你要对wince失望了
wince把很多东西包装起来了,反而使东西不容易变化。

你看看PB的帮助——命令介绍那节——我想你使用命令行可以解决问题。
点赞  2008-10-21 17:23
我已经找到方法了,其实WINCE6.0已经不象5.0那样,他可以直接在添加文件方式建立一个“WINCE Dynamic-Link Library”驱动,这样到时候就可以单独编译这个部分的程序即可。
点赞  2008-10-21 17:30
引用: 引用 9 楼 andylao62 的回复:
我已经找到方法了,其实WINCE6.0已经不象5.0那样,他可以直接在添加文件方式建立一个“WINCE Dynamic-Link Library”驱动,这样到时候就可以单独编译这个部分的程序即可。


咋不把详细方法弄出来呢?俺是5.0,也想弄6.0了。
点赞  2008-10-21 17:35
就是在driver目录下,右键add->new sources subproject,然后就看到“WINCE Dynamic-Link Library”,这样就OK了,和之前的WINCE5.0建立一个“WINCE Dynamic-Link Library”工程一样的效果。
点赞  2008-10-21 17:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复