阅读:11254回复:58
我用evc做一个usb设备的驱动,有几个问题想请教大家,谢谢!!
1.很多人都是用pb做驱动,我没有装那个,我觉得用evc也可以做吧,写成dll,提供msdn上说的那些接口函数就可以把?
2.我用evc做了一个试验的驱动dll,只提供USBDeviecAttach,USBInstallDriver,USBUninstallDriver三个函数,编译成dll后拷贝到pda上,插入usb设备,提示选择驱动程序,我输入我的dll名称,系统提示加载未知usb设备驱动程序失败!!我看了系统的注册表,相关的信息没有被写入(在HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients下面),不知道怎么回事,大家一般怎么调试阿?RETAILMSG和DEBUGMSG怎么用啊,输出在哪里? 3.有没有例子阿?还有usb设备是不是也可以写成流式接口驱动(stream interface driver)?好不好写? 谢谢,期待你的答复!! |
|
最新喜欢:flyfir...
|
沙发#
发布于:2005-07-25 16:38
怎么没有人回答啊,斑竹大哥能不能提点建议啊,小弟初学CE下的驱动设计,疑惑很多,希望大侠不吝赐教!!
|
|
|
论坛版主
|
板凳#
发布于:2005-07-25 16:40
1.可以
2.你要写usb host端的client驱动?你的设备不能归入标准的那几类?如果非要写,框架可以参考common\oak\drivers\usb\class里面的那些client驱动,比如storage。实验框架的话USBInstallDriver是最先被下层usbd.dll调用的,你可以加些调试信息在里面看看代码跑到这儿没有。然后再说另外两个。 |
|
地板#
发布于:2005-07-25 17:20
谢谢斑竹大哥的回复,我就是要写usb host端的client驱动,是一个数码相机的驱动。
你说的那个common\oak\drivers\usb\class目录是安装上pb以后的sample么?我没有pb,如果你有例子能不能给我发一份,谢谢阿,he-qing@163.com 另外我想问问关于装载驱动的问题,我写一个试验的那种,就是实现了哪三个借口函数USBDeviecAttach,USBInstallDriver,USBUninstallDriver,第一个基本上不做什么事情,第二个像注册表写驱动程序的信息,第三个取消注册表中的信息。加载时就是插上usb线,然后在提示框中输入我编译的dll名字,但是加载时白,不知道为什么,注册表中也没有被改。 我怎么调试阿,没有pb,用evc编写,谢谢!! |
|
|
论坛版主
|
地下室#
发布于:2005-07-26 13:33
喔,没办法弄到pb? 4.2和5.0都行,我这边工作的机器在内网,还不好弄出来,你问问其他方便的兄弟,把那个目录里面的源代码考给你就行了。
你的硬件板子是什么?不会是产品吧??最好用评估版,这样可以用串口输出调试信息来调,不过如果真在产品里面,你可以试试能不能弹出系统对话框,总之,有个可以输出信息的地方就行,然后你在USBInstallDriver里面输出一个调试信息,这个函数是最先调用到的(注册表匹配不到你这种设备的情况下,否则是USBDeviecAttach)。先做到这步再说。 |
|
5楼#
发布于:2005-07-26 14:03
十分感谢wxl_50685330大哥的指点,小弟初学,很多问题比较基本。我们用的是Acer n50那款pda 。cup是Intel Xscale的类型,主频312MHz,64RAM,64ROM,带usb host功能,插上u盘可以识别出来,我看了他的注册表,里面有关于u盘的驱动登记记录。
看了你的回复,我是这样做的,我把编译好的dll拷贝到pda的windows目录下面,我插上usb线后,系统弹出了输入驱动程序名的对话框,我把驱动名称输入了xxx.dll,但是系统报未知usb设备加载驱动程序失败,我认为我输入驱动名称后,系统应该调用我驱动的USBInstallDriver函数,是这样么,我在函数入口处添加了messagebox,没有弹出,不知道什么原因,你能帮我分析一下么?谢谢 |
|
|
论坛版主
|
6楼#
发布于:2005-07-26 15:24
你看看你的[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients]里面是怎么写的,贴出来。
如果你已经弹出对话框输入你自己的client driver名字的话,那可以肯定一定要执行了你的USBInstallDriver,你是否在xxx.def里面输出了这个函数? 另外,在这里面输出信息用messagebox可能不行吧,你试试这个: #include <netui.h> CallNetMsgBox(NULL,NMB_FL_OK|NMB_FL_TITLEUSB,NETUI_GETNETSTR_USB_INSTALL_FAILURE,L"abcd"); |
|
7楼#
发布于:2005-07-26 16:16
论坛好象不能发图,我看了它机器上的注册表,上边有u盘的驱动,在\LoadClients下面 \LoadClients\Default\Default\8\Mass_Storage_Class,我的.def文件输出三个函数,就是USBDeviecAttach,USBInstallDriver,USBUninstallDriver这三个函数。def文件也拷贝到windows目录下了。我的代码如下,很简单的,用CallNetMsgBox没有弹出,麻烦wxl_50685330大哥帮我看一下
// haha.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "haha.h" #include "Usbdi.h" #include "Usb100.h" #include "Usbtypes.h" #include "netui.h" #define ZONE_INIT 0 #define ZONE_ERROR 1 #define ZONE_TRANSFER 2 #define ZONE_EVENTS 3 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // This is the constructor of a class that has been exported. // see haha.h for the class definition CHaha::CHaha() { return; } extern "C" BOOL USBDeviceAttach( USB_HANDLE hDevice, // USB设备句柄 LPCUSB_FUNCS lpUsbFuncs, // USBDI的函数集合 LPCUSB_INTERFACE lpInterface, // 设备接口描述信息 LPCWSTR szUniqueDriverId, // 设备ID描述字符串。 LPBOOL fAcceptControl, // 返回TRUE,标识我们可以控制此设备, 反之表示不能控制 LPCUSB_DRIVER_SETTINGS lpDriverSettings, DWORD dwUnused) { MessageBox(NULL,L"hi",L"hello",MB_OK); *fAcceptControl = FALSE; // 我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。 if (lpInterface == NULL) return FALSE; // 打印相关的USB设备接口描述信息。 DEBUGMSG(ZONE_INIT,(TEXT("USBMouse: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u,Prot:%u\r\n"), lpInterface->Descriptor.bInterfaceNumber,lpInterface->Descriptor.bNumEndpoints, lpInterface->Descriptor.bInterfaceClass,lpInterface->Descriptor.bInterfaceSubClass,lpInterface->Descriptor.bInterfaceProtocol)); *fAcceptControl = TRUE; return TRUE; } const WCHAR gcszRegisterClientDriverId[] = L"RegisterClientDriverID"; const WCHAR gcszRegisterClientSettings[] = L"RegisterClientSettings"; const WCHAR gcszUnRegisterClientDriverId[] = L"UnRegisterClientDriverID"; const WCHAR gcszUnRegisterClientSettings[] = L"UnRegisterClientSettings"; const WCHAR gcszMouseDriverId[] = L"Camera_Cannon_300D"; extern "C" BOOL USBInstallDriver( LPCWSTR szDriverLibFile) // @parm [IN] - Contains client driver DLL name { BOOL fRet = FALSE; HINSTANCE hInst = LoadLibrary(L"usbd.dll"); // 注册USB设备信息 if(hInst) { CallNetMsgBox(NULL,NMB_FL_OK|NMB_FL_TITLEUSB,NETUI_GETNETSTR_USB_INSTALL_FAILURE,L"abcd"); LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID) GetProcAddress(hInst, gcszRegisterClientDriverId); LPREGISTER_CLIENT_SETTINGS pRegisterSettings = (LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst, gcszRegisterClientSettings); if(pRegisterId && pRegisterSettings) { USB_DRIVER_SETTINGS DriverSettings; DriverSettings.dwCount = sizeof(DriverSettings); // 设置我们的特定的信息。 DriverSettings.dwVendorId = USB_NO_INFO; DriverSettings.dwProductId = USB_NO_INFO; DriverSettings.dwReleaseNumber = USB_NO_INFO; DriverSettings.dwDeviceClass = USB_NO_INFO; DriverSettings.dwDeviceSubClass = USB_NO_INFO; DriverSettings.dwDeviceProtocol = USB_NO_INFO; DriverSettings.dwInterfaceClass = 0x03; // HID DriverSettings.dwInterfaceSubClass = 0x01; // boot device DriverSettings.dwInterfaceProtocol = 0x02; // mouse fRet = (*pRegisterId)(gcszMouseDriverId); if(fRet) { fRet = (*pRegisterSettings)(szDriverLibFile, gcszMouseDriverId, NULL, &DriverSettings); if(!fRet) { //BUGBUG unregister the Client Driver's ID } } } else { RETAILMSG(1,(TEXT("!USBMouse: Error getting USBD function pointers\r\n"))); } FreeLibrary(hInst); } CallNetMsgBox(NULL,NMB_FL_OK|NMB_FL_TITLEUSB,NETUI_GETNETSTR_USB_INSTALL_FAILURE,L"abcdedf"); return fRet; } extern "C" BOOL USBUnInstallDriver() { BOOL fRet = FALSE; HINSTANCE hInst = LoadLibrary(L"usbd.dll"); if(hInst) { LPUN_REGISTER_CLIENT_DRIVER_ID pUnRegisterId = (LPUN_REGISTER_CLIENT_DRIVER_ID) GetProcAddress(hInst, gcszUnRegisterClientDriverId); LPUN_REGISTER_CLIENT_SETTINGS pUnRegisterSettings = (LPUN_REGISTER_CLIENT_SETTINGS) GetProcAddress(hInst, gcszUnRegisterClientSettings); if(pUnRegisterSettings) { USB_DRIVER_SETTINGS DriverSettings; DriverSettings.dwCount = sizeof(DriverSettings); // 必须填入与注册时相同的信息。 DriverSettings.dwVendorId = USB_NO_INFO; DriverSettings.dwProductId = USB_NO_INFO; DriverSettings.dwReleaseNumber = USB_NO_INFO; DriverSettings.dwDeviceClass = USB_NO_INFO; DriverSettings.dwDeviceSubClass = USB_NO_INFO; DriverSettings.dwDeviceProtocol = USB_NO_INFO; DriverSettings.dwInterfaceClass = 0x03; // HID DriverSettings.dwInterfaceSubClass = 0x01; // boot device DriverSettings.dwInterfaceProtocol = 0x02; // mouse fRet = (*pUnRegisterSettings)(gcszMouseDriverId, NULL, &DriverSettings); } if(pUnRegisterId) { BOOL fRetTemp = (*pUnRegisterId)(gcszMouseDriverId); fRet = fRet ? fRetTemp : fRet; } FreeLibrary(hInst); } return fRet; } |
|
|
论坛版主
|
8楼#
发布于:2005-07-26 16:34
1.你在DLLMAIN里面就用MESSAGEBOX输出东西试试呢
2.你在USBINSTALLDRIVER里面不用LOAD USBD.DLL,你的驱动是被USBD.DLL加载的,你直接用它输出的函数就可以了。 |
|
9楼#
发布于:2005-07-26 16:56
好的,wxl_50685330大哥的回复真是及时,我试试哈,我这个是网上一个usb鼠标的例子,我想试试看能不能加载。有问题再请教你
|
|
|
10楼#
发布于:2005-07-26 17:25
不行啊,如果不加载库USBD.DLL,直接调用RegisterClientDriverID等四个函数,编译时报链接错误,我查看了usbdi.h头文件,上面说RegisterClientDriverID等四个函数是USBD.DLL的输出函数,奇怪的是,我们驱动的输出函数是被usbd.dll调用的是么?
刚才有个同志给我发了u盘驱动的代码,我看了它的USBINSTALLDRIVER函数中是直接调用RegisterClientDriverID的,也没有加载USBD.DLL,但是我编译说链接错误,为什么,而且USBD.dll根本找不到,我通过remote file viewer在设备的windows目录下找到了usbd.dll,但是也不能考出来,期待wxl_50685330大哥回复,谢谢 |
|
|
11楼#
发布于:2005-07-26 18:38
1.你在DLLMAIN里面就用MESSAGEBOX输出东西试试呢
我在DLLMAIN里面用MESSAGEBOX可以打印,它确实调用了我的dll,但是好象没有进入USBINSTALLDRIVER函数,我再看看,还是加载了USBD.DLL,如不加载,编译报连接错误。 |
|
|
12楼#
发布于:2005-07-26 20:33
嘿嘿,确实没有进入USBINSTALLDRIVER函数,我把.def文件加进工程又编译了一次,这回可以进入USBINSTALLDRIVER函数了,加载usbd.dll成功,写注册表成功了,\LoadClients下已经有我的设备驱动登记了,但是系统报加载驱动失败,不知道为什么,是不是只提供那三个函数还不够啊,期待wxl_50685330大哥解答:),
|
|
|
13楼#
发布于:2005-07-27 09:57
加载驱动失败是因为注册表选项错误,我重新把USBINSTALLDRIVER函数中的注册表设置几行改了一下,现在已经可以成功加载我的空驱动了(什么事也没干),注册表里写入了正确的信息,下次插入设备能自动加载我的空驱动了:),另外我还有两个问题想请教wxl_50685330大哥:
1.目前的驱动只提供了三个出口函数,而且是给系统调用的,我想写个驱动主要是想给应用程序调用,实现特定的功能,我看了下u盘的代码,它除了提供那三个接口外,还提供了五个接口函数,GETWORD,SETWORD,usbsDataTransfer等,我想这些函数也是提供给系统调用的把,不知道对不对,如果我想在应用程序中调用驱动的某些接口,怎么设计驱动呢,是不是要写成流式接口驱动? 2.还有有没有好的调试方法,谢谢,希望wxl_50685330大哥解答:) |
|
|
14楼#
发布于:2005-07-28 09:17
我看了一天资料,越来越感觉要写成流式的驱动,是不是除了提供USBINSTALLDRIVER等三个函数之外,再提供xxx_init等接口函数就可以了?
|
|
|
论坛版主
|
15楼#
发布于:2005-07-29 14:03
首先恭喜革命取得长足进步哈!!:)))
下面是引用hepower于2005-07-26 17:25发表的: 你编译的时候要加usbd.lib才可以直接用三,你按他的写法写就行了。可以不动的最好不动,等你有时间慢慢试三:) |
|
论坛版主
|
16楼#
发布于:2005-07-29 14:06
下面是引用hepower于2005-07-26 20:33发表的: ......:)你那个def你不说你加了的嘛,不会你写到驱动目录里面就算完吧....,当然要加到工程里面三:) |
|
论坛版主
|
17楼#
发布于:2005-07-29 14:09
下面是引用hepower于2005-07-26 17:25发表的: client输出的函数有些给上层用,有些给usbd.dll用,这也是合理的三,中间层驱动嘛自然要向上下个开放些接口罗 |
|
论坛版主
|
18楼#
发布于:2005-07-29 14:13
那三个给usbd.dll的接口函数你的照章办事,剩下的向应用暴露的接口就可以随便了,可以做成流接口,但也不是必须,你和写应用的人定义一下接口和语义即可。good luck!
|
|
19楼#
发布于:2005-07-29 16:49
啊!!!wxl_50685330大哥终于回复了,回复了好多啊,看的我直流口水呢:)学习ing!!
我在驱动中调用某些传输函数已经成功了,目前就是要和应用程序开放接口了,继续努力,有不明白的地方还要向你请教呢:),谢谢!! |
|
|
上一页
下一页