mikrocontroller.net

Forum: PC Hard- und Software USB Kommunikation mit DSO 1062D unter Linux


Autor: Christoph R. (cherub)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich bin froher Besitzer des DSO-1062D von Voltcraft. Im standalone 
Betrieb bin ich voellig zufrieden und immer wieder erstaunt, wie gut 
Messungen gelingen.

Anyhow, es geht nicht um eine Produktbesprechung, sondern um einige 
Fragen.

Fuer ein paar weitergehende Anwendungen wuerde ich gerne per PC an die 
gemessenen Datenpunkte des Geraets kommen. Leider gestaltet sich das 
schwieriger als erhofft. Mangels eines Windows-Systems (und Ahnung 
davon) wollte ich das ganze unter Linux machen. Jetzt stecke ich seit 
drei Tagen mehr oder weniger fest.

Was ich bislang habe ist einmal die Protokoll-Beschreibung von tinman ( 
https://www.mikrocontroller.net/articles/Hantek_Protokoll )

Was mir nicht gelingt ist das DSO (verlaesslich) zur Kommunikation zu 
bewegen. Ich sollte erwaehnen, dass meine USB Kenntnisse in den letzten 
Tagen zwar stark erweitert sind, aber wahrscheinlich immer noch nicht 
ausreichen.
Beim Verbinden des Geraets mit dem Rechner sehe ich das device; output 
von 'lsusb -v' ist unten angehangen. Demnach sollte es nur eine 
Konfiguration geben, die device class ist natuerlich (?) "vendor 
specific".
Mein Vorgehen:
Ich checke, dass der kernel driver nix mit dem device macht, bzw. 
release es. Ich selektiere und aktiviere die Konfiguration, es gibt nur 
eine. Ich kann das device claimen (wenigstens bekomme ich keinen 
Fehler). Ich hole mir die beiden endpoints fuer input, bzw. den output 
(aus host/PC Sicht).

Und trotzdem hole ich mir selbst bei den einfachsten requests timeouts. 
Es ist also klar, dass mir noch irgendeine Information oder ein Schritt 
fehlt.
Falls ich das hinbekomme, dann werde ich den source code auch zur 
Verfuegung stellen. Im Prinzip kann man dann auch eine Anzeige und 
Steuerung vom PC aus machen -- wenn ich denn endlich lerne, wie man mit 
dem Teil sprechen kann.

Ach ja, momentan (und vielleicht auch in Zukunft) schreibe ich das ganze 
in Python. Das backend ist variabel, da ich momentan am meisten mit 
pyusb herumprobiere -- standardmaessig heisst das also libusb1.

Hat jemand einen Vorschlag oder noch eine Idee? Ich habe mir in der 
Bibliothek "USB complete" ausgeliehen, aber das ist ziemlich viel 
Lesestoff -- da werde ich eine Weile brauchen und hoffe erstmal nur, 
dass ich den Fehler finde.

Fuer jede Hilfe dankbar,
Gruesse, Christoph

Zusatzinfo:

Eine typische Fehlermeldung beim Senden von '0x0' ( also "Echo" ) an den 
passenden endpoint erhalte ich:
  File "/nowhere/usb_tests/pyusb/usb/core.py", line 948, in write
    self.__get_timeout(timeout)
  File "/nowhere/usb_tests/pyusb/usb/backend/libusb1.py", line 824, in bulk_write
    timeout)
  File "/nowhere/usb_tests/pyusb/usb/backend/libusb1.py", line 920, in __write
    _check(retval)
  File "/nowhere/usb_tests/pyusb/usb/backend/libusb1.py", line 595, in _check
    raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 110] Operation timed out


Output von 'lsusb -v' (nur fuer das interessante device)
Bus 003 Device 004: ID 049f:505a Compaq Computer Corp. Linux-USB "CDC Subset" Device, or Itsy (experimental)
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x049f Compaq Computer Corp.
  idProduct          0x505a Linux-USB "CDC Subset" Device, or Itsy (experimental)
  bcdDevice           24.30
  iManufacturer           1 Linux 3.2.35 with s3c-hsudc
  iProduct                2 Gadget Serial v2.4
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          3 Generic Serial config
    bmAttributes         0xc0
      Self Powered
    MaxPower                2mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich dachte mir:

https://sourceforge.net/directory/os:linux/?q=DSO-1062

bringt aber nur ein paar Sachen für DSO-2xxx.
Vielleicht ist aber doch eine Anregung dabei.

Autor: Christoph R. (cherub)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, ja. Ich habe mehrere verfuegbare Kommunikationstools ausprobiert; 
z.B. openHantek, oder auch das tool von Peter Dreisiebner. Aber alle 
sind entweder outdated, nicht lauffaehig oder versagen auch in der 
Kommunikation.

Was ich auch schreiben sollte ist, dass ich die Kommunikation zu anderen 
USB devices herstellen kann. Fuer die funktioniert zwar auch der 
generische Kernel-Treiber; aber zum Lernen taugt es auch. Z.B. ein 
memory stick, ein ADC Wandler, meine Maus.

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:
> versagen auch in der Kommunikation.

Das würde mir zu denken geben und ich würde die Original Win Software, 
notfalls mit einem Test Win in VitualBox ausprobieren.

Ich habe mal etwas geentet (nicht gegooglet ;) ) und bin dabei auf die 
Seite gestossen:
http://musicdiver.com/wordpress/2013/02/stolzer-os...

