论坛版主
|
40楼#
发布于:2005-08-05 14:39
喔,你是这么考虑的啊:)恩,有思路,我忘了你在产品上开发了,我还想让你在注册表DRIVERS\BUILTIN里面来加在你的驱动,如果在产品上其实也可以,你可以用函数往BUILTIN里面写,然后重起机器,不过你自己来ACTIVE这个办法好:)!不用重起。
对了,其实流接口不流接口只是一个组件(这里是驱动)和其他组件交互的一个方式而已,一个模块可能有很多和外界的交互接口,你这个驱动就是典型的多接口类型驱动。除了流接口还有其他很多接口,有的向上,有的向下,有的加载时候用,有的工作(USB设备插入)时侯用。 应用来调用也可以阿,就和你在ATTACHDEVICE的时候一样啊,返回的句柄你的应用可以直接用啊。 |
|
41楼#
发布于:2005-08-09 11:27
二位大哥,我也在做一个usb流接口驱动,也是用pb带的打印机驱动在改,请问一下,
#define USB_PRN_SIG 0x50425355 // "USBP" tag 这个0x50425355是从哪里得到的.我是第一次做驱动,请各位大侠帮忙. |
|
42楼#
发布于:2005-08-09 11:43
还有,wxl_50685330大哥说得要加usbd.lib,可我找不到usbd.lib在哪里呀,帮帮忙啊!!
|
|
论坛版主
|
43楼#
发布于:2005-08-09 13:40
那个sig你自己去个名字就行了三:)
usbd.lib在public下的你自己建的project里面的sysgen\\oak\lib里面啊,这个库时生成你的平台时系统重新生成的,不在common\\oak\\lib里面哈 |
|
44楼#
发布于:2005-08-09 14:09
感谢wxl_50685330大哥神速回复!!!!!!!!!!!
我也在做一个usb流驱动,是用来 和下位机通讯的. 我受hepower大哥启发,用一样思路,用打印机驱动来改,只是我们下位机的usb固件还没有做好,我暂时用usb鼠标来模拟下位机,做驱动. 我在改写中有几个问题: 1.usb设备一插上应该先是USBInstallDriver被调用,可是我在插上设备后只有USBDeviceAttach被调用(我在三个usb接口函数中分别写了MessageBox来确定函数是否被调用)而弹出对话框.所以[HKEY_LOCAL_MACHINE\\Driver\\USB\\ClientDrivers]下没有被注册. 2.我在\LoadClients下面是这样写的 \LoadClients\1133_49213\Default\Default\Stream_USB 1133_49213是鼠标的pid&vid,将来会改为下位机usb口的pid&vid,那么鼠标的协议码是3,我是不是也应该写为\LoadClients\1133_49213\Default\3\Stream_USB才行呢,然后,到最后用下位机的时候改为\LoadClients\1133_49213\Default\(下位机协议类型)\Stream_USB呢? 3.我搜索了一下,你说的地方没有usbd.lib,我的整个硬盘里都没有,呵呵.我还是才用了hepower大哥的方法,加载usbd.dll. 小弟我刚刚开始做CE驱动,比较迷茫,请几位大哥指点,谢谢!!!!!!!!! |
|
论坛版主
|
45楼#
发布于:2005-08-09 14:55
1.你的注册表配置导致了USBInstallDriver不会执行,只有在下层读出的pid&vid等匹配不到时系统才会谈出对话框叫你选择你想加载的client驱动,你这里配的注册表使usbd.dll能识别这个设备,所以就直接调用deviceattach了
2.是的,不过有些信息你不清楚可以不用写那么详细,第一次系统会询问你加载你自己的client driver,然后在installdriver里面你可以读设备信息,然后建立注册表,下次就可以自动了。 3.没有就算了,你就这样做吧,如果需要,你可以手动去编译那个库,good luck:) |
|
46楼#
发布于:2005-08-09 15:06
#define USB_PRN_SIG 0x50425355 // "USBP" tag
这个0x50425355是从哪里得到的.我是第一次做驱动,请各位大侠帮忙. 这个tag是自己定义的,用来验证是不是自己的设备 1。你的注册表中的LoadClients下面已经有设备信息了,证明系统已经调用过你的dll的USBInstallDriver函数了,USBInstallDriver是设备第一次插上会调用的函数(系统会弹出对话框,让你输入驱动名称,因为LoadClients下没有匹配到你设备的信息),USBInstallDriver会在LoadClients下生成一些设备信息,(你自己写的)后面再插设备后,系统直接调用驱动的USBDeviceAttach函数来初始化了,如果你想让系统调用你驱动的USBInstallDriver函数,可以用Remote Registor Editor把LoadClients下面关于你设备的登记信息手动删除,再插设备。 3。我也没找到,不过windows目录下面有usbd.dll可以加载 |
|
|
47楼#
发布于:2005-08-09 16:10
哦,明白了,谢谢二位大哥!!!!!!!!!!!!!!!!!!!!!!
我试试去 |
|
48楼#
发布于:2005-08-09 17:33
我按照hepower大哥说得做了,USBInstallDriver正常被调用,但是USBDeviceAttach被调用时第二个参数LPCUSB_INTERFACE UsbInterface和最后一个参数DWORD Unused为NULL导致USBDeviceAttach函数返回false.
BOOL USBDeviceAttach( USB_HANDLE hDevice, LPCUSB_FUNCS UsbFuncs, LPCUSB_INTERFACE UsbInterface, LPCWSTR UniqueDriverId, LPBOOL AcceptControl, LPCUSB_DRIVER_SETTINGS UsbDriverSettings, DWORD Unused ) 而USBDeviceAttach执行完后又会弹出对话框提示输入驱动.是不是我的设备信息没有写对造成的. 另一个问题: wxl_50685330说得,可以在USBInstallDriver去获取设备信息,怎样获取呢,用什么函数?或者有其他的什么工具软件可以获取吗? |
|
49楼#
发布于:2005-08-10 11:07
我的usb注册信息没有写对,改后UsbInterface参数有效了,Unused仍然为NULL.
插入设备后系统提示输入驱动名,输入后USBInstallDriver执行了,注册表中也更新了,可是,随后USBDeviceAttach被调用后,系统又提示输入驱动.不知道为什么.请帮我看看. 我用usbview抓取了usb信息如下: Device Descriptor: bcdUSB: 0x0200 bDeviceClass: 0x00 bDeviceSubClass: 0x00 bDeviceProtocol: 0x00 bMaxPacketSize0: 0x08 (8) idVendor: 0x046D (Logitech Inc.) idProduct: 0xC03D bcdDevice: 0x2000 iManufacturer: 0x01 iProduct: 0x02 iSerialNumber: 0x00 bNumConfigurations: 0x01 ConnectionStatus: DeviceConnected Current Config Value: 0x01 Device Bus Speed: Low Device Address: 0x02 Open Pipes: 1 Endpoint Descriptor: bEndpointAddress: 0x81 Transfer Type: Interrupt wMaxPacketSize: 0x0004 (4) bInterval: 0x0A BOOL USBInstallDriver( LPCWSTR szDriverLibFile ) { HKEY hKey = NULL; BOOL bRc; HINSTANCE hInst = LoadLibrary(L"USBD.DLL"); if( !hInst ) { return false; } LPREGISTER_CLIENT_SETTINGS pRegisterSettings = (LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst, gcszRegisterClientSettings); LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID) GetProcAddress(hInst, gcszRegisterClientDriverId); const WCHAR wsUsbDeviceID[] = CLASS_NAME_SZ; WCHAR wsSubClassRegKey[sizeof(CLIENT_REGKEY_SZ)+16] = CLIENT_REGKEY_SZ; USB_DRIVER_SETTINGS usbDriverSettings ; usbDriverSettings.dwCount = sizeof(usbDriverSettings); usbDriverSettings.dwVendorId = USB_NO_INFO; usbDriverSettings.dwProductId = USB_NO_INFO; usbDriverSettings.dwReleaseNumber = USB_NO_INFO; usbDriverSettings.dwDeviceClass = USB_NO_INFO; usbDriverSettings.dwDeviceSubClass = USB_NO_INFO; usbDriverSettings.dwDeviceProtocol = USB_NO_INFO; usbDriverSettings.dwInterfaceClass = 0x03; // HID usbDriverSettings.dwInterfaceSubClass = 0x01; // boot device usbDriverSettings.dwInterfaceProtocol = 0x02; // mouse DEBUGMSG( ZONE_USB_INIT, (TEXT(">USBInstallDriver(%s)\n"), szDriverLibFile )); // // register with USBD // bRc = ( *pRegisterId )( wsUsbDeviceID ); if ( !bRc ) { DEBUGMSG( ZONE_ERR, (TEXT("RegisterClientDriverID error:%d\n"), GetLastError())); return FALSE; } bRc = ( * pRegisterSettings)( szDriverLibFile, wsUsbDeviceID, NULL, &usbDriverSettings ); if ( !bRc ) { DEBUGMSG( ZONE_ERR, (TEXT("RegisterClientSettings error:%d\n"), GetLastError())); return FALSE; } FreeLibrary(hInst); DEBUGMSG( ZONE_USB_INIT, (TEXT("<USBInstallDriver:%d\n"), bRc )); return bRc; } BOOL USBDeviceAttach( USB_HANDLE hDevice, LPCUSB_FUNCS UsbFuncs, LPCUSB_INTERFACE UsbInterface, LPCWSTR UniqueDriverId, LPBOOL AcceptControl, LPCUSB_DRIVER_SETTINGS UsbDriverSettings, DWORD Unused ) { BOOL bRc = TRUE; return bRc; } |
|
50楼#
发布于:2005-08-10 11:29
那个Unused应该就是NULL吧,应该是不用的,
你的USBDeviceAttach函数的AcceptControl参数是作为返回值的,这个值表示驱动能否控制该设备,如果是FALSE,驱动就会加载不成功,你在USBDeviceAttach中把它改成TRUE试一下吧 |
|
|
论坛版主
|
51楼#
发布于:2005-08-10 13:24
我说的读信息是在下层传上来的参数里面,好像是USBDEVICEATTACH的第三个参数,记不清了,你看看COMMON\\OAK\\DRIVERS\\USB\\CLASS\STORAGE\\CLASS里面的USBMSC.C,下层的设备基本信息已经被读出来了,你只需要从下层传来的数据块中读就可以了(基本应该是,有点儿记不清了:))。
|
|
52楼#
发布于:2005-08-11 11:45
今天下位机的usb固件做好了,但是调试时又出现了问题.
usbDeviceAttach被调用时又出现第三个参数Usbinterface为NULL,也就是wxl_50685330大哥说得含有usb端口信息的参数. 我的usbDriverSettings结构时这样写的: USB_DRIVER_SETTINGS usbDriverSettings ; usbDriverSettings.dwCount = sizeof(usbDriverSettings); usbDriverSettings.dwVendorId = 1137; usbDriverSettings.dwProductId = 1638; usbDriverSettings.dwReleaseNumber = USB_NO_INFO; usbDriverSettings.dwDeviceClass = USB_NO_INFO; usbDriverSettings.dwDeviceSubClass = USB_NO_INFO; usbDriverSettings.dwDeviceProtocol = USB_NO_INFO; usbDriverSettings.dwInterfaceClass = USB_NO_INFO; usbDriverSettings.dwInterfaceSubClass = USB_NO_INFO; usbDriverSettings.dwInterfaceProtocol = USB_NO_INFO; 设备usb信息如下: Device Descriptor: bcdUSB: 0x0100 bDeviceClass: 0xDC bDeviceSubClass: 0x00 bDeviceProtocol: 0x00 bMaxPacketSize0: 0x10 (16) idVendor: 0x0471 idProduct: 0x0666 bcdDevice: 0x0100 iManufacturer: 0x00 iProduct: 0x00 iSerialNumber: 0x00 bNumConfigurations: 0x19 ConnectionStatus: DeviceConnected Current Config Value: 0x00 Device Bus Speed: Full Device Address: 0x02 Open Pipes: 0 写上VID&PID就应该能认到设备呀,可是................. 我不知道时什么原因,请帮忙看看. BOOL USBInstallDriver( LPCWSTR szDriverLibFile ) { HKEY hKey = NULL; BOOL bRc; HINSTANCE hInst = LoadLibrary(L"USBD.DLL"); if( !hInst ) { return false; } LPREGISTER_CLIENT_SETTINGS pRegisterSettings = (LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst, gcszRegisterClientSettings); LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID) GetProcAddress(hInst, gcszRegisterClientDriverId); const WCHAR wsUsbDeviceID[] = CLASS_NAME_SZ; WCHAR wsSubClassRegKey[sizeof(CLIENT_REGKEY_SZ)+16] = CLIENT_REGKEY_SZ; USB_DRIVER_SETTINGS usbDriverSettings ; usbDriverSettings.dwCount = sizeof(usbDriverSettings); usbDriverSettings.dwVendorId = 1137; usbDriverSettings.dwProductId = 1638; usbDriverSettings.dwReleaseNumber = USB_NO_INFO; usbDriverSettings.dwDeviceClass = USB_NO_INFO; usbDriverSettings.dwDeviceSubClass = USB_NO_INFO; usbDriverSettings.dwDeviceProtocol = USB_NO_INFO; usbDriverSettings.dwInterfaceClass = USB_NO_INFO; usbDriverSettings.dwInterfaceSubClass = USB_NO_INFO; usbDriverSettings.dwInterfaceProtocol = USB_NO_INFO; DWORD dwPortStatusTimeout = GET_PORT_STATUS_TIMEOUT; DWORD dwDeviceIdTimeout = GET_DEVICE_ID_TIMEOUT; DWORD dwSoftResetTimeout = SOFT_RESET_TIMEOUT; DWORD dwReadTimeoutMultiplier = READ_TIMEOUT_MULTIPLIER; DWORD dwReadTimeoutConstant = READ_TIMEOUT_CONSTANT; DWORD dwWriteTimeoutMultiplier = WRITE_TIMEOUT_MULTIPLIER; DWORD dwWriteTimeoutConstant = WRITE_TIMEOUT_CONSTANT; REG_VALUE_DESCR usbPrnKeyValues[] = { (TEXT("Dll")), REG_SZ, 0, (PBYTE)(DRIVER_NAME), (TEXT("Prefix")), REG_SZ, 0, (PBYTE)(DEVICE_PREFIX), GET_PORT_STATUS_TIMEOUT_SZ, REG_DWORD, 0, (PUCHAR)(&dwPortStatusTimeout), GET_DEVICE_ID_TIMEOUT_SZ, REG_DWORD, 0, (PUCHAR)(&dwDeviceIdTimeout), SOFT_RESET_TIMEOUT_SZ, REG_DWORD, 0, (PUCHAR)(&dwSoftResetTimeout), READ_TIMEOUT_MULTIPLIER_SZ, REG_DWORD, 0, (PUCHAR)(&dwReadTimeoutMultiplier), READ_TIMEOUT_CONSTANT_SZ, REG_DWORD, 0, (PUCHAR)(&dwReadTimeoutConstant), WRITE_TIMEOUT_MULTIPLIER_SZ, REG_DWORD, 0, (PUCHAR)(&dwWriteTimeoutMultiplier), WRITE_TIMEOUT_CONSTANT_SZ, REG_DWORD, 0, (PUCHAR)(&dwWriteTimeoutConstant), NULL, 0, 0, NULL }; DEBUGMSG( ZONE_USB_INIT, (TEXT(">USBInstallDriver(%s)\n"), szDriverLibFile )); // register with USBD bRc = ( *pRegisterId )( wsUsbDeviceID ); if ( !bRc ) { DEBUGMSG( ZONE_ERR, (TEXT("RegisterClientDriverID error:%d\n"), GetLastError())); return FALSE; } bRc = ( * pRegisterSettings)( szDriverLibFile, wsUsbDeviceID, NULL, &usbDriverSettings ); if ( !bRc ) { DEBUGMSG( ZONE_ERR, (TEXT("RegisterClientSettings error:%d\n"), GetLastError())); return FALSE; } FreeLibrary(hInst); // Add our default values to the reg if ( !GetSetKeyValues( wsSubClassRegKey, &usbPrnKeyValues[0], SET, TRUE ) ) { DEBUGMSG( ZONE_ERR, (TEXT("GetSetKeyValues failed!\n"))); } DEBUGMSG( ZONE_USB_INIT, (TEXT("<USBInstallDriver:%d\n"), bRc )); MessageBox(NULL, _T("USBInstallDriver"), _T("OK"), MB_OK); return bRc; } |
|
53楼#
发布于:2007-01-12 12:58
自己做USB驱动呀??唉,我看都看不懂,别说写了。惭愧。。。
|
|
54楼#
发布于:2007-02-27 21:11
fenstein,你的问题解决了没有? 我碰到的问题和你一样,指定了VID和PID,UsbDeviceAttach被调用时第三个参数usbInterface为NULL,所以直接返回了,请问各位高手这种情况该如何解决,是不是设备的注册信息还设置不对? 请指教。
|
|
55楼#
发布于:2007-03-01 16:19
我在用GetSetKeyValues函数设置注册表键值时,老是出错! 不知道为什么??
代码如下: WCHAR wsSubClassRegKey[sizeof(CLIENT_REGKEY_SZ)+16] = CLIENT_REGKEY_SZ; REG_VALUE_DESCR LmeusbKeyValues[] = { TEXT("Dll"), REG_SZ, 0, (PBYTE)(DRIVER_NAME), NULL, 0, 0, NULL }; // Set our default values to the register if (!GetSetKeyValues(wsSubClassRegKey , LmeusbKeyValues, FALSE, TRUE)) { MessageBox(NULL,_T("Wrong to Set Registry Values!!"), _T("OK"), MB_OK); return FALSE; } 求教各位兄弟,这种情况该如何解决?? 谢谢! |
|
56楼#
发布于:2007-07-27 10:41
请问你的下位机程序能贴出来看看吗?
[quote]引用第52楼fenstein于2005-08-11 11:45发表的 : 今天下位机的usb固件做好了,但是调试时又出现了问题. usbDeviceAttach被调用时又出现第三个参数Usbinterface为NULL,也就是wxl_50685330大哥说得含有usb端口信息的参数. 我的usbDriverSettings结构时这样写的: USB_DRIVER_SETTINGS usbDriverSettings ; |
|
57楼#
发布于:2009-01-06 15:58
Mark
|
|
58楼#
发布于:2009-06-12 10:34
回 24楼(wxl_50685330) 的帖子
有没有人做TD到modem到? |
|
上一页
下一页