在我看来,linux按照预期的方式进行:OUT报告通过与HID报告关联的端点传输,我们从libusb获取:
Item | Dev | EP | Status | Speed |Payload-----------------+-----+----+--------+-------+-------------------------------OUT transaction | 13 | 4 | ACK | FS | 64 bytes (90 13 00 00 00 00 ..
另一方面,windows通过控制端点(EP0)发送它.我们使用安装API来查找具有我们需要的用法的设备,为IN和OUT打开它并使用相同的文件描述符进行读写. EP4 IN报告很好地通过这个文件描述符接收,但是通过相同的文件描述符编写报告,最终在EP0上:
Item | Dev | EP | Status | Speed |Payload-------------------+-----+----+--------+-------+-------------------------------Class request OUT | 25 | 0 | OK | FS | 64 bytes (90 13 00 00 00 00 ..
(抱歉,无法发布图片(还).我手动复制了Ellisys报告)
嵌入式设备不检查收到OUT报告的EP(即EP0上的SET报告将汇集到与处理HID事件时在其他端点上找到的OUT报告相同的功能),因此它将以任一方式响应.
我的问题是:两种方式都是正确的,如果没有,哪种方法是正确的,哪种方法不正确?难道我们的描述符中的错误会在windows上触发此行为吗?
完成:这是我们的描述符:http://tny.cz/ac745a8f(从供应商识别中剥离,让我的老板高兴:))
在windows上缩放到报告中:(欢乐!我现在可以拍照:))
整个交易:
windows上使用的库:hID.lib,hIDclass.lib和setupAPI.lib.在编写报告时,我们使用函数HIDP_SetUsageValueArray和HIDD_SetoutputReport.找到PHIDP_PREPARSED_DATA和HIDP_CAPS,其函数为HIDD_GetAttributes,HIDD_GetPreparsedData和HIDP_GetCaps.使用SetupDIEnumDeviceInterfaces找到设备的文件路径.如果我们找到一个具有正确VID,PID,caps.UsagePage和caps.Usage的设备,那就是我们使用的设备.
在linux上它有点棘手,因为我不是实现linux代码的人.我所知道的是使用libusb-1.0.9,使用libusb_open_device_with_vID_pID打开设备,使用libusb_fill_interrupt_transfer和libusb_submit_transfer发送报告.我看到libuwand_fill_interrupt_transfer接受一个端点作为参数,所以我认为只有libusb_open_device_with_vID_pID的句柄并将正确的参数作为端点传递,libusb将找出放置报告的位置.
解决方法 我想我找到了答案.纯粹是巧合,我偶然发现了Keil论坛,我发现声明’HIDD_SetoutputReport将使用控制端点,如果你想通过另一个端点,请使用Writefile’.我知道5年多以前我曾经尝试过这条路,但我陷入了重叠结构的异步IO中.因为看起来我有一个出路(使用HIDD_SetoutputReport)我放弃了Writefile路径.所以现在是时候再次寻求这条道路了,我做到了.代码:
res = HIDD_SetoutputReport(m_DeviceControl[dev],report,m_CapsControl[dev].OutputReportByteLength);
已被取代
DWORD bytesWritten; OVERLAPPED eventWrite = {0}; eventWrite.hEvent = CreateEvent(NulL,TRUE,FALSE,NulL); int rv3 = Writefile(m_DeviceControl[dev],m_CapsControl[dev].OutputReportByteLength,&bytesWritten,&eventWrite); if (rv3 == 0) { int err = GetLastError(); if (err == ERROR_IO_PENDING) { bool done = false; do { // yes. Wait till pending state has gone rv3 = WaitForSingleObject(eventWrite.hEvent,25); if (rv3 == WAIT_OBJECT_0) { GetoverlappedResult(m_DeviceControl[dev],&eventWrite,FALSE); done = true; res = TRUE; } else if (rv3 == WAIT_TIMEOUT) { // Need to try again. } else { m_StopPingControlOut = true; done = true; } } while (!done && !m_StopPingControlOut); } } }
这使得请求超过了正确的端点.
因此,我得出以下结论:
>我认为HID设备解释通过控制端点发送的OUT报告是错误的.>正确使用Writefile(具有重叠的IO)使OUT报告使用正确的端点.
总结以上是内存溢出为你收集整理的linux – USB HID OUT报告 – 哪个端点是对的?全部内容,希望文章能够帮你解决linux – USB HID OUT报告 – 哪个端点是对的?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)