we-hjb的BLOG

ARM.WINDOWS EMBEDDED CE...

常用链接

统计

积分与排名

最新评论

Windows CE下流驱动的动态加载

    我想很多WinCE的开发人员,尤其是刚入门并且做驱动开发的工程师,都曾碰到这样一个问题,要编写一个外围设备的驱动,拿最简单的GPIO驱动来说,编写驱动本身可能只花了一会儿功夫,可要把编译生成的DLL打包到先前做好的操作系统映像当中,最简单也得MakeImg一下,还要修改BIB文件、注册表文件,以让系统启动的时候就加载该驱动,所有工作都做完了,还得花几分钟下载整个操作系统到内存去运行,这也得要个好几分钟。能力强的人一次成功,不走回头路也就算了。如果驱动编写得有问题,那又得改代码,重新编译,把刚刚所做的事情再做一遍。说出来不怕大家笑话,我刚开始做驱动时就这样,反反复复,半天下来,才调试好一个简单的驱动。而事实上很大一部分时间都浪费在重复操作上。这种调试驱动的方法实在效率太低了。想到Linux下面的驱动调试,多方便!直接INSMOD一下,应用程序就可以调用,出现问题就RMMOD,根本无须来回倒腾操作系统的映像文件。那么,WinCE下难道就没有这么简便的方法嘛?答案是肯定的。

       闲话少说,进入正题。查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序。而这个函数的使用是相当简单的。我就不多说了,贴上一段帮助最能说明问题。当然,你也可以用ActivateDeviceEx()。

HANDLE ActivateDevice (

LPCWSTR lpszDevKey,

DWORD dwClientInfo

);

Parameters

lpszDevKey

[in] Pointer to the registry path string of the device's driver key under HKEY_LOCAL_MACHINE. A driver key contains the DLL name, the device prefix, friendly name, and other device information.

dwClientInfo

[in] Data that will be stored in the device's Active key in the ClientInfo value. The registry path to the driver's Active key is passed in as the context parameter to the device's XXX_Init function. The value in dwClientInfo is stored in the registry before XXX_Init is called.

Return Values

On success, ActivateDevice returns a handle to the device that can be used in subsequent calls to DeactivateDevice.

Remarks

This function is superseded by ActivateDeviceEx.

ActivateDevice loads a device driver. ActivateDevice reads the registry key specified in lpszDevKey to get the DLL name, device prefix, index, and other values. Next it adds the device to the active device list in the registry branch HKEY_LOCAL_MACHINE\Drivers\Active, and stores the relevant values there. If no device index was specified in the key named in lpszDevKey, then it assigns a free index. Then it loads the device driver DLL in the process space of the Device Manager. Then it broadcasts a WM_DEVICECHANGE message for the new device and triggers a NOTIFICATION_EVENT_DEVICE_CHANGE event in the application notification system to notify applications of the presence of the new device.

从上面的描述中可以看到,在使用该函数时,我们只要给出第一个参数就可以,而这个参数是注册表中的一个路径字符串。所以,要想很方便的动态加载任意一个驱动,我们还要了解一下有关注册表的内容。但其中最核心的就是一条,把你驱动的相关注册表信息放到HKEY_LOCAL_MACHINE下,主要内容包括PrefixDLLIndexOrder等信息。这里就不展开说明了。

       自己起初费了那么多冤枉时间,实在很郁闷。原理摸清后就做了一个小工具,实现动态加载流驱动,以提高开发效率,也能方便后来人。下面就详细介绍这个小工具的使用过程,让大家体验一下动态加载流驱动是多么畅快的一件事情。

       我们假设已经做好一个简单的流驱动DrvDemo.dll,其对应的注册表文件为DrvDemo.reg,用来测试驱动的应用程序DrvDemo.exe。我们把这三个文件和驱动调试助手(DM.exe)都拷贝到WinCE系统上,如下图所示。

     首先运行DrvDemo.exe,点击打开设备,或者其他按钮,我们发现打开设备失败,很正常,此时DrvDemo.dll还没有工作呢。

     运行驱动调试助手软件DM.exe,点击“驱动调试”菜单——选择“导入注册表”,浏览到我们准备好的注册表文件DrvDemo.reg,选中并点击OK按钮,这样,DrvDemo.reg中的内容就已经导入到系统中了,相应的信息能在“操作信息回显”中看到。

     此时你可以直接点击“驱动调试”菜单下的“激活驱动”,当然你也可以打开“驱动调试”——“驱动列表”,进而选择激活该驱动。正常情况下,操作回显中就会提示你“加载驱动成功”。

     这时,再到DrvDemo.exe点击打开设备,就完全没有问题了。

如果在测试时,发现驱动有问题,那么你可以选择“卸载驱动”,然后将修改好的新的驱动拷贝过来,再点击“激活驱动”菜单。如此往复,直至调试成功。

至此,我们采用了通过导入注册表文件的方法激活驱动。下面再说说在没有注册表文件时直接通过浏览DLL文件本身来加载驱动的方法。先把刚刚加载的驱动卸载了。

运行驱动调试助手软件,点击“驱动调试”菜单——选择“浏览DLL文件”,浏览到我们准备好的DrvDemo.dll文件。在弹出的对话框中设置正确的PrefixOrderIndex信息,点击“确定”。

同样,此时你可以直接通过“驱动调试”下的“激活驱动”直接激活该驱动,或者从“驱动列表”中激活.

其余的操作跟上面讲的完全一样了,不再重复。

     怎么样,这种方法就很类似于Linux下的InsmodRmmod了吧?^_^

     其实,如果在注册表中已经有了相应的键,你甚至可以直接选中它,然后在“驱动调试”中选择“激活驱动”,如果一切正常,也可以达到上面两种方法的效果,但这样就连导入文件都省了。有兴趣的同志可以自己试一下。