Durch die baugleichen Oszis lässt sich dann die Suche erweitern und es 
findet sich sogar der 200MHz Hack unter Linux:
https://randomprojects.org/wiki/Voltcraft_DSO-3062C

Von Problemen mit der Kommunikation habe ich eigentlich nichts gefunden.

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gehst du direkt an USB am PC oder über HUB?

Autor: Christoph R. (cherub)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe direkt per Kabel vom Host-PC an das DSO.

Die Seite auf musicdiver habe ich mir auch angeguckt; die andere kannte 
ich noch nicht. Vom source code her mache ich eigentlich genau das 
gleiche; testen kann ich erst heute abend.

Was mir im Gegensatz z.B. zur Protokoll Dokumentation auf 
https://www.mikrocontroller.net/articles/Hantek_Protokoll auffaellt ist, 
dass es auf DSO/Firmware Seite ein anderer Treiber verwendet wird -- der 
dort bereits erwaehnte "gadget Treiber". Wenn ich heute abend wieder am 
Rechner bin, kann ich mal die entsprechenden Daten posten.

So langsam frage ich mich halt, ob es nicht irgendeinen bug gibt.

VirtualBox habe ich nicht auf dem Rechner, erscheint mir auch etwas 
overkill. Immerhin besitze ich noch Windows-Lizenzen mit den ich das 
probieren koennte. Ueber wine hat es zumindest nicht geklappt; aber ich 
weiss nicht ob oder wie die Peripherie virtualisiert wird, in dem Fall 
USB.

Ich habe eine firmware Version als source code, sowie ein passendes 
update auf voltcraft.info gefunden. Siehe 
http://voltcraftdownload.info/Default.aspx?modelno=DSO-1062D

Ueber die Quelle habe ich nichts in Erfahrung bringen koennen. Die 
Firmware ist weder signiert, noch gibt es eine checksum. Kann man der 
Quelle trauen?

Autor: Christoph R. (cherub)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich komme immer noch nicht wirklich weiter. Eine weitere Seltsamkeit 
ist, dass sich das Teil einerseits als usb-Device anmeldet/gemeldet wird 
und als Netzwerk-Device anmeldet [als s3c-hsudc Gadget Serial 2.4].

Ich habe versucht mir die Kommunikation per wireshark anzugucken; so 
richtig schlau werde ich daraus bislang nicht. Eigentlich wollte ich mir 
auch garnicht den Netzwerk-traffic damit angucken, sondern die USB 
Kommunikation.

Sobald ich allerdings pyusb zum Direktzugriff auf das DSO benutze, muss 
ich ja das Kernelmodul entkoppeln -- womit das network device nicht mehr 
existiert und ich mich nicht mehr per wireshark an die Kommunikation 
haengen kann. Ich lese noch...

Was ich auch nicht verstehe sind die vorhandenen/nicht vorhandenen 
Antworten. Ich kann z.B.an den IN Endpoint schicken:
 device.write(0x02, [0x53, 0x01, 0x00, 0x00, 0x54])
(laut Protokoll ein einfaches Echo)
Dann kann ich auf dem falschen Endpoint lesen:
print("Read: " + str(device.read(0x02, 64)))
Und ich erhalte eine Antwort:
Read: array('B', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Auf dem richtigen Kanal (
device.read(0x81, 64)
) gibt's nur timeouts:
     raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 110] Operation timed out

(siehe oben)

Autor: Jim Meba (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:
> print("Read: " + str(device.read(0x02, 64)))

Das hätte eine dicke Fehlermeldung geben müssen, denn der 0x02 kann nur 
für PC->Device benutzt werden.

In die andere Richtung hieße er 0x82, denn das oberste Bit entscheidet 
ob IN oder OUT.

Ich denke das PyUSB da einen Fehler nicht korrekt behandelt und Dir Müll 
zurück gibt.

Übrigens hat device.read() auch noch einen Timeout Parameter. Setz den 
mal auf was dickes wie 10000.

Autor: Christoph R. (cherub)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jim,

wie kommst Du darauf, dass die Kommunikation nicht ueber die 
Endpoint-Adresse 0x02 laufen kann? Aus der Device Beschreibung laut 
lsusb, als auch ueber die direkte Kommunikation ueber USB Kabel bekomme 
ich die Info:
  Endpoint Descriptor: [...]
        bEndpointAddress     0x02  EP 2 OUT
         [...]
      Endpoint Descriptor:[...]
        bEndpointAddress     0x81  EP 1 IN [...]

Wie gesagt, vielleicht fehlt mir (immer noch) das notwendige Wissen.

Fuer mich war's es bislang: DSO per USB an den Rechner haengen, 
Kommunikation per pyusb starten. Die Initialisierung laeuft auch 
ziemlich exakt so ab, wie im Beispielcode/update script auf Seite 
https://randomprojects.org/wiki/Voltcraft_DSO-3062... 
beschrieben.

Autor: Christoph R. (cherub)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, jetzt vertraue ich einfach mal, dass ich meinen Teil der 
Kommunikation richtig mache.

Kann jemand bestaetigen oder bestreiten, dass das Hantek-Protokoll auch 
fuer das DSO1062D funktioniert?

Falls es nicht funktioniert, wie kaeme ich da ran? Hat jemand einen 
Windows-Rechner und weiss, wie man die USB-Kommunikation mitschneiden 
kann?


Danke & Gruesse

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.