阅读:2520回复:4
HID设备的访问问题
我在用Cypress的CY7C63001做一个HID外设,有两个问题请教:
1、驱动的开发我是门外汉,但是有要通过USB总线对外设的 eeprom读写,如果定义两条Vendor-Specific的读写Request, 需要自己写相应的驱动,我想直接用系统提供的HID类的驱动, 所以决定用Set_Report的方式向外设发送一个数据段,其中 包括eeprom读写指令、eeprom地址和待写数据,firmware parse这个数据段,作出相应的读写操作,这样做可不可以? eeprom的读写操作都在endpoint0中断中完成,执行时间会不会 引起冲突? 2、这个外设安装时也遇到了问题,我直接用系统的Hiddev.inf 文件安装时,win98下正常,win2000下装到最后一步说:安装 失败,没有为设备指定一个功能驱动程序?而且,98下用HIDVIEW 的Full Test,通过了测试,但在使用API访问外设时,总是找不到 外设,调用DiEnumDeviceInterfaces()后,总说没有Interface的 信息? 请指点。艾,急死了。 |
|
沙发#
发布于:2001-09-20 13:00
[QUOTE]原本由 sense 发表
[B]首先,谢谢DKBOY和CBB的指点。 对于第一个问题我试试看吧。 第二个问题能给点提示吗?现在我在98下装好后,用HidView和 USBCheck测试,通过了所有测试,但是我的应用程序就是找不到 这个外设,我检查了一下,VID和PID设置正确,但是当我的应用 程序成功执行完HidD_GetHidGuid(),SetupDiGetClassDevs()后, 在执行SetupDiEnumDeviceInterfaces()时返回:没有发现任何可用信息。怎么会找不到呢?奇怪! [/B][/QUOTE] 看一面一段代码: GUID hidGuid; HidD_GetHidGuid(&hidGuid); HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid, NULL, // no enumerator NULL, // no parent (DIGCF_PRESENT | DIGCF_INTERFACEDEVICE)); if(!hDevInfo) { m_st.SetWindowText("Couldn't get handle for HID devices"); return; } SP_INTERFACE_DEVICE_DATA devInfoData; devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); int deviceNo = 0; SetLastError(NO_ERROR); while(GetLastError() != ERROR_NO_MORE_ITEMS) { if(SetupDiEnumInterfaceDevice (hDevInfo, 0, &hidGuid, deviceNo, &devInfoData)) { ULONG requiredLength = 0; SetupDiGetInterfaceDeviceDetail(hDevInfo, &devInfoData, NULL, 0, &requiredLength, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength); devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(! SetupDiGetInterfaceDeviceDetail(hDevInfo, &devInfoData, devDetail, requiredLength, NULL, NULL)) { AfxMessageBox("Couldn't get HID details"); free(devDetail); return; } // open a file to this device HANDLE hidHandle = CreateFile(devDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); free(devDetail); if(INVALID_HANDLE_VALUE == hidHandle) { AfxMessageBox("Couldn't get HID handle"); return; } |
|
|
板凳#
发布于:2001-09-20 10:35
首先,谢谢DKBOY和CBB的指点。
对于第一个问题我试试看吧。 第二个问题能给点提示吗?现在我在98下装好后,用HidView和 USBCheck测试,通过了所有测试,但是我的应用程序就是找不到 这个外设,我检查了一下,VID和PID设置正确,但是当我的应用 程序成功执行完HidD_GetHidGuid(),SetupDiGetClassDevs()后, 在执行SetupDiEnumDeviceInterfaces()时返回:没有发现任何可用信息。怎么会找不到呢?奇怪! |
|
地板#
发布于:2001-09-20 10:02
[QUOTE]原本由 sense 发表
[B]我在用Cypress的CY7C63001做一个HID外设,有两个问题请教: 1、驱动的开发我是门外汉,但是有要通过USB总线对外设的 eeprom读写,如果定义两条Vendor-Specific的读写Request, 需要自己写相应的驱动,我想直接用系统提供的HID类的驱动, 所以决定用Set_Report的方式向外设发送一个数据段,其中 包括eeprom读写指令、eeprom地址和待写数据,firmware parse这个数据段,作出相应的读写操作,这样做可不可以? eeprom的读写操作都在endpoint0中断中完成,执行时间会不会 引起冲突? 2、这个外设安装时也遇到了问题,我直接用系统的Hiddev.inf 文件安装时,win98下正常,win2000下装到最后一步说:安装 失败,没有为设备指定一个功能驱动程序?而且,98下用HIDVIEW 的Full Test,通过了测试,但在使用API访问外设时,总是找不到 外设,调用DiEnumDeviceInterfaces()后,总说没有Interface的 信息? 请指点。艾,急死了。 [/B][/QUOTE] 完全可以!你的方案是对的,接着做就可以了! |
|
|
地下室#
发布于:2001-09-19 23:22
HID设备的访问问题
用set_report发送可以。CY7C63001没有集成EEPROM interface所以你自己必须按照相关protocol进行读或写,花的时间将是ms级,如果这个功能放在endpoint0中断中完成,我想不行。 |
|