pyusb - Linux 上的 [错误 5],但 Windows 上没有
pyusb - [Error 5] on Linux, but not Windows
我正在尝试与 AD9913 评估板 (Analog Devices) 通信,它有一个 Cypress FX-2 USB 控制器。我写了一个功能齐全的 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, 1
、Interface 0, 2
和 Interface 0,3
,其中第一个与 Windows.
显示的唯一界面相同
按照 in this post 所述分离内核驱动程序——根据我目前作为 USB 新手的理解,这里没有必要——不能解决问题。
我怀疑问题源于 USB 通信的 Windows/libusb 和 Linux implementation/backend 之间的差异(显示的产品 ID 与连接的硬件完全相同),这可能需要对我写入 USB 端点的方式进行一些更改。
如果需要,我很乐意提供更多信息,并欢迎所有提示和建议。
虽然我仍然无法与 Raspberry Pi 上的设备通信,但错误 5 问题已通过明确选择具有正确端点的合适替代设置得到解决,例如
dev.set_interface_altsetting(interface = 0, alternate_setting = 1)
然后 read/write 请求不再因 Error 5
而失败,但会出现超时错误(对于 libusb1
为 Error 110
,对于 libusb0
).
我现在怀疑操作系统检测设备的方式有问题,因为不仅 productID 在 Windows 和 Linux 之间变化,而且 wMaxPacketSize
对于我感兴趣的端点,Windows 上为 64 字节,Linux 上为 512 字节。
一旦我进一步进行故障排除,我将打开一个新问题并添加 link 作为对该答案的评论(或 post 整个解决方案,以防我马上就能解决所有问题)。
很有可能是固件没有上传导致的这个错误。通常来说,FX-2 USB 控制器是不保存固件的。
我正在尝试与 AD9913 评估板 (Analog Devices) 通信,它有一个 Cypress FX-2 USB 控制器。我写了一个功能齐全的 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, 1
、Interface 0, 2
和 Interface 0,3
,其中第一个与 Windows.
按照 in this post 所述分离内核驱动程序——根据我目前作为 USB 新手的理解,这里没有必要——不能解决问题。
我怀疑问题源于 USB 通信的 Windows/libusb 和 Linux implementation/backend 之间的差异(显示的产品 ID 与连接的硬件完全相同),这可能需要对我写入 USB 端点的方式进行一些更改。
如果需要,我很乐意提供更多信息,并欢迎所有提示和建议。
虽然我仍然无法与 Raspberry Pi 上的设备通信,但错误 5 问题已通过明确选择具有正确端点的合适替代设置得到解决,例如
dev.set_interface_altsetting(interface = 0, alternate_setting = 1)
然后 read/write 请求不再因 Error 5
而失败,但会出现超时错误(对于 libusb1
为 Error 110
,对于 libusb0
).
我现在怀疑操作系统检测设备的方式有问题,因为不仅 productID 在 Windows 和 Linux 之间变化,而且 wMaxPacketSize
对于我感兴趣的端点,Windows 上为 64 字节,Linux 上为 512 字节。
一旦我进一步进行故障排除,我将打开一个新问题并添加 link 作为对该答案的评论(或 post 整个解决方案,以防我马上就能解决所有问题)。
很有可能是固件没有上传导致的这个错误。通常来说,FX-2 USB 控制器是不保存固件的。