2017-01-25 3 views
0

Ich versuche mit einem AD9913 Evaluierungsboard (Analog Devices) zu kommunizieren, welches einen Cypress FX-2 USB Controller hat. Ich schrieb eine voll funktionsfähige Python-Bibliothek, die fehlerfrei auf Windows 7 funktioniert (mit einem Treiber, der durch libusb-win32-1.2.6.0's inf-wizard.exe generiert wurde), aber jetzt versuche ich, die gleiche Software von einem Raspberry Pi 3 mit zu starten Raspbian Jessie und kann nicht scheinen zu schreiben oder zu lesen.pyusb - [Fehler 5] unter Linux, aber nicht Windows

Die folgende minimal Beispiel funktioniert auf 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) 

Die ouput hier:

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

Doch auf der Himbeere mehrere Probleme auftreten. Erstens ist die Produkt-ID 0xEE24 (die ich durch dmesg fand heraus), und zweitens gibt das Codebeispiel oben

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 

ich das Skript bin Ausführung von sudo python minimal_example.py Aufruf, sonst (wie erwartet) bekomme ich usb.core.USBError: [Errno 13] Access denied (insufficient permissions). (Für das oben beschriebene Testen habe ich die udev-Regeln entfernt, die ich hinzugefügt habe, um Zugriff auf mein normales Benutzerkonto zu ermöglichen, und danach neu gestartet und das Gerät neu angeschlossen.)

Ich habe auch festgestellt, dass unter Windows Configuration 1 (das ist die einzige Konfiguration wie offenbart) von

cfg = dev.get_active_configuration() 

zu oben genannten Beispielskript hinzufügen, hat nur ein Interface 0, wo wie auf Linux Interface 0 hat keine Endpunkte, aber es gibt zusätzliche Schnittstellen Interface 0, 1, Interface 0, 2 und Interface 0,3, von denen die erste auf die identisch ist einzige von Windows angezeigte Schnittstelle.

Das Entfernen der Kernel-Treiber wie beschrieben in this post - die mein gegenwärtiges Verständnis als USB-Neuling hier nicht erforderlich sein sollte - löst das Problem nicht.

Ich vermute, dass das Problem aus einer Differenz zwischen den Windows/libusb und Linux-Implementierung/Backend der USB-Kommunikation ergibt sich (bereits angedeutet durch die Tatsache, dass die ProduktID gezeigt für das gleiche Stück Hardware gebunden ist anders), Dies könnte einige Änderungen an der Art und Weise erfordern, wie ich auf den USB-Endpunkt schreibe.

Ich bin glücklich, weitere Informationen zur Verfügung zu stellen, wenn nötig und begrüßen alle Hinweise und Vorschläge.

Antwort

0

Obwohl ich immer noch nicht mit dem Gerät auf dem Raspberry Pi kommunizieren kann, wird das Fehler 5 Problem gelöst, indem explizit eine geeignete alternative Einstellung mit geeigneten Endpunkten, z.

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

lesen Dann/Schreibanforderungen nicht mehr fehl mit Error 5, aber mit einem Zeitfehler (die Error 110 für libusb1 und None für libusb0 ist).

Ich vermute jetzt, dass es ein Problem gibt, wie das Gerät vom Betriebssystem erkannt wird, da sich nicht nur die productID zwischen Windows und Linux ändert, sondern auch wMaxPacketSize für die Endpunkte, die mich interessieren, als 64 Bytes angegeben ist unter Windows und 512 Byte unter Linux.

Sobald ich in meiner Fehlersuche weiter bin, werde ich entweder eine neue Frage öffnen und den Link als Kommentar zu dieser Antwort hinzufügen (oder die gesamte Lösung hier posten, falls ich alles sofort lösen kann).

Verwandte Themen