好了,我相信到这里,大家应该对动态加载流驱动的原理和方法都了解了,也能从此摆脱不断MakeImgDownload的梦魇,节省很多宝贵的开发时间。

    最后,针对驱动调试助手简单说明一下几个要注意的地方。

1.       在调试驱动时,加载完驱动后,千万不要关闭驱动调试助手,最小化就行,否则,它会在关闭时自动卸载掉你所加载的驱动。

2.       WinCE4.2中,有关中断的驱动是无法直接用此方法来动态加载的,而在5.06.0中不会有此限制。这是因为WinCE4.2中的中断处理机制所致。

3.       驱动调试助手可以同时加载几个驱动,这时候建议将所有注册表信息写到一个文件中,并导入。剩下的工作就是从驱动列表中选择加载你所需要的驱动了。

4.       驱动调试助手中的注册表编辑功能经过几番修改,已基本完善,编辑、导入、导出都没有问题。如果系统支持HIVE-REG,在退出驱动调试助手时,可以选择保存此次的注册表修改。

5.      上面的截图是在WinCE6.0的模拟器上面做的,应该算是内核态的驱动,至于用户态的驱动也可以通过该方法加载,但是需要设定相应的注册表信息。

6.       做这样一个小工具,主要是想提高自己的工作效率。现在贴出来,望也能为同道中人所用。在使用该程序时有任何问题,请发邮件到 wince.he@gmail.com,我会尽力解决。本篇中的视频录像和最新版的驱动调试助手可以在http://files.cnblogs.com/we-hjb/WINCEDM.rar下载到。

上面所讲的并不是新鲜或者高深的技术,但相信对某些技术人员还是有一定的帮助。当然,文中有不尽如人意处,还请你见谅。以后争取多写一点东西,跟大家一起学习Windows Embedded

最后,希望不要被认为是“广告性质的文章”。^_^

posted on 2008-07-24 20:11 wince.he 阅读(16922) 评论(131) 编辑 收藏

评论

#32楼 2009-04-08 21:03 ztg

你好 能不能把那个测试驱动的那个应用程序的源码也打包在压缩包里 发现有些驱动只要需要博主的那个应用程序就可以了 可是不会写应用  回复 引用   

#33楼 2009-04-10 22:12 gooogleman[未注册用户]

@ztg
可以自己写个啊。这东西还是挺有意思的。
 回复 引用   

#34楼 2009-05-05 11:02 张云杰[未注册用户]

非常感谢你的热心帮助!!!!!  回复 引用   

#35楼 2009-07-24 12:17 EVC      

请问一下动态驱动卸载函数怎么写啊!  回复 引用 查看   

#36楼 2009-07-25 09:33 xiaohuang[未注册用户]

楼主,给你邮箱发邮件了
请看一下
 回复 引用   

#37楼 2009-08-06 17:27 michael_fei      

楼主,好像可以直接这样调用,不需要修改注册表。
HANDLE m_hIR;
//这里是你的流驱动的文件名
m_hIR = RegisterDevice(TEXT("MYD"),1,TEXT("MYD_DRIVER.dll"),1);
if(m_hIR == NULL)
{
MessageBox(NULL,_T("load driver fail!"),_T("test"),MB_OK);
}
else
{
MessageBox(NULL,_T("load driver sucess"),_T("test"),MB_OK);
}
 回复 引用 查看   

#38楼[楼主] 2009-08-08 22:53 wince.he      

@michael_fei
恩,这个函数也是可用的。不过,好像MSDN里还是推荐使用ActivateDeviceEx()。
 回复 引用 查看   

#39楼 2009-08-09 13:23 michael_fei      

@wince.he
哦。那LZ能否告诉我ActivateDeviceEx()有什么好处呢?
谢谢。
 回复 引用 查看   

#40楼[楼主] 2009-08-11 22:18 wince.he      

@michael_fei
ActivateDeviceEx()比原来的更灵活,更强大,更通用吧。
 回复 引用 查看   

#41楼 2009-08-12 17:16 AlphaWu      

博主你好:

我下载了你写的驱动调试助手,怎么在我的模拟器上面无法运行呀?
Emulator:x86_Release。
说不上有效的WinCE程序,还有,压缩包里面没有DrvDemo这个程序。
 回复 引用 查看   

#42楼[楼主] 2009-08-12 21:47 wince.he      

@AlphaWu
你下载的可能是ARM平台下的,不能在模拟器上运行。
到这里下载新版本,里面包括模拟器上能用的。
http://www.cnblogs.com/we-hjb/archive/2009/05/17/1458725.html
 回复 引用 查看   

#43楼 2009-08-28 10:19 michael_fei      

楼主,您好。
再问一下,
ActivateDeviceEx与ActivateDevice
这两个函数加载驱动有什么区别?
谢谢
 回复 引用 查看   

#44楼 2010-03-08 12:26 WinCE界面      

WINCE嵌入式开发
http://www.evccode.com
 回复 引用 查看   

#45楼 2010-03-08 12:27 WinCE界面      

http://www.evccode.com  回复 引用 查看   

#46楼 2010-05-16 15:40 xinjie      

学习,这种简单的方法还没试过  回复 引用 查看   

#47楼 2010-09-10 08:57 swancity[未注册用户]

楼主,出个英文版,可以赚点美元咯。  回复 引用   

#48楼[楼主] 2010-09-10 21:40 wince.he      

@swancity
呵呵,估计没人愿意花这个钱。
 回复 引用 查看   

#49楼 2010-11-24 13:17 ioro55555      

博主,你好。我用同步软件下载DM到目标板,怎么一运行就死机呢?我的是6.0的系统。是不是有什么库没添加呢?  回复 引用 查看   

#50楼 2010-11-24 14:02 lvye      

