pyusb - Linux上的[错误5],但不是Windows

时间:2017-01-25 15:33:05

标签: raspberry-pi usb libusb pyusb libusb-win32

我正在尝试与具有赛普拉斯FX-2 USB控制器的AD9913评估板(ADI公司)进行通信。我编写了一个功能齐全的Python库,它可以在Windows 7上完美运行(使用通过libusb-win32-1.2.6.0和inf-wizard.exe生成的驱动程序),但现在我尝试从Raspberry运行相同的软件Pi 3与Raspbian Jessie似乎无法写或读。

以下最小示例适用于Windows 7:

import os
os.environ['PYUSB_DEBUG'] = 'debug'

import usb.core
print "usb.core file:", usb.core.__file__

# get device
dev = usb.core.find(idVendor=0x0456, idProduct=0xEE25)
if dev is None:
    raise ValueError("Device not found")
dev.set_configuration()

# get the firmware version
print "Write: ", dev.write(0x01, [0x00])
print "Read: ", dev.read(0x81, 7)

这里的输出是:

usb.core file: C:\Python27\lib\site-packages\usb\core.pyc
Write:  1
Read:  array('B', [1, 0])

但是,在Raspberry上会出现几个问题。首先,产品ID是0xEE24(我通过dmesg找到),第二,上面的代码示例给出了

usb.core file: /usr/local/lib/python2.7/dist-packages/usb/core.pyc
Write:
Traceback (most recent call last):
    File "usbtesting_minimal_linux.py", line 29, in <module>
      print "Write: ", dev.write(0x01, [0x00])
    File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 948, in write
self.__get_timeout(timeout)
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 824, in bulk_write
timeout)
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 920, in __write
_check(retval)
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 595, in _check
     raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 5] Input/Output Error

我通过调用sudo python minimal_example.py执行脚本,否则(按预期)我得到usb.core.USBError: [Errno 13] Access denied (insufficient permissions)。 (对于上述测试,我删除了我添加的udev规则以允许访问我的常规用户帐户,然后重新启动并重新插入设备。)

我还注意到在Windows上Configuration 1(这是唯一的配置),通过添加

显示
cfg = dev.get_active_configuration()

上述示例脚本只有一个Interface 0,其中Linux Interface 0上没有端点,但还有其他接口Interface 0, 1Interface 0, 2和{{1第一个与Windows显示的唯一界面相同。

如上所述in this post分离内核驱动程序 - 这在我目前的理解中不应该是USB新手 - 不能解决问题。

我怀疑这个问题源于Windows通信的Windows / libusb和Linux实现/后端之间的区别(已经暗示所显示的产品ID对于所连接的同一硬件而言是不同的),可能需要对我写入USB端点的方式进行一些更改。

如果需要,我很乐意提供更多信息,并欢迎所有提示和建议。

2 个答案:

答案 0 :(得分:1)

很有可能没有上传由固件引起的此错误。通常,FX-2 USB控制器不保存固件。

答案 1 :(得分:0)

虽然我仍然无法与Raspberry Pi上的设备通信,但是通过明确选择具有适当端点的合适备用设置来解决错误5问题,例如

dev.set_interface_altsetting(interface = 0, alternate_setting = 1)

然后使用Error 5读取/写入请求不再失败,但出现超时错误(Error 110libusb1Nonelibusb0

我现在怀疑操作系统如何检测到设备存在问题,因为不仅Windows和Linux之间的productID发生变化,而且我感兴趣的端点也会wMaxPacketSize在Windows上为64字节,在Linux上为512字节。

一旦我在故障排除中继续进行,我将打开一个新问题并添加链接作为对此答案的评论(或在此处发布整个解决方案,以防我可以立即解决所有问题)。