Hantek Protokoll
For an English version of this article check http://elinux.org/Das_Oszi_Protocol
Die DSOs der Hantek Serie DSO5xxxB (DSO5202B/BM/BMV, DSO5102B/BM/BMV, DSO5062B/BM/BMV, auch Tekway DST1202B, DST1102B, DST1062B, Protek 3210, 3110, Voltcraft DSO-3062C oder Hantek Handhelds DSO1202B/BV, DSO1102B/BV, DSO1062B/BV) haben eine USB-Schnittstelle zur Kommunikation mit einem PC. Hantek verwenden dabei ein proprietäres USB-Protokoll (bDeviceClass = 255, Vendor Specific Class). Diese Seite dokumentiert das Protokoll, soweit bekannt.
Das ist nötig, denn seit Jahren verspricht Hantek ein Windows-SDK, liefert aber nicht und die mitgelieferte Windows-Software TTScope ist ein Witz. Für Linux sollte man von Hantek absolut gar nichts erwarten. Hantek hat nie für ihre Produkte ein Linux-SDK bereitgestellt. Obwohl zum Beispiel die DSOs Linux als Betriebssystem verwenden[1].
Einleitung
Die USB- und Protokoll-Implementierung sind ziemlich vermurkst. DSOs sind alleine über die USB VID:PID 049f:505a[2] und die Bus- und Deviceadresse auf dem USB-Bus identifizierbar. Beim Betrieb mehrerer DSO5xxxBs an einem PC kann man diese nicht über ihre Seriennummer unterscheiden, da Hantek die nicht im USB-Descriptor angibt (iSerial ist 0).
Die Quelle des Unheils ist das von MIZI Research geschriebene Samsung S3C2410 SMDK. Es enthält den USB Char-Treiber (usb-char.c, Linux 2.4.18), den Hantek daraus übernommen hat und der die VID:PID 049f:505a benutzt. Das DSO basiert zwar auf einem neueren Kernel (2.6.13), doch wurde der Treiber vom Vorgängermodell Tekway DST1000 (nicht B!) übernommen.
Anscheinend wird bei den DSO5xxxBM/BMV-Modellen (Linux 2.6.30.4) ein anderer "serial gadget" Treiber benutzt. Ob dies eine Verbesserung ist, ist z.Zt. nicht bekannt.
Ein weiterer Effekt dieses Treibers ist, dass sich das DSO beim Booten kurz mit einer anderen VID:PID am Bus meldet. Der Bootloader (vivi) benutzt einen SoC Monitor, wie im Samsung S3C2440 SMDK (u2440mon), der sich beim Booten mit eigener VID:PID auf der USB-Schnittstelle meldet und wieder verabschiedet. Dies mag zwar sehr nützlich sein für Hacks, Backup o.Ä., allerdings verursacht die VID:PID-Änderung hin und wieder BSOD beim Win64 PCs.
Das Protokoll verwendet USB Bulk-Transfers, Bulk-Out Endpunkt 0x01, Bulk-In Endpunkt 0x82, maximal 64 Bytes pro USB Bulk-Paket.
Über den USB Bulk-Paketen liegt direkt Hanteks DSO-Protokoll. Es ist Anfrage/Antwort orientiert. Das heißt, der USB Host (PC) sendet eine Anfrage und erhält eine oder mehrere Antworten. Das Protokoll kann daher synchron, in einem einzigen Thread, implementiert werden, obwohl Hantek angeblich in TTScope separate Sende- und Empfangsthreads verwendet. Meldungen des Hantek DSO-Protokolls können länger als 64 Bytes sein. Sie werden entsprechend auf mehrere Bulk-Pakete aufgeteilt[3].
Grundsätzlicher Aufbau
Meldungen von und zu den DSOs sind wie folgt aufgebaut. Der Grundaufbau ist immer gleich, je nach Meldung können ein paar Teile fehlen:
Markierung 0x43 oder 0x53 |
Länge | Kommando | Datenbytes | Prüfsumme | |||
LSB | MSB | ||||||
Markierung 0x43 oder 0x53 |
Länge | Kommando | Subkommando | Datenbytes | Prüfsumme | ||
LSB | MSB | ||||||
Markierung 0x43 oder 0x53 |
Länge | Kommando | Subkommando | Prüfsumme | |||
LSB | MSB | ||||||
Markierung 0x43 oder 0x53 |
Länge | Kommando | Prüfsumme | ||||
LSB | MSB |
Das Meldungsformat ist identisch für Anfragen und Antworten. Jede Meldung beginnt mit einem Markierungsbyte. Es gibt zwei unterschiedliche Markierungen:
- 0x53
- Normale Meldung
- 0x43
- Debugging Meldung
Dem Markierungsbyte folgen zwei Bytes mit einer Längenangabe, LSB zuerst. Das Längenwort enthält die Gesamtlänge minus 3. D.h. es gibt die Restlänge der Meldung nach dem Längenwort an, also ausschließlich der Markierung und des Längenworts, aber einschließlich der Prüfsumme.
Dem Längenwort folgt das Kommando-Byte. Es bezeichnet das gewünschte Kommando, siehe 0x53 Normale Meldungen. Ein gesetztes höchstes, siebtes Bit bedeutet, es handelt sich um eine Antwort. Somit gibt es in Richtung PC --> DSO nur Kommando-Bytes mit Werten kleiner 0x80und in Richtung DSO --> PC nur Kommando-Bytes wimt Werten größer-gleich 0x80.
Dem Kommando-Byte folgen kommando-spezifische Datenbytes. Manche Kommandos verwenden das erste Datenbyte als ein Unterkommando-Byte. Die Anzahl der Datenbytes kann Null sein.
Den Datenbytes, sofern vorhanden, folgt eine primitive Prüfsumme. Es ist die dümmster Art eine Prüfsumme zu berechnen. Es werden alle Bytes der Meldung aufsummiert und das LSB der Summe als Prüfsumme verwendet.
0x53 Normale Meldungen
Die meisten 0x53 Meldungen werden von der PC Software TTScope benutzt. Allerdings ist nicht immer klar wie und warum und ob TTScope sie richtig verwendet.
0x00 Echo
Alle Datenbytes in der Anfrage werden einfach unverändert zurückgesendet.
0x01 DSO Einstellungen lesen
Die Anfrage:
0x53 | 0x02 | 0x00 | 0x01 | 0x56 |
Man erhält einen langen Datensatz, in dem die aktuellen Einstellungen (SYSData) des DSO binär-kodiert sind.
0x53 | Länge | 0x81 | SYSData | Prüfsumme | ||
LSB | MSB |
Die detaillierten Informationen zur SYSData findet man hier http://www.mikrocontroller.net/articles/Datei:SysDATA_v1.0.zip
Um sicherstellen, dass man den SYSData Datensatz richtig dekodiert, ist es empfehlenswert die /protocol.inf des jeweiligen DSOs direkt nach dem Verbindungsaufbau einzulesen (siehe Datei_lesen).
Sollte die protocol.inf auf dem DSO nicht lesbar/vorhanden ist die Antwort leer. D.h. sie enthält kein Datenbyte:
0x53 | 0x02 | 0x00 | 0x81 | 0xD6 |
Durch unterschiedliche Kombinationen aus Software-Updates und ursprünglicher Software-Version kann es auch passieren, dass die protocol.inf falsch ist. Eventuell bietet es sich daher an, in einer Steuersoftware auf die protocol.inf zu verzichten.
0x02 Sample-Daten lesen
Die Sample-Daten können nur von beiden Kanälen (ch1 und/oder ch2) abgerufen werden. Die REF, MATH, FFT Daten können nicht abgerufen werden. Das wird wohl einer der Gründe sein, warum die PC Software TTScope, je nach Glück und aktuelle Einstellungen, bei "PowerSpectrum" oder "WaveTabulator" nur Unsinn statt echten FFT Daten zeigt.
Die Anfrage:
0x53 | 0x04 | 0x00 | 0x02 | 0x01 | 0x00 für CH1 oder 0x01 für CH2 | Prüfsumme |
Das DSO antwortet mit mindestens drei und maximal 202 Paketen, wobei das erste Paket (mit Subkommando 0) die gesamte zu erwartende Länge der Sample-Daten beschreibt, das zweite Paket (mit Subkommando 1) beinhaltet eine Kanalnummer und die Sample-Daten selber. Sollten die Sample-Daten länger als 10000 Bytes sein, werden ein oder mehrere weitere Pakete (mit Subkommando 1) gesendet, solange bis die gesamten Sample-Daten gesendet sind. Zum Abschluss wird noch ein Paket gesendet (mit Subkommando 2). Es markiert das Ende der Übertragung.
Hier ein Beispiel für sehr wenige Daten (600 Byte Sample-Daten) vom DSO5xxxB (DSO-Einstellungen: 4ns/DIV, 4kpoint):
0x53 | 0x06 | 0x00 | 0x82 | 0x00 | Sample-Daten Länge (3 Byte) | Prüfsumme |
0x53 | 0x5c | 0x02 | 0x82 | 0x01 | CHn + 0x..0x.. (600 Byte Sample-Daten) | Prüfsumme |
0x53 | 0x04 | 0x00 | 0x82 | 0x02 | CHn (0x00 für CH1 oder 0x01 für CH2) | Prüfsumme |
Hier ein Beispiel für sehr viele Daten (150 Pakete mit je 10000 Bytes Sample-Daten) vom DSO1202BV mit 2Mpoint (DSO-Einstellungen: 2ms/DIV, 2Mpoint):
0x53 | 0x06 | 0x00 | 0x82 | 0x00 | Sample-Daten Länge (3 Byte) | Prüfsumme |
0x53 | 0x14 | 0x27 | 0x82 | 0x01 | CHn + 0x..0x.. (10000 Byte Sample-Daten) | Prüfsumme |
148 weitere Pakete mit Subkommando 1 und CHn + Sample-Daten | ||||||
0x53 | 0x14 | 0x27 | 0x82 | 0x01 | CHn + 0x..0x.. (10000 Byte Sample-Daten) | Prüfsumme |
0x53 | 0x04 | 0x00 | 0x82 | 0x02 | CHn (0x00 für CH1 oder 0x01 für CH2) | Prüfsumme |
Sollte bei der Übertragung ein Fehler auftreten, wird ein spezielles Paket versendet, damit der PC nicht unnötig auf die Daten wartet, Subkommando 0x03.
Sollten keine Sample-Daten vorhanden sein (DSO im STOP-Modus) wird ebenfalls ein Fehler mit dem Subkommando 0x03 gemeldet.
0x53 | 0x04 | 0x00 | 0x82 | 0x03 | CHn (0x00 für CH1 oder 0x01 für CH2) | Prüfsumme |
Da die Sample-Daten keine Informationen über die aktuelle DSO-Einstellung (Kanäle, Volt/DIV) und Zeitbasis) beinhalten, muss eine bestimmte Reihenfolge eingehalten werden, um die Sample-Daten zu verstehen und Datenkonsistenz zu gewährleisten:
0x53 Kommando | Funktion |
---|---|
0x12 | Bedienfeld sperren |
0x01 | DSO Einstellungen lesen |
0x12 | Bedienfeld entsperren |
0x02 | Sample-Daten lesen |
0x00 oder 0x01 | als "idle" und parallel die Daten auf dem PC verarbeiten/benutzen |
Sollten beide Kanäle eingelesen werden, kann dies direkt nacheinander erfolgen:
0x53 Kommando | Funktion |
---|---|
0x12 | Bedienfeld sperren |
0x01 | DSO Einstellungen lesen |
0x12 | Bedienfeld entsperren |
0x02 | CH1 Sample-Daten lesen |
0x02 | CH2 Sample-Daten lesen |
0x00 oder 0x01 | als "idle" und parallel die Daten auf dem PC verarbeiten/benutzen |
Ursprünglich (bei dem Tekway DST1000 [4] DSOs mit 2.5kpoint Speicher) war vorgesehen das Bedienfeld auch während der Datenübertragung zu sperren. Dies ist bei den aktuellen DSOs nicht empfehlenswert, da die Datenmengen deutlich höher sind (und dadurch die Übertragungszeit) als bei den ersten Tekway DSOs.
Die Sample-Daten sind vorverarbeitete Daten aus dem Bildspeicher, die Werte beziehen sich auf 10DIV Vertikal (-127 bis +127) und 20DIV Horizontal.
Falls die Window-Timebase kleiner ist als die Main-Timebase wird nur ein sichtbaren Teil der Daten übertragen, siehe [1]
0x10 Datei lesen
Diese Funktion kann zwar benutzt werden um eine beliebige Datei auf dem DSO zu lesen, ist aber Primär dazu gedacht um die protokol.inf (siehe DSO_Einstellungen_lesen) und keyprotocol.inf (siehe Tastendruck_auslösen) von dem DSO zu lesen.
Die Anfrage enthält den vollständigen Dateipfad.
0x53 | Länge | 0x10 | 0x00 | Dateipfad | Prüfsumme | ||
LSB | MSB |
Die Antwort verwendet zwei Unterkommando-Bytes
0x01: Daten 0x02: Prüfsumme über alle Daten
Da eine Antwort nur knapp 64KB enthalten kann, werden eventuell mehrere Antworten mit dem Unterkommando-Byte 0x01 gesendet. Ein Unterkommando-Byte 0x02 markiert das Ende der Dateiübertragung und enthält gleichzeitig eine Prüfsumme über alle Bytes der Datei.
0x53 | Länge | 0x90 | 0x01 | Dateiinhalt | Prüfsumme | |
LSB | MSB | |||||
... | ||||||
0x53 | 0x04 | 0x00 | 0x90 | 0x02 | Dateiprüfsumme (1 Byte) | Prüfsumme |
0x11 DSO Einstellungen schreiben
Um die DSO-Einstellungen per Remotezugriff zu verändern muss ein spezieller Datensatz mit den binärkodierten Einstellungen gesendet werden.
0x53 | Länge | 0x11 | SYSData | Prüfsumme | ||
LSB | MSB |
Die Beschreibung von SYSData siehe 0x01 DSO Einstellungen lesen
Die Antwort beinhaltet eine Statusmeldung
ST = 0 - DSO Einstellung änderung erfolgreich ST = XX - Ein Fehler "XX" ist aufgetreten
0x53 | 0x03 | 0x00 | 0x91 | 0x.. ST | Prüfsumme |
0x12 DSO Start/Stop - Bedienfeld sperren/freischalten
Erlaubt es, das DSO-Bedienfeld zu sperren oder zu entsperren und die DSO Akquisition starten/stoppen.
DSO Akquisition stoppen
0x53 | 0x04 | 0x00 | 0x12 | 0x00 | 0x01 | Prüfsumme 0x6A |
DSO Akquisition starten
0x53 | 0x04 | 0x00 | 0x12 | 0x00 | 0x00 | Prüfsumme 0x69 |
In der Antwort enthält man jeweils die gesendeten Datenbytes zurück:
0x53 | 0x04 | 0x00 | 0x92 | 0x00 | 0x01 oder 0x00 | Prüfsumme |
Soweit bekannt verursacht die "DSO Akquisition start/stop" Funktion genau die selber (interne) Aktion wie die Start/Stop Taste auf dem Bedienfeld. Allerdings scheint diese Funkton Fehler zu haben.
Bedienfeld sperren
0x53 | 0x04 | 0x00 | 0x12 | 0x01 | 0x01 | Prüfsumme 0x6B |
Bedienfeld entsperren
0x53 | 0x04 | 0x00 | 0x12 | 0x01 | 0x00 | Prüfsumme 0x6A |
Ist dass Bedienfeld gesperrt, erscheint ein roter Schlüssel in der oberen Statusleiste auf dem DSO-Bildschirm und die Bedienelemente haben keine Funktion mehr.
In der Antwort enthält man jeweils die gesendeten Datenbytes zurück:
0x53 | 0x04 | 0x00 | 0x92 | 0x01 | 0x01 oder 0x00 | Prüfsumme |
0x13 Tastendruck auslösen
Erlaubt es das Drücken fast aller DSO-Tasten zu simulieren. Die gewünschte Taste wird durch jeweils zwei Datenbytes ausgewählt:
0x53 | 0x04 | 0x00 | 0x13 | 0x.. | 0x.. | Prüfsumme |
Das erste Byte ist der eigentliche Tastencode, das zweite Byte die Anzahl der zu simulierenden Tastendrücke der Taste (Aussage Hantek). Anscheinend wird unabhängig von der Anzahl der angegebenen Tastendrücke dennoch nur einmal gedrückt. Es ergibt also wenig Sinn eine andere Anzahl als 0x01 zu senden.
Für die Hantek DSO5xxxB/BM/BMV, Tekway DST1xxxB und Voltcraft DSO-3062C DSOs gelten folgende Tastencodes:
0x00 0x01 - F0 Taste 0x01 0x01 - F1 Taste 0x02 0x01 - F2 Taste 0x03 0x01 - F3 Taste 0x04 0x01 - F4 Taste 0x05 0x01 - F5 Taste 0x06 0x01 - F6 Taste 0x07 0x01 - F7 Taste 0x08 0x01 - V0 links drehen 0x09 0x01 - V0 rechts drehen 0x0A 0x01 - V0 drücken 0x0B 0x01 - Save/Recall Taste 0x0C 0x01 - Measure Taste 0x0D 0x01 - Acquire Taste 0x0E 0x01 - Utility Taste 0x0F 0x01 - Cursor Taste 0x10 0x01 - Display Taste 0x11 0x01 - Autoset Taste 0x12 0x01 - Single Seq Taste 0x13 0x01 - Run/Stop Taste 0x14 0x01 - Help Taste 0x15 0x01 - Default Setup Taste 0x16 0x01 - Save to USB Taste 0x17 0x01 - Math Menu Taste 0x18 0x01 - CH1 Menu Taste 0x19 0x01 - CH1 Position links drehen 0x1A 0x01 - CH1 Position rechts drehen 0x1B 0x01 - CH1 Position drücken 0x1C 0x01 - CH1 Volts/Div links drehen 0x1D 0x01 - Ch1 Volts/Div rechts drehen 0x1E 0x01 - CH2 Menu Taste 0x1F 0x01 - CH2 Position links drehen 0x20 0x01 - CH2 Position rechts drehen 0x21 0x01 - CH2 Position drücken 0x22 0x01 - CH2 Volts/Div links drehen 0x23 0x01 - Ch2 Volts/Div rechts drehen 0x24 0x01 - Horz Menu Taste 0x25 0x01 - Horizontal Position rechts drehen 0x26 0x01 - Horizontal Position links drehen 0x27 0x01 - Horizontal Position drücken 0x28 0x01 - Horizontal Sec/Div links drehen 0x29 0x01 - Horizontal Sec/Div rechts drehen 0x2A 0x01 - Trig Menu Taste 0x2B 0x01 - Trigger Level links drehen 0x2C 0x01 - Trigger Level rechts drehen 0x2D 0x01 - Trigger Level drücken 0x2E 0x01 - Set to 50% Taste 0x2F 0x01 - Force Trig Taste 0x30 0x01 - Probe Check Taste
Für die Hantek Handheld DSO1xxxB/BV DSOs gelten folgende Tastencodes:
0x00 0x01 - Fx NULL Taste 0x01 0x01 - Menu An/Aus 0x02 0x01 - F1 Taste 0x03 0x01 - F2 Taste 0x04 0x01 - F3 Taste 0x05 0x01 - F4 Taste 0x06 0x01 - F5 Taste 0x07 0x01 - DMM V 0x08 0x01 - DMM A 0x09 0x01 - DMM Ohm 0x0A 0x01 - DMM Diode 0x0B 0x01 - DMM Durchgangsprüfer 0x0C 0x01 - DMM Kapazität 0x0D 0x01 - DMM/DSO umschaltung 0x0E 0x01 - Save/Recall Taste 0x0F 0x01 - Measure Taste 0x10 0x01 - Utility Taste 0x11 0x01 - Cursor Taste 0x12 0x01 - CH1 Menu Taste 0x13 0x01 - Math Menu Taste 0x14 0x01 - CH2 Menu Taste 0x15 0x01 - Default Setup Taste 0x16 0x01 - Save to USB Taste 0x17 0x01 - Math Menu Taste 0x18 0x01 - CH1 Volts/Div + 0x19 0x01 - CH1 Volts/Div - 0x1A 0x01 - CH1 Position + 0x1B 0x01 - CH1 Position - 0x1C 0x01 - CH2 Position + 0x1D 0x01 - CH2 Position - 0x1E 0x01 - CH2 Volts/Div + 0x1F 0x01 - CH2 Volts/Div - 0x20 0x01 - Horizontal Sec/Div - 0x21 0x01 - Horizontal Sec/Div + 0x22 0x01 - Horizontal Position + 0x23 0x01 - Horizontal Position - 0x24 0x01 - Trigger Level + 0x25 0x01 - Trigger Level - 0x26 0x01 - Run/Stop Taste 0x27 0x01 - Autoset Taste 0x28 0x01 - Multifunktion Zero 0x29 0x01 - Multifunktion nach oben 0x2A 0x01 - Multifunktion nach unten 0x2B 0x01 - Multifunktion nach links 0x2C 0x01 - Multifunktion nach rechts
Um die richtige Zuordnung Taste - Tastencode zu erhalten, kann man vom jeweiligen DSO die Datei /keyprotocol.inf lesen. So sie den exisitiert und die richtigen Informationen für das jeweilige DSO-Modell enthält (siehe Datei lesen)
Die Datei keyprotocol.inf ist wie folgt aufgebaut:
- In der erster Zeile steht die Anzahl aller Keycodes
- Die zweite Zeile markiert den Anfang der Liste
- In den nächsten Zeilen folgen die Tastenkommandos (Namen und Anzahl der Bytes des jeweiligen Tastencodes, nicht etwa der Tastencode selber, das würde ja Sinn ergeben ...)
- Die letzte Zeile markiert das Ende der Liste.
- Die jeweilige Zeilennummer minus 1 nach der [START]-Marke entspricht dem Tastenkode
Hier die keyprotocol.inf von einem Hantek DSO5202B
[TOTAL] 49 [START] [FN-0-KEY] 1 [FN-1-KEY] 1 [FN-2-KEY] 1 [FN-3-KEY] 1 [FN-4-KEY] 1 [FN-5-KEY] 1 [FN-6-KEY] 1 [FN-7-KEY] 1 [FN-MLEFT-KEY] 1 [FN-MRIGHT-KEY] 1 [FN-MZERO-KEY] 1 [MENU-SR-KEY] 1 [MENU-MEASURE-KEY] 1 [MENU-ACQUIRE-KEY] 1 [MENU-UTILITY-KEY] 1 [MENU-CURSOR-KEY] 1 [MENU-DISPLAY-KEY] 1 [CT-AUTOSET-KEY] 1 [CT-SINGLESEQ-KEY] 1 [CT-RS-KEY] 1 [CT-HELP-KEY] 1 [CT-DS-KEY] 1 [CT-STU-KEY] 1 [VT-MATH-MENU-KEY] 1 [VT-CH1-MENU-KEY] 1 [VT-CH1-PSUB-KEY] 1 [VT-CH1-PADD-KEY] 1 [VT-CH1-PZERO-KEY] 1 [VT-CH1-VBSUB-KEY] 1 [VT-CH1-VBADD-KEY] 1 [VT-CH2-MENU-KEY] 1 [VT-CH2-PSUB-KEY] 1 [VT-CH2-PADD-KEY] 1 [VT-CH2-PZERO-KEY] 1 [VT-CH2-VBSUB-KEY] 1 [VT-CH2-VBADD-KEY] 1 [HZ-MENU-KEY] 1 [HZ-PSUB-KEY] 1 [HZ-PADD-KEY] 1 [HZ-PZERO-KEY] 1 [HZ-TBSUB-KEY] 1 [HZ-TBADD-KEY] 1 [TG-MENU-KEY] 1 [TG-PSUB-KEY] 1 [TG-PADD-KEY] 1 [TG-PZERO-KEY] 1 [TG-PHALF-KEY] 1 [TG-FORCE-KEY] 1 [TG-PROBECHECK-KEY] 1 [END]
Die Antwort zu einem Tastenkommando enthält ein Datenbyte, welches das selektierte Menü bezeichnet (Menü-ID), bevor der Tastendruck simuliert wurde. Das Menü muss nicht notwendigerweise angezeigt sein. Auch wenn es ausgeblendet ist, enthält die Antwort ein entsprechendes Datenbyte. Das jenes Menüs, welches angezeigt worden wäre, wenn es nicht ausgeblendet wäre.
0x53 | 0x03 | 0x00 | 0x93 | 0x.. | Prüfsumme |
Siehe Hantek Protokoll/Menü-IDs für eine Liste der Menü-IDs.
0x14 Systemzeit setzen
Erlaubt es Datum und Zeit des DSOs zu setzen.
0x53 | 0x09 | 0x00 | 0x14 | Datenbytes (YYMDHMS) | Prüfsumme |
Die Anfrage enthält sieben Datenbytes:
Byte 0: Jahr (LSB) \_ Nicht kleiner als 2009 Byte 1: Jahr (MSB) / Byte 2: Monat (1 ... 12) Byte 3: Tag (1 ... 31) Byte 4: Stunde (0 ... 23) Byte 5: Minute (0 ... 59) Byte 6: Sekunde (0 ... 59)
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x53 | 0x02 | 0x00 | 0x94 | Prüfsumme |
0x20 Bildschirm-Snapshot
Nach dem Empfangen des Befehls für einen Bildschirm-Snapshot, sendet das DSO die reinen Bilddaten ohne Angabe von Größe oder Farbpalette. Es werden in mehreren Meldungen insgesamt 384.000 Bytes Bilddaten übertragen, das entspricht 800 x 480 Pixel.
Vom PC sendet man ein Anfrage-Kommando ohne Datenbytes:
0x53 | 0x02 | 0x00 | 0x20 | 0x75 |
Das DSO antwortet mit 37 Paketen zu je 10.208 Bytes Bilddaten, Subkommando 0x01. Die 38. Antwort ist etwas kürzer, das DSO antwortet mit einem Paket zu 6.304 Bytes Bilddaten. Den Daten folgt zum Abschluss eine Antwort mit einer primitiven Prüfsumme über alle Daten, Subkommando 0x02:
0x53 | 0xE3 | 0x27 | 0xA0 | 0x01 | 0x.. 0x.. 0x.. .. .. .. (10208 Bytes) | Prüfsumme |
... | ||||||
0x53 | 0xA3 | 0x18 | 0xA0 | 0x01 | 0x.. 0x.. 0x.. .. .. .. (6304 Bytes) | Prüfsumme |
0x53 | 0x04 | 0x00 | 0xA0 | 0x02 | Datenprüfsumme (1 Byte) | Prüfsumme |
Manchmal werden Pakete in zwei Teilen gesendet[5], die Längenangabe am Anfang im Paket wird nicht angepasst, ist also falsch.
Die empfangenen Bilddaten kann man direkt in das Format einer Windows-Bitmap mit 256 Farben übernehmen. Es wird die unterste Zeile zuerst gesendet, das Bild ist vertikal gespiegelt, steht also am Kopf. Die Farbpalette wird nicht übertragen, vielleicht gibt es ein Kommando dafür? Die Farbpalette ist in den Programmen 'dso.exe' am DSO und TTScope am PC einkompiliert und hat eine Länge von 1.024 Bytes.
Start der Daten im RGBA-Format (Hex-Darstellung):
00 00 00 00 33 00 00 00 66 00 00 00 99 00 00 00 CC 00 00 00 FF 00 00 00 00 33 00 00 33 33 00 00 66 33 00 00 99 33 00 00 CC 33 00 00 FF 33 00 00 00 66 00 00 33 66 00 00 66 66 00 00 99 66 00 00 CC 66 00 00 FF 66 00 00 00 99 00 00 33 99 00 00 66 99 00 00 99 99 00 00 .. .. .. ..
Bei dem Hantek Handheld DSO1202B/BV, DSO1102B/BV und DSO1062B/BV hat das verwendete Display eine Auflösung von 640x480pix. Dadurch ergibt sich etwas anderen Datenmenge bei dem Bildschrim-Snapshot. Es werden in mehreren Meldungen insgesamt 307.200 Bytes Bilddaten übertragen, das entspricht 640 x 480 Pixel.
Vom PC sendet man ein Anfrage-Kommando ohne Datenbytes:
0x53 | 0x02 | 0x00 | 0x20 | 0x75 |
Das DSO antwortet mit 30 Paketen zu je 10.208 Bytes Bilddaten, Subkommando 0x01. Die 31. Antwort ist etwas kürzer, das DSO antwortet mit einem Paket von 960 Bytes Bilddaten. Den Daten folgt zum Abschluss eine Antwort mit einer primitiven Prüfsumme über alle Daten, Subkommando 0x02:
0x53 | 0xE3 | 0x27 | 0xA0 | 0x01 | 0x.. 0x.. 0x.. .. .. .. (10208 Bytes) | Prüfsumme |
... | ||||||
0x53 | 0xA3 | 0x18 | 0xA0 | 0x01 | 0x.. 0x.. 0x.. .. .. .. (960 Bytes) | Prüfsumme |
0x53 | 0x04 | 0x00 | 0xA0 | 0x02 | Datenprüfsumme (1 Byte) | Prüfsumme |
Mittlerweile (Stand Aug. 2013, geprüft mit DSO5072P) hat Hantek sowohl den Samsung SoC (vom S3C2440 auf S3C2416) als auch Linux Kernel Version (vom 2.6.xx auf 3.2.xx) upgedatet. Obowhl das Display selber immer noch die 800x480 Auflösung besitzt, versendet die neueste Hardware doppelt so viel Bildschirm-Snapshot Daten. Es werden in mehreren Meldungen insgesamt 768.000 Bytes Bilddaten übertragen. Die einzelnen Pixel der Bildschirmdaten sind mit 16 Bit als RGB 5:6:5 kodiert, eine Farbpalette wird nicht mehr verwendet.
Vom PC sendet man ein Anfrage-Kommando ohne Datenbytes:
0x53 | 0x02 | 0x00 | 0x20 | 0x75 |
Das DSO antwortet mit 75 Paketen zu je 10.208 Bytes Bilddaten, Subkommando 0x01. Die 76. Antwort ist etwas kürzer, das DSO antwortet mit einem Paket von 2400 Bytes Bilddaten. Den Daten folgt zum Abschluss eine Antwort mit einer primitiven Prüfsumme über alle Daten, Subkommando 0x02:
0x53 | 0xE3 | 0x27 | 0xA0 | 0x01 | 0x.. 0x.. 0x.. .. .. .. (10208 Bytes) | Prüfsumme |
... | ||||||
0x53 | 0x63 | 0x09 | 0xA0 | 0x01 | 0x.. 0x.. 0x.. .. .. .. (2400 Bytes) | Prüfsumme |
0x53 | 0x04 | 0x00 | 0xA0 | 0x02 | Datenprüfsumme (1 Byte) | Prüfsumme |
0x21 Systemzeit lesen
Erlaubt es die Systemzeit zu lesen.
Vom PC sendet man ein Anfrage-Kommando ohne Datenbytes:
0x53 | 0x02 | 0x00 | 0x21 | 0x76 |
Die Antwort enthält sieben Datenbytes,
0x53 | 0x09 | 0x00 | 0xA1 | Datenbytes (YYMDHMS) | Prüfsumme |
Die Datenbytes:
Byte 0: Jahr (LSB) Byte 1: Jahr (MSB) Byte 2: Monat (1 ... 12) Byte 3: Tag (1 ... 31) Byte 4: Stunde (0 ... 23) Byte 5: Minute (0 ... 59) Byte 6: Sekunde (0 ... 59)
.
0x43 Debugging Meldungen
Die 0x43 Meldungen werden nicht von der PC Software benutzt, jedoch bieten die einige interessante Funktionen. Eventuell wird Hantek ein paar Fragen zu den 0x43 Meldungen beantworten.
0x00 FPGA Register lesen
Ermöglicht einzelnes oder mehrere FPGA Register zu lesen
Die Abfrage für einzelnes Register
0x43 | 0x04 | 0x00 | 0x00 | 0x00 | 0x00 bis 0xFF (Register Nummer) | Prüfsumme |
Die Antwort dazu beinhaltet 4 Byte Register Daten
0x43 | 0x06 | 0x00 | 0x80 | 0x.. 0x.. 0x.. 0x.. (Register Daten) | Prüfsumme |
Die Abfrage für mehrere Register beinhaltet der Start Register und die Anzahl der zu abfragenden Register. Dabei darf der letzte Register (Start Register + Anzahl der Register) nicht höher sein als 0x4F
0x43 | 0x05 | 0x00 | 0x00 | 0x01 | 0x.. (Start Register) | 0x.. (Anzahl der Register) | Prüfsumme |
Die Antwort dazu beinhaltet die Register Daten, jeweils 4 Byte per Register.
0x43 | Länge | 0x80 | X * 0x.. 0x.. 0x.. 0x.. (Register Daten) | Prüfsumme | ||
LSB | MSB |
Intern wird die Firmware Funktion "PcUartReadFpgaReg" aufgerufen. Die mögliche Verwendung muß noch erörtert werden
Bitte beachten - der Syntax ist temporär, evt. auch falsch.
0x01 FPGA FIFO Inhalt auslesen
Erlaubt direktes auslesen des FIFO Speichers. Die Abfrage beinhaltet die Buffergröße in Bytes
0x43 | 0x08 | 0x00 | 0x01 | 0x.. 0x.. (Buffer größe) | Prüfsumme |
Die Antwort beinhaltet die FIFO Daten
0x43 | Länge | 0x81 | FIFO Daten | Prüfsumme | ||
LSB | MSB |
Bitte beachten - der Syntax ist temporär, evt. auch falsch.
0x02 DSO Firmware Variablen auslesen
Die Anfrage ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0x02 | 0x47 |
Die Antwort beinhaltet die DSO Firmware Variablen, ausgelesen aus dem DSO Speicher. Die sind auf dem DSO in der Datei /param/sav/run1kb_yymmdd gespeichert (Aktuell run1kb_100302, der Zeitstempel kann sich ändern) und werden beim den Bootvorgang geladen. Sollte die Datei "chk1kb" nicht vorhanden sein wird automatisch den Bootvorgang eine "Default Vorlage" im Speicher erstellt. Dies passiert auch wenn man den "Default" Knopf auf dem DSO drückt. Auch die gespeicherten "Setups" beinhalten alle diese Informationen da es lediglich Kopien von der DSO Firmware Variablen sind.
Die DSO Variablen selber sind noch nicht dokumentiert, bekannt ist lediglich das die z.b. folgende Informationen erhalten:
- aktuelle UI (aktuelle Menu, alle Benutzer-veränderbaren Einstellungen) - DSO Seriennummer - Firmware version - PCB Hardware revision
0x43 | Länge | 0x82 | DSO F.V. Daten | Prüfsumme | ||
LSB | MSB |
0x03 DSO Selbstkalibrierung auslesen
Die Anfrage ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0x03 | 0x48 |
Die Antwort beinhaltet die Selbstkalibrierung Informationen, gelesen aus dem DSO Speicher. Die sind auf dem DSO in der Datei /param/sav/chk1kb_yymmdd gespeichert (Aktuell chk1kb_091023, der Zeitstempel kann sich ändern) und werden beim den Bootvorgang geladen. Sollte die Datei "chk1kb" nicht vorhanden sein wird automatisch den Bootvorgang eine leere "Vorlage" im Speicher erstellt.
0x43 | Länge | 0x83 | chk1kb Daten | Prüfsumme | ||
LSB | MSB |
0x10 Datei lesen
siehe 0x53 Normale Meldungen Datei_lesen
0x11 Virtuelle Remote-Shell
Ermöglicht ausführen von Shell Befehlen. Das gesendete Befehl wird auf dem DSO in eine temporäre Datei umgeleitet, die wird dann aufgeführt und die Ausgabe als Antwort zurückgeschickt.
Anweisungen wie z.B. 'cd /tmp' haben daher keine Auswirkung bzw. ergeben keinen Sinn.
Der USB Empfangsbuffer in der 'dso.exe' ist definiert als
usbd_recv_buf 0x2800.
Daher bringen Befehle die mehr als 10.239 Bytes ausgeben die 'dso.exe' am DSO zum Absturz. Das DSO muss aus- und eingeschaltet werden, oder kann bei einer gleichzeitigen Verbindung über die UART und einem Terminal-Programm, mit dem Befehl '/dso.exe' wieder gestartet werden.
Die Anfrage enthält nur das Befehl:
0x43 | Länge | 0x11 | Remote Befehl | Prüfsumme | ||
LSB | MSB |
Die Antwort beinhaltet die Shell Ausgabe gefolgt von LF:
0x43 | Länge | 0x91 | Remote Ausgabe+LF | Prüfsumme | ||
LSB | MSB |
0x40 DSO Firmware Variablen schreiben
Die Anfrage beinhaltet die DSO Firmware Variablen, siehe DSO_Firmware_Variablen_auslesen
0x43 | Länge | 0x40 | DSO F.V. Daten | Prüfsumme | ||
LSB | MSB |
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xC0 | 0x05 |
Um die Einstellungen zu aktivieren sollte das DSO_Init aufgerufen werden.
0x41 DSO Selbstkalibrierung schreiben
Die Anfrage beinhaltet die Selbstkalibrierung Informationen, siehe DSO_Selbstkalibrierung_auslesen
0x43 | Länge | 0x41 | chk1kb Daten | Prüfsumme | ||
LSB | MSB |
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xC1 | 0x06 |
Um die Einstellungen zu aktivieren sollte das DSO_Init aufgerufen werden.
0x42 FPGA Register beschreiben
Die Anfrage beinhaltet Register Nummer und die Register Daten, siehe auch FPGA_Register_lesen
0x43 | Länge | 0x42 | 0x00 bis 0xFF (Register Nummer) | 0x.. 0x.. 0x.. 0x.. (Register Daten) | Prüfsumme | |
LSB | MSB |
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xC2 | 0x07 |
Intern wird die Firmware Funktion "PcUartWriteFpgaReg" aufgerufen, die mögliche Verwendung muß noch erörtert werden.
Bitte beachten - der Syntax ist temporär, evt. auch falsch.
0x43 Keycode senden
Ermöglicht einen Keycode zu senden. Der Unterschied zum 0x53 Normales Meldung Tastendruck_auslösen ist dabei sehr einfach, es werden auch speziele Keycodes unterstüzt und nicht nur die die Tasten representieren.
Beispiel1 (DST1xxxB/BV) : Die Taste F6 während sie gedrückt wird hat den debug Keycode <66> (Keycode 0x06 aus der 0x53 Normale MeldungTastendruck_auslösen) + 0x3C). Während die losgelassen wird hat die Taste F6 den debug Keycode <194> (Keycode 0x06 aus der 0x53 Normale MeldungenTastendruck_auslösen) + 0xBB). Vereinfacht gesagt - jeweilige Zeilennummer auf keyprotocol.inf + 0x3B beim Taste drücken und jeweilige Zeilennummer + 0xBA beim loslassen.
Beispiel2 (Hantek DSO5xxxB, Voltcraft DSO-3062C, Tekway DST1xxxB) : Die Taste F6 während sie gedrückt wird hat den debug Keycode <7> (Keycode 0x06 aus der 0x53 Normale MeldungTastendruck_auslösen) + 1). Während die losgelassen wird hat die Taste F6 den debug Keycode <135> (Keycode 0x06 aus der 0x53 Normale MeldungenTastendruck_auslösen) + 1 + 0x80). Vereinfacht gesagt - jeweilige Zeilennummer aus der keyprotocol.inf beim Taste drücken und jeweilige Zeilennummer + 0x80 beim loslassen.
Diese beiden Beispiele zeigen wie unübersichtlich Hantek programmiert.
Die "0x43 Keycode senden" Funktion erlaubt beide debug Keycodes zu senden. Es ist sogar möglich mehrere "clicks" zu senden was sehr interessant für Remote Control sein kann (2 x Utility, 2 x Page, 1 x F1 drucken).
0x43 | Länge | 0x43 | 0x.. (debug Keycode) | 0x.. (Anzahl der clicks) | Prüfsumme | |
LSB | MSB |
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xC3 | Prüfsumme 0x08 |
0x44 DSO Buzzer
Aktiviert den Buzzer für die Zeit "BT" (1bit=100ms)
0x43 | 0x03 | 0x00 | 0x44 | 0x01 BT | Prüfsumme |
Sobald die Zeit abgelaufen ist schaltet sich der Buzzer selbständig aus.
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xC4 | 0x09 |
0x45 Interpolation anpassungen
Erlaubt (temporär) änderungen in der Lagrangeschen Interpolation. Soweit ich verstanden habe kann man die Abgrenzungen (0 bis 1000ps) setzen und die Phasen aller ADCs (eigentlich die Daten aus im FIFOs werden phasenverschoben und nicht die ADCs) ändern (0=0° bis FFFF=360°).
0x43 | 0x14 | 0x00 | 0x45 | 0x.. init LSB | 0x.. init MSB | 0x.. 0x.., 0x.. 0x.., 0x.. 0x.., 0x.. 0x.., 0x.. 0x.., 0x.. 0x.., 0x.. 0x.., 0x.. 0x.. (Phasen ADC 1 bis 8) | Prüfsumme |
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xC5 | 0x0A |
Die Lagrangesche Interpolation ist nur in den TBID < 3 (also Horizontal Ablenkung 2ns/DIV, 4ns/DIV und 8ns/DIV) eingeschaltet. Die mögliche Verwendung muß noch erörtert werden.
Bitte beachten - der Syntax ist temporär, evt. auch falsch
0x50 Datei senden
Diese Funktion kann benutzt werden um eine beliebige Datei auf das DSO zu übertragen.
Die Anfrage besteht aus drei Paketen wobei das erste Paket (mit Subkommando 0) den vollständigen Dateipfad (Zielpfad), das zweite Paket (mit Subkommando 1) beinhaltet die Daten selber. Sollte die Datei länger als 10000 Bytes sein, werden ein oder mehrere weitere Pakete (mit Subkommando 1) gesendet, solange bis die gesamte Datei gesendet ist. Zum Abschluß wird noch ein Paket gesendet (mit Subkommando 2). Es markiert das Ende der Übertragung und beinhaltet eine Prüfsumme über alle Bytes der gesendeten Datei.
0x43 | Länge | 0x50 | 0x00 | Dateipfad | Prüfsumme | |
LSB | MSB | |||||
... | ||||||
0x43 | Länge | 0x50 | 0x01 | Dateiinhalt | Prüfsumme | |
LSB | MSB | |||||
... | ||||||
0x43 | 0x04 | 0x00 | 0x50 | 0x02 | Dateiprüfsumme (1 Byte) | Prüfsumme |
Nach jedem dieser Pakete sollte einmal die Antwort abgefragt werden. Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xD0 | 0x15 |
0x60 Datei updaten
Diese Funktion kann benutzt werden um eine beliebige Datei auf dem DSO zu ersetzen.
Die Anfrage besteht aus drei Paketen wobei das erste Paket (mit Subkommando 0) den vollständigen Dateipfad (Zielpfad), das zweite Paket (mit Subkommando 1) beinhaltet die Daten selber. Sollte die Datei länger als 10000 Bytes sein, werden ein oder mehrere weitere Pakete (mit Subkommando 1) gesendet, solange bis die gesamte Datei gesendet ist. Zum Abschluß wird noch ein Paket gesendet (mit Subkommando 2). Es markiert das Ende der Übertragung und beinhaltet eine Prüfsumme über alle Bytes der gesendeten Datei.
0x43 | Länge | 0x60 | 0x00 | Dateipfad | Prüfsumme | |
LSB | MSB | |||||
... | ||||||
0x43 | Länge | 0x60 | 0x01 | Dateiinhalt | Prüfsumme | |
LSB | MSB | |||||
... | ||||||
0x43 | 0x04 | 0x00 | 0x60 | 0x02 | Dateiprüfsumme (1 Byte) | Prüfsumme |
Nach jedem dieser Pakete sollte einmal die Antwort abgefragt werden. Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xE0 | 0x25 |
Warum auch immer, aber nach dem ersten Paket kommt bei mir eine Antwort mit Fehler = 0x11
0x43 | 0x03 | 0x00 | 0xE0 | 0x11 (<- Fehler Code) | 0x37 |
was eigentlich für "Datei nicht gefunden" steht. Dennoch wird die angegebene Datei korrekt ersetzt.
0x7F Init DSO
Die Anfrage ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0x7F | 0xC4 |
Dies ruft folgende DSO Subroutinen in der Firmware:
PauseSysAcq Acq_InitAcqParam Acq_SyncEqualAcq SyncChDispWhenEnterX SyncBodeAssiant SyncDsoScanSwitch InitCalculationManageParam InitAcqWaveEvent InitDispWaveEvent InitWaveSoftEvent Init_SwapTrig Tdc_SyncTdcTable Limites_Init InitLcdUnwaveareaShow InitLcdWaveAreaShow InitDsoOtherStat UpdateSysRunParam Fpga_SetTrigHoldTime Sync_AutoDispInterval ContinueSysAcq ForceShowWinBar
Die Auswirkung ist nicht die selbe wie bei einem Neustart da nicht alle Init Subroutinen aufgerufen werden, allerdings ausreichend um z.b. DSO Variablen (siehe DSO_Firmware_Variablen_schreiben) oder DSO Selbstkalibrierung Daten (siehe DSO_Selbstkalibrierung_schreiben) zu aktivieren.
Die Antwort ist leer. D.h. sie enthält kein Datenbyte.
0x43 | 0x02 | 0x00 | 0xFF | 0x44 |
.
Fußnoten
- ↑ Hantek hat lange Zeit, entgegen der GPL, keinen Sourcecode der verwendeten GPL-Programme und des Linux veröffentlicht. Mittlerweile sind ziemlich ungeordnete Fragmente des GPL-Sourcecodes aufgetaucht: Nicht dabei ist der Sourcecode des proprietären DSO-Programms.
- ↑ Die VID 049f wurde eigentlich Compaq zugeteilt.
- ↑ Gute USB-Bibliotheken erledigen das von alleine.
- ↑ | Wie alles began - das erste DSO von Tekway
- ↑ Eine gute USB-Bibliothek sollte in der Lage sein, solche Pakete wieder zusammenzusetzen.