关于wince下访问物理内存问题,在windows mobile下是不是也适用?谢谢
我想获取智能手机物理内存的信息,即对物理内存RAM做镜像,通过写驱动,然后用这种方式能不能实现?另外:镜像物理内存方面的驱动可不可以供参考一下,邮箱yangsm0995@163.com。
 回复 引用 查看   

#51楼[楼主] 2010-11-24 23:23 wince.he      

@lvye
Windows Mobile下也适用,它们目前都是CE5.0的内核。
 回复 引用 查看   

#52楼[楼主] 2010-11-24 23:24 wince.he      

@ioro55555
所谓死机,是整个系统死了,还是DM.exe崩溃了?
 回复 引用 查看   

#53楼 2010-11-26 08:12 ioro55555      

@wince.he
应该是系统死了,鼠标不能动了。
 回复 引用 查看   

#54楼[楼主] 2010-11-28 19:39 wince.he      

@ioro55555
到目前为止,还没怎么碰到这种情况。
怀疑是你平台的问题。
 回复 引用 查看   

#55楼 2010-11-29 10:32 ioro55555      

@wince.he
可不可能是有一些必须的组件没加啊?
 回复 引用 查看   

#56楼[楼主] 2010-11-29 22:33 wince.he      

@ioro55555
有这个可能哦。你用的是哪个版本的呢?
试试看这个,http://download.csdn.net/source/761365
 回复 引用 查看   

#57楼 2010-12-13 20:28 Render      

有没有源码呀,现在我在480X640的分辨率下,菜单都看不到。或者可以把菜单做成上下文菜单  回复 引用 查看   

#58楼[楼主] 2010-12-21 19:50 wince.he      

@Render
你是用的WinCE吗,还是WM?
该工具不支持WM。
 回复 引用 查看   

#59楼 2011-03-04 14:08 chentc      

没有x86平台的吗,考进去所有的都说 is not a valid Win CE application.  回复 引用 查看   

#60楼[楼主] 2011-03-07 21:49 wince.he      

@chentc
http://files.cnblogs.com/we-hjb/DM_x86Rel.rar下载这个试试看,应该可以用的。
 回复 引用 查看   

#61楼 2011-03-08 14:11 cumtdz      

新手问题,看了书之后还是晕,我要写qq2440开发板的adc流接口驱动,不是很明白,请教一下。QQ289587789  回复 引用 查看   

#62楼[楼主] 2011-03-09 20:44 wince.he      

@cumtdz
流驱动的模板可以参考http://www.cnblogs.com/we-hjb/archive/2010/12/30/1922563.html
ADC因CPU而异,你可以看Datasheet,然后逐一实现。
 回复 引用 查看   

#63楼 2011-04-03 11:46 mei1989qing      

楼主,你好,请教个问题,我在调试自己写的流驱动时,在你的DM里显示了 驱动已加载,但是我的应用程序 打开设备失败,我要怎么确定是我的 驱动写的有问题 还是应用程序写的有问题呢, 另外问个弱智问题 wince注册表里有一项'friendly name'和'prefix',应用程序里应该是用'prefix'后面的名字来打开设备吧  回复 引用 查看   

#64楼[楼主] 2011-04-14 12:40 wince.he      

@mei1989qing
你好,打开设备时一般都是用_T("XXX1:"),XXX为注册表中Prefix的值。
 回复 引用 查看   

#65楼 2011-04-18 12:54 hero_xu      

楼主,你好!那个DLL是不是把驱动程序编译到BSP时得到的?那个应用程序是不是也得在驱动程序编译到BSP后导出和安装SDK后,才能编写???
不知为何,我把驱动编译到BSP的时候,总是出现问题:BUILD: [Thrd:Sequence:Type ] Message
BUILD: [01:0000000019:ERRORE] E:\WINCE600\PLATFORM\SMDK6410\SRC\DRIVERS\GPIO\sources(20) : U1034: syntax error : separator missing
BUILD: [01:0000000021:ERRORE] NMAKE.EXE TargetCompilePass -i -c BUILDMSG=Stop. BUILDROOT=E:\WINCE600\PLATFORM\SMDK6410 NOLINK=1 NOPASS0=1 failed - rc = 2

这是我的source文件:
!if 0
File: sources
Author: Hero

Copyright (c) 1995-2002 Microsoft Corporation. All rights reserved.
!endif

!ifndef BSP_S3C6410_GPIO
SKIPBUILD=1
!endif



TARGETNAME = gpio
RELEASETYPE = PLATFORM
TARGETTYPE = DYNLINK
DLLENTRY = DllEntry

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

INCLUDES= \
$(_TARGETPLATROOT)\inc; \
$(_COMMONOAKROOT)\inc; \

$(_PLATFORMROOT)\common\src\soc\s3c6410_sec_v1\oal\inc;\

$(_PUBLICROOT)\common\oak\inc;$(_PUBLICROOT)\common\sdk\inc;$(_PUBLICROOT)\co
mmon\ddk\inc; \
..\..\inc

SOURCES= \
gpio.cpp \

错误就指向TARGETLIBS= \
$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \


 回复 引用 查看   

#66楼 2011-04-18 13:12 hero_xu      

以下是我的驱动程序,麻烦楼主大哥帮忙看看~~
很无奈的说,这是我看着2440手册的LED驱动来写的,而我用的是CE6.0下的6410,我一直疑惑需要包含哪些头文件,还有source文件中的TARGETLIBS、INCLUDES应该包含什么?求楼主大哥帮忙~~我的驱动程序的目的就是驱动GPIO,能让它输出高低电平就行了~~
驱动如下:
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s3c6410.h"

#define IO_CTL_GPIO_ON 0x01
#define IO_CTL_GPIO_OFF 0x02

volatile S3C6410_GPIO_REG *s6410IOP;

BOOL mInitialized;
void Virtual_Alloc(); //Virtual allocation

BOOL WINAPI DllEntry(HANDLE hinstDLL, DWORD dwReason, LPVOID/*lpvReserved*/)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}

void Virtual_Alloc()
{
//GPIO Virtual alloc
s6410IOP=(volatile S3C6410_GPIO_REG*)VirtualAlloc((0,sizeof(S3C6410_GPIO_REG),MEM_RESERVE,PAGE_NOACCESS);
if (s6410IOP == NULL)
{
DEBUGMSG (1,(TEXT("s6410IOP is not allocated\r\n")));
}
else
{
if (!VirtualCopy((PVOID)s6410IOP, (PVOID)(S3C6410_BASE_REG_PA_GPIO>>8), sizeof(S3C6410_GPIO_REG), PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE))
{
DEBUGMSG (1,(TEXT("s6410IOP is not mapped\n\r")));
}
}
}

BOOL GpioInit()
{
RETAILMSG(1,(TEXT("Gpio_Setting-----\r\n")));
s6410IOP->GPNCON=s6410IOP->GPNCON & 0x0000FFFF | 0x77770000; //配置第9、11、13、15位为输出引脚
return TRUE;
}

DWORD GPI_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("GPIO_Init-----\r\n")));

//1.Virtual Alloc
Virtual_Alloc();
GpioInit();
mInitialized=TRUE;

return TRUE;
}

BOOL GPI_Deinit(DWORD hDeviceContext)
{
BOOL bRet=TRUE;
RETAILMSG(1,(TEXT("GPIO:GPI_Deinit\r\n")));
return TRUE;
}

BOOL GPI_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,
PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
GpioInit();
switch(dwCode)
{
case IO_CTL_GPIO_ON:
s6410IOP->GPNDAT |= (1<<13);
break;
case IO_CTL_GPIO_OFF:
s6410IOP->GPNDAT &= ~(1<<13);
break;
default:
break;
}
RETAILMSG(1,(TEXT("GPIO:Ioctl code=0x%x\r\n"),dwCode));
return TRUE;
}

DWORD GPI_Open( DWORD hDeviceContext,DWORD AccessCode,DWOR ShareMode)
{
RETAILMSG(1,(TEXT("USER:GPIO_Open\r\n")));
return TRUE;
}

DWORD GPI_Close( DWORD hOpenContext)
{
s6410IOP->GPNDAT &= ~(1<<13);
RETAILMSG(1,(TEXT("USER:GPIO_Close\r\n")));
return TRUE;
}

void GPI_PowerUp( DWORD hDeviceContext )
{
RETAILMSG(1,(TEXT("USER:GPIO_PowerUp\r\n")));
}

void GPI_PowerDown( DWORD hDeviceContext )
{
RETAILMSG(1,(TEXT("USER:GPIO_PowerDown\r\n")));
}

DWORD GPI_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
RETAILMSG(1,(TEXT("USER:GPIO_Read\r\n")));
return TRUE;
}

DWORD GPI_Seek(DWORD hOpenContext,long Amount,DWORD Type)
{
RETAILMSG(1,(TEXT("USER:GPIO_Seek\r\n")));
return 0;
}

DWORD GPI_Write(DWORD hOpenContext,LPCVOID pSourceBytes,DWORD NumberOfBytes)
{
RETAILMSG(1,(TEXT("USER:GPIO_Write\r\n")));
return 0;
}

 回复 引用 查看   

#67楼[楼主] 2011-04-18 23:17 wince.he      

@hero_xu
驱动和测试应用程序是完全独立的。驱动程序可以在BSP中,也可以用VS2005单独编译。WinCE下流驱动的参考代码:http://files.cnblogs.com/we-hjb/WCEDrv.rar
另外,SDK与驱动程序也没有必然的联系,即使你在系统中添加了新的驱动,一般情况下,也无需重新定制SDK的。
 回复 引用 查看   

#68楼 2011-04-18 23:41 hero_xu      

谢谢楼主的回答!!你的回答去除我一大阻碍!这两天我一直纠结在把驱动编译到BSP时产生的错误~~  回复 引用 查看   

#69楼 2011-04-19 15:29 qewq[未注册用户]

下载你的那个小助手,360检测出有木马啊,怎么回事啊!  回复 引用   

#70楼 2011-04-19 19:10 hero_xu      

楼主你好!!我自己写了一个GPIO的流驱动,但导入注册表后,想要激活驱动时,激活不成功,显示Error ID:2。
我又用了你的那个DM_2.9里面的驱动测试程序,结果也还是一样?请问是什么原因??我记得我之前试的时候,是行的,不知何原因?
我用的平台是ARM6410+WinCE6.0

另外,还有个问题:我也想在模拟器里使用,你的DM_2.9里面有个模拟器版本的,但我打开DM时说不是WinCE的有效程序??难道那个是不能在CE6.0模拟器下运行的吗???
 回复 引用 查看   

#71楼 2011-04-19 21:31 hero_xu      

好奇怪的说,我用楼主给的驱动测试程序(ARM),当我用导入注册表的时候,激活失败,当我直接导入Dll时,就能成功激活~~
因为我的文件是放在U盘里的,放不到CE的根目录,说是不够内存。我就怀疑是Dll的目录问题,所以就把自己的驱动里的注册表里的Dll路径改成:"Dll"="\\硬盘\\GPIODrv\\GPIODrv.dll" ,结果还是不行。
用直接导入Dll的方法,也是同样不行~~显示Error ID:2。楼主大哥,这是怎么回事?
 回复 引用 查看   

#72楼[楼主] 2011-04-19 22:18 wince.he      

引用qewq:下载你的那个小助手,360检测出有木马啊,怎么回事啊!

误报,不必担心。  回复 引用 查看   

#73楼[楼主] 2011-04-19 22:22 wince.he      

@hero_xu
错误号2,表示“系统找不到指定的文件”。可能还是DLL路径设置的问题。
请确认驱动DLL确实存在于指定的路径下。
 回复 引用 查看   

#74楼 2011-04-19 22:27 hero_xu      

楼主大哥,我猜到可能是这个问题了,我也做了相应的改正,也尝试过直接导入注册表的方法,但还是不行啊~~相关文件我已经发到你的邮箱里了~~麻烦帮我测试一下  回复 引用 查看   

#75楼 2011-04-20 01:22 hero_xu      

楼主大哥你好,问题解决了,谢谢你一直以来的指导!!
我换了一种编译驱动的平台,我换了个Win32平台,不用MFC,同样的Dll文件,MFC平台下编译出来的Dll总是存在错误代号2的问题~~而Win32那个Dll则不存在这样的问题~~
 回复 引用 查看   

#76楼 2011-04-20 01:29 hero_xu      

具体原因我也不清楚,按理论,MFC导出的Dll里,验证过确实有导出了驱动函数的,会不会是DM软件目前不支持MFC的驱动呢?
还有一点给大家分享一下:用VS2005,Win32平台编译的Dll,如果用def文件导出函数时,我发现是没能导出的,而且没有导出LIB文件,这个在VC是可以的,原因我也不清楚,知道原因的高人,指导一下吧,换成extern "C" __declspec(dllexport)这种方法,则LIB,Dll均能正常导出~~
 回复 引用 查看   

#77楼[楼主] 2011-04-20 22:29 wince.he      

@hero_xu
用def文件应该也是可以导出函数的,配置一下就可以了。
 回复 引用 查看   

#78楼 2011-04-30 11:26 SWIFTT[未注册用户]

ActivateDeviceEx()返回值为什么是0呢?用GetLastError()函数查的是1,功能错误,楼主大哥帮忙啊!  回复 引用   

#79楼[楼主] 2011-05-06 22:43 wince.he      

@SWIFTT
应该是驱动程序的代码有问题。
请参考http://www.cnblogs.com/we-hjb/archive/2010/12/30/1922563.html,里面有流驱动的示例代码。
 回复 引用 查看   

#80楼 2011-07-22 09:19 郁金香驱动      

@aawolf
驱动不错 赠送一套郁金香老师的经典之作 郁金香驱动 过驱动保护http://www.cctry.com/thread-30455-1-1.html
 回复 引用 查看   

#81楼 2011-07-22 09:19 郁金香驱动      

@aawolf
驱动不错 赠送一套郁金香老师的经典之作 郁金香驱动 过驱动保护http://www.cctry.com/thread-30455-1-1.html
 回复 引用 查看   

#82楼 2011-08-02 11:11 逸然      

版主,麻烦做一个ARM架构是ARM11,家族是ARMv6KZ,内核为ARM1176JZF-S的动态加载流驱动的工具啊  回复 引用 查看   

#83楼 2011-08-02 11:18 逸然      

楼主,能不能提供个源码给我啊,我现在需要在ARMv6KZ家族下开发一个类似于你的动态加载流驱动文件的工具,麻烦了,我的邮箱:lyglary@126.com,不胜感激  回复 引用 查看   

#84楼[楼主] 2011-08-02 22:22 wince.he      

@逸然
这个可以在ARM11上直接用。
 回复 引用 查看   

#85楼 2011-09-05 13:38 liwenfu456      

wince.he 的邮箱怎么无法发送邮件过去呢,有个很急的问题想请教,也是类似hero_xu那样的报错。  回复 引用 查看   

#86楼 2011-09-05 13:39 liwenfu456      

hero_xu能留个联系方式不?  回复 引用 查看   

#87楼 2011-09-05 13:39 liwenfu456      

@hero_xu
具体是怎么解决的,可否指点下,留个联系方式吧。
 回复 引用 查看   

#88楼[楼主] 2011-09-05 19:52 wince.he      

@liwenfu456
Error ID也是2?估计是DLL路径或者驱动本身的问题。hero_xu后来就是重新编写DLL解决的。
 回复 引用 查看   

#89楼 2011-09-06 21:06 ForEverNoob[未注册用户]

楼主你好。。首先谢谢您的无私奉献。。然后我还想请教个问题。
我现在弄wince6.0 6410的唤醒。但是每次都是在打开大文件后(打开小于1M的文件就没有问题)。就唤醒不起来。我加了很多打印信息查看。发现好像是卡在SD驱动里。我又把SD驱动去除编译了一遍。再休眠唤醒就没有问题。
2.在我的打印信息里发现SD驱动的powerup其实是已经成功调用过了。好像卡在sd卡驱动的其他函数里了。这里会先判断了sd是否插入,然后具体卡在哪里没查到。
3.在成功的唤醒输出信息里我发现:在sd卡驱动里有个sleep函数。我在这加打印信息。发现唤醒会运行到sleep的时候,唤醒了别的驱动。比如MFC。AC97.还有什么read Reclaim(好像是NAND驱动里的)。难道在唤醒的时候不是一个一个唤醒吗?为什么会穿插别的powerup呢?
4,上面的几个驱动唤醒后。跟着还是一些SD的BusRequestHandler处理。
现在已经不知道怎么弄了。希望楼主能帮下忙。谢谢~
 回复 引用   

#90楼 2011-09-06 21:06 ForEverNoob[未注册用户]

楼主你好。。首先谢谢您的无私奉献。。然后我还想请教个问题。
我现在弄wince6.0 6410的唤醒。但是每次都是在打开大文件后(打开小于1M的文件就没有问题)。就唤醒不起来。我加了很多打印信息查看。发现好像是卡在SD驱动里。我又把SD驱动去除编译了一遍。再休眠唤醒就没有问题。
2.在我的打印信息里发现SD驱动的powerup其实是已经成功调用过了。好像卡在sd卡驱动的其他函数里了。这里会先判断了sd是否插入,然后具体卡在哪里没查到。
3.在成功的唤醒输出信息里我发现:在sd卡驱动里有个sleep函数。我在这加打印信息。发现唤醒会运行到sleep的时候,唤醒了别的驱动。比如MFC。AC97.还有什么read Reclaim(好像是NAND驱动里的)。难道在唤醒的时候不是一个一个唤醒吗?为什么会穿插别的powerup呢?
4,上面的几个驱动唤醒后。跟着还是一些SD的BusRequestHandler处理。
现在已经不知道怎么弄了。希望楼主能帮下忙。谢谢~
 回复 引用   

#91楼[楼主] 2011-09-06 22:40 wince.he      

@ForEverNoob
你好,所打开的文件应该是NAND上的吧?从现象来看,很有可能是SD卡驱动的问题。
我手上刚好也有一块6410的板子,有时间试一下这个问题。
 回复 引用 查看   

#92楼 2011-09-07 14:41 ForEverNoob[未注册用户]

@wince.he
是的。就是从NAND打开的应用程序。
我们用的就是sd卡驱动也是开发板的。我还特意尝试了下开发板上的休眠与唤醒。结果也是一样的。。您觉得这个如何下手解决呢?
 回复 引用   

#93楼[楼主] 2011-09-08 21:12 wince.he      

@ForEverNoob
你用的是哪家的开发板?BSP代码调整过吗?
 回复 引用 查看   

#94楼 2011-09-09 13:48 ForeEverNoob[未注册用户]

@wince.he
用的是real6410的。bsp很少调整。只是更改过键盘和摄像头得驱动。其他应该没动过。
 回复 引用   

#95楼 2011-09-19 10:18 liwenfu456      

@wince.he
大侠您好,您现在邮箱是多少呢,有些问题想请教一下,比如keybd的驱动需要按什么步骤添加进来呢,我把键盘驱动加到mini6410的工程后居然发现触摸屏不正常了,随便点击一下就弹出菜单,我的邮箱是:liwenfu456@126.com
 回复 引用 查看   

#96楼[楼主] 2011-09-21 22:01 wince.he      

@liwenfu456
从你描述的现象来看,键盘驱动应该是加进来了,否则不会对系统有影响。估计是加入键盘驱动后,有中断频繁触发,导致系统变慢,点击触屏变成了长按,进而弹出菜单。
 回复 引用 查看   

#97楼 2011-09-23 09:42 liwenfu456      

@wince.he
您好,我是在mini6410的开发板上加的8 X 8键盘驱动的,目前的开发板上没有接键盘,键盘驱动源码是原厂提供的keybd工程,触摸屏驱动也是开发板上自带的,像这样的情况应该从哪些方面进行排查呢,我是个新手,还望大侠指点迷津。
 回复 引用 查看   

#98楼 2011-09-23 09:43 liwenfu456      

@wince.he
有一点没想明白的是键盘没有加进来,为何会产生中断呢,是什么导致中断频繁发生呢?
 回复 引用 查看   

#99楼 2011-09-29 11:25 Forevernoob[未注册用户]

楼主您好。上次问题解决了。卡在一个sleep里。
但现在唤醒后,wifi无法识别。这个项目用的SDIO接口。但是在发送CMD 5的时候,就出现了错误,也就是说无法识别wifi的SDIO?(没唤醒可以识别)同时SD是可以识别的。请问这个会是IO口再唤醒后的设置问题?还是其他的问题
 回复 引用   

#100楼[楼主] 2011-10-01 00:33 wince.he      

@liwenfu456
这个很有可能是硬件不同引起的。比如开发板键盘驱动里有一个引脚用作电平触发中断,当这个引脚满足它的中断电平时,就会不断触发系统进入中断。如果你的系统支持HIVE注册表,可以用驱动调试助手将键盘相关注册表修改掉,保存注册表,然后重启系统看看是否系统能进入正常状态.
 回复 引用 查看   

#101楼[楼主] 2011-10-01 00:40 wince.he      

@Forevernoob
刚刚看了下我用的开发板,系统正常开机时,SD的初始化好似就有问题,打印信息如下:
[HSMMC0] Initializing the HSMMC Host Controller
[HSMMC0] Setting registers for the USB48MHz (EXTCLK for SDCLK) : SYSCon.
[HSMMC0] Setting registers for the GPIO.
[HSMMC0] Setting registers for the USB48MHz (EXTCLK) : HSMMCCon.
-OALIntrRequestSysIntr(irq = 94, sysIntr = 25)
[HSMMC1] Initializing the HSMMC Host Controller
[HSMMC1] Setting registers for the USB48MHz (EXTCLK for SDCLK) : SYSCon.
[HSMMC1] Setting registers for the GPIO.
[HSMMC1] Setting registers for the USB48MHz (EXTCLK) : HSMMCCon.
-OALIntrRequestSysIntr(irq = 7, sysIntr = 26)
-OALIntrRequestSysIntr(irq = 95, sysIntr = 27)
[HSMMC0] SDHCControllerIst - Card is Inserted!
[HSMMC1] SDHCControllerIst - Card is Inserted!
[HSMMC0] Setting for 1 bit mode , Clock Rate = 100000 Hz
[HSMMC0] HandleErrors - ERR CMD:5 : If the card is not a SDIO, CMD 5 does not work in reason.
[HSMMC0] HandleErrors - ERR CMD:1 : If the card is not a MMC, CMD 1 does not work in reason.
Exception 'Data Abort' (4): Thread-Id=02070002(pth=85dc1418), Proc-Id=00400002(pprc=81679308) 'NK.EXE', VM-active=00400002(pprc=81679308) 'NK.EXE
'
PC=c09825e8(s3c6410_hsmmc1.dll+0x000025e8) RA=c0982870(s3c6410_hsmmc1.dll+0x0000
2870) SP=d2a7fe70, BVA=00000924
[HSMMC1] Setting for 1 bit mode , Clock Rate = 100000 Hz
[HSMMC1] HandleErrors -ERR CMD:5 : If the card is not a SDIO, CMD 5 does not work in reason.
[HSMMC1] HandleErrors - ERR CMD:8 : If the card is not SD SPEC 2.0, CMD 8 does not work in reason.
[HSMMC1] HandleErrors - ERR CMD:1 : If the card is not a MMC, CMD 1 does not work in reason.
[HSMMC1] HandleErrors - ERR CMD:55 : [HSMMC1] HandleErrors -CMD Timeout Error...

HSMMC0上的SD卡倒是正常使用的,板上没有接WIFI模块。
 回复 引用 查看   

#102楼 2011-10-08 09:22 liwenfu456      

@wince.he
我把注册表里键盘的部分删掉,这个时候触摸屏是正常的,看键盘的驱动倒是没看出什么问题来,不过开发板上是没有接键盘的,和这个有关系吗?即使没接键盘 应该不至于影响触摸屏的吧?
 回复 引用 查看   

#103楼[楼主] 2011-10-11 00:18 wince.he      

@liwenfu456
检查下键盘驱动中使用的所有GPIO在你的开发板上是如何连接的,应该是某个地方冲突了。
 回复 引用 查看   

#104楼 2011-10-12 12:32 liwenfu456      

@wince.he
好的,我检查一下看看,对了顺便请教一下6410的核心板触摸屏的分辨率是在哪里设置的呢?
 回复 引用 查看   

#105楼 2011-10-12 21:36 forevernoob[未注册用户]

@wince.he
这个SD卡驱动产生了dataabort?我的驱动没有这个问题。以前的问题是启动会读取一个注册表值,但我在注册表没查到那个键值,直接把那个过程给修改成一个数,后来驱动就没问题了。。我的板子运行应用软件有这个databort地问题。是关于GWES,但是启动和功能好像问题不大,不知道将来有什么隐患~以前我找过分析这种问题的方法,需要一个软件,但是只能用于wince 5.0.6.0上软件好像不支持。就一直没看。
 回复 引用   

#106楼 2011-10-12 22:26 forevernoob[未注册用户]

我还想请教大哥一个方法:现在用ADC测量电量,但现在电量的变化比较大。我尝试用sleep和多次取值求均值的方法,发现这样系统延迟会很大。好像在驱动中要尽量避免sleep函数。但还有什么方法能减缓抽样频率吗?除了sleep和寄存器。我希望能达到秒级的。同时不会造成系统延迟。  回复 引用   

#107楼[楼主] 2011-10-16 20:42 wince.he      

@liwenfu456
你说的触摸屏分辨率是触摸屏X、Y方向原始采样值吧?这个跟它所使用的AD有关,如使用12bit的AD,其对应的采样值为0~4095,实际使用的有效范围没这么大,会在触摸屏驱动中设置有效的最大值和最小值。
 回复 引用 查看   

#108楼[楼主] 2011-10-16 20:45 wince.he      

@forevernoob
ADC测量电池电压,测出结果变化较大,估计是ADC配置的问题,首先得解决这个问题。否则,多次取值求平均的意义不大。
另外,驱动中使用Sleep应该不会导致系统变慢。你说的系统延迟很大,应该是别的原因引起的。
 回复 引用 查看   

#109楼 2011-10-19 10:42 liwenfu456      

@wince.he
键盘的驱动已经加到BSP里了,bsp的REG和BIB 以及DIRS都加了,生成的BIN文件的注册表里也有keybd的东西了,可是系统起来发现没去加载键盘这块的驱动,应当从哪些地方检查呢?新手,迷茫了,大侠指点下哈。
 回复 引用 查看   

#110楼 2011-10-20 20:03 forevernoob[未注册用户]

@wince.he
回头我看看配置;
如果我的sleep的参数大于50就会在应用软件上造成延迟几s的延迟。而且这个不延迟时间不定。但如果参数小于10就不会有这个问题。这样还不能说明是sleep的问题吗?不知道如果改成直接读取寄存器的值的话,会不会读取的太快?
 回复 引用   

#111楼[楼主] 2011-10-21 22:20 wince.he      

@liwenfu456
看下windows目录下是否有键盘驱动dll,大小是否跟bsp键盘驱动编译出来的一致,有时候它会被替换掉。另外使用驱动调试助手看下注册表中是否有相应的键和正确的键值。
 回复 引用 查看   

#112楼[楼主] 2011-10-21 22:23 wince.he      

@forevernoob
从你描述的现象来看,有可能是Sleep用错了地方,一般只在工作线程中加Sleep,如果在XXX_READ中加Sleep,是会影响应用程序。
 回复 引用 查看   

#113楼 2011-10-25 16:54 liwenfu456      

@wince.he
大侠 用VS2005写的一个简单的窗体程序在设备上一跑报下面的错误:

“testNull.exe”(托管): 已加载“C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dll”,未加载符号。
“testNull.exe”(托管): 已加载“d:\手持设备\驱动开发\testnull\testnull\bin\debug\testNull.exe”,符号已加载。
未处理的“System.MissingMethodException”类型的异常出现在 未知模块 中。

其他信息: 找不到文件或程序集名称“System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC”,或找不到它的一个依赖项。



建一个空的窗体也是报这个错误,是我的系统少了啥吗?
 回复 引用 查看   

#114楼[楼主] 2011-10-26 00:19 wince.he      

@liwenfu456
应该是少了.NET Compact Framework 组件.
 回复 引用 查看   

#115楼 2011-10-31 09:41 liwenfu456      

@wince.he
这个问题解决了,SQLCE、SQLCOMPACT卸载后就好了,还想请教几个问题,我在注册表选项已经勾的是hive了,为什么我开机后设置的一些比如触摸屏校准坐标之类的数据重启后又被恢复了呢?我的注册表还要做什么改变吗?怎么检查比如触摸屏那块的注册表信息是否是HIVE的呢? 现在我的系统开机后放到NAND盘符里的文件,重启后就丢失了,我使用的是nboot加载系统的方式,这个一般要查什么模块呢?
 回复 引用 查看   

#116楼 2011-10-31 15:03 白福      

支持中文显示 support CHS菜单的原理可以既简单的描述给我吗 谢谢了 邮箱是baifucn@139.com  回复 引用 查看   

#117楼[楼主] 2011-11-01 23:01 wince.he      

@白福
你好,这个过程主要分为三步,首先是将字体文件放到windows目录下,然后修改注册表,最后通知系统加载新的字体。
 回复 引用 查看   

#118楼[楼主] 2011-11-01 23:04 wince.he      

@liwenfu456
你好,你的问题还不在HIVE。看起来NAND驱动本身就有问题。首先解决NAND保存文件的问题。确认下你的驱动是否支持现在所用的NAND。
 回复 引用 查看   

#119楼 2011-11-02 09:43 liwenfu456      

@wince.he
您好,NAND的驱动确实看起来有些问题,但是这个问题是在nboot调用的flash驱动呢,还是CE系统调用的那部分nand驱动呢?
 回复 引用 查看   

#120楼 2011-11-02 14:09 白福      

已收到 谢谢您 希望今后可以和您更多的交流 在您有需要的时候能够帮到您  回复 引用 查看   

#121楼 2011-11-03 09:50 liwenfu456      

@wince.he
您好,我现在用的工程是MINI6410的,三星原厂有自带一个BSP,怎么样才可以用三星自带的这个BSP替换我原来工程的BSP呢,这样替换改动量大吗,可行吗?
 回复 引用 查看   

#122楼[楼主] 2011-11-03 20:40 wince.he      

@liwenfu456
BOOT和内核中的NAND相关代码都需要检查一下。
同一工程使用不同BSP的方法,请参考WinCE下多份BSP的维护技巧
 回复 引用 查看   

#123楼[楼主] 2011-11-03 20:41 wince.he      

@白福
嗯,欢迎多交流。
 回复 引用 查看   

#124楼 2011-11-08 10:12 liwenfu456      

@wince.he
高手,请教一下,我自己建的一个工程然后引入了三星的6410BSP,老是编译不错,错误信息是这样的:

BUILD: [Thrd:Sequence:Type ] Message
BUILD: [01:0000000938:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000000998:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001013:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001033:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001054:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001071:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001101:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001121:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001147:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001169:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001184:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001211:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001233:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001252:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001267:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001282:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001297:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001314:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001332:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001349:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001365:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001393:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001422:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001443:ERRORE] Pipe read failed - errno = 22
BUILD: [01:0000001469:ERRORE] Pipe read failed - errno = 22

这个BSP我放到MINI6410的工程底下编译是没问题的,自己建的就老编译不过。
 回复 引用 查看   

#125楼 2011-11-10 11:07 liwenfu456      

@wince.he
请教个问题,WINCE 6 里怎么注册OCX控件呢,是否可以直接在注册表里加,若可以 这个是怎么加的呢? 现在用C#开发个应用 需要调用到OCX控件。
 回复 引用 查看   

#126楼 2011-12-07 14:36 不胜寒[未注册用户]

楼主,我下载了你的助手,你那个例程也完全一致,但是我加载一个中断事件的驱动的时候就加载失败了,error ID:1,还有一个问题就是我怎么导入之后就怎么也删除不了,我也没保存注册表,重启后还在那里,求解答~~~~~~~~~~  回复 引用   

#127楼[楼主] 2011-12-18 23:15 wince.he      

@不胜寒
驱动加载失败,应该跟驱动程序的实现有关。
重启后注册表仍然存在,说明你的系统实现了HIVE注册表。
 回复 引用 查看   

#128楼 2011-12-29 14:54 wincenoob[未注册用户]

博主您好,不知道您有没有弄过摄像头驱动,我现在在摄像头驱动碰到个问题。所以向您请教下。这个cpu是6410,6410应该支持从cam直接抓图。但我如何才能走scalerbypass通道呢?是不是bsp里已经写好了的?还有就是我在驱动中看到3个模式。一个video_capture,一个still_capture,一个是preview。第一个是录像吗?第二个是普通摄像头抓图?  回复 引用   

#129楼[楼主] 2011-12-30 23:37 wince.he      

@wincenoob
S3C6410的BSP中有完整的摄像头驱动,之前验证过OV9650_MODULE,支持预览、拍照及录制视频。
 回复 引用 查看   

#130楼 2012-01-12 10:15 forevernoob[未注册用户]

@wince.he
主要这个摄像头是500W的。必须走旁路模式,但三星的bsp里好像走的是scaler通道,而且发现500w的yuv数据,wince6.0原来的驱动好像运起来会很慢(网上查的)。现在想把wince5.0的camera驱动移植过来。不知道难度怎么样?这个差别和工作。想请教一下~
 回复 引用   

#131楼[楼主] 2012-01-15 14:52 wince.he      

@forevernoob
6410的CIF驱动没有仔细研究过。之前仅仅修改了代码,实现预览图像的旋转,主要是修改了输入图像的分辨率。
 回复 引用 查看   

评论共2页: 上一页 1 2 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1250838 clo7fDRw28M=