Forum: Mikrocontroller und Digitale Elektronik Usb Analyzer


von Felipe (Gast)


Lesenswert?

Hallo zusammen,
ich habe ein kleines Problem mit dem Tusb3410[1] von TI. Und zwar bin
ich bei der Programmierung des Usb-Enumeration-Vorgangs auf
Schwierigkeiten gestossen. Nachdem der Tusb3410 eine Adresse vom Host
zugewiesen bekommt, empfängt er einen GetDescriptor-Request (dabei
handelt es sich um einen Devicedescriptor-Request mit wLength=0x08).
Trotz der vielen Versuche scheint der Tusb3410 keinen Devicedescriptor
zum Host zu senden, und aus diesem Grund wird er nicht vollständig
enumeriert. Am Oszi kann man beobachten, dass nach dem Empfang des
Getdescriptor-Requests weitere Datenpakete übertragen werden, aber
leider kann ich nicht feststellen, vom welchen Busteilnehmer diese
gesendet werden, und um welche Datenpakete es sich dabei handelt.

Nun möchte ich den Datenverkehr zwischen Host und Device genauer
untersuchen, aber leider ist die Dekodierung an meinem Oszi sehr
schwierig, und deswegen habe ich nach einer Software gesucht, die mir
die Datenpakete protokolliert.

Leider arbeiten alle Usb-Sniffers, die ich gefunden habe, erst nach der
Enumeration (oder kennt vielleicht jemand einen Usb-Sniffer, der auch
die Enumeration mitprotokolliert..!?) und helfen mir bei meinem Problem
nicht weiter. Danach habe ich nach Hardware-Lösungen gesucht und auch
welche gefunden. Mit einem Usb Analyzer, wie z.B. der SBAE-30 von
Catylst[2] könnte ich mein Problem genauer untersuchen, aber leider ist
das Gerät für mich zu teuer. Also habe ich mich gefragt, wie schwer es
wohl wäre, einen Usb "Analyzer" zu entwickeln. Mit Analyzer meine ich
einen uC, der am Usb-Bus angeschlossen wird, und Datenpakete über einen
Zeitraum in einem Buffer speichert. Der Zeitraum für die Aufnahme
könnte mit Hilfe eines
externen IO-Ports des Tusb3410 getriggert werden, oder vielleicht
direkt über das Sync-Feld des Usb-Frames.

Da der Tusb3410 in Full-Speed-Modus (12MBits/s, tBit ~80ns) arbeitet,
muss der uC schnell genug sein, um die Daten in einem Buffer
(vielleicht reicht ein uC mit on-chip XRAM in der Größenordnung einiger
KBytes aus !?!) zu speichern. Die aufgenommenen Daten könnte man danach
am PC weiterverarbeiten und filtern, bis man die einzelne
Usb-Datenpakete erhält.

Leider kenne ich mich mit Mikrocontrollern nicht so gut aus, deswegen
würde ich gerne die Meinung von Euch lesen, um zu erfahren, ob es
überhaupt möglich ist, mit einfachen Mitteln (uC, RAM, Usb-Bustreiber,
...??) einen solchen Analyzer zu realisieren.
Für Kommentare oder andere Lösungsansätze zu diesem Thema
wäre ich sehr dankbar.


Danke im Voraus


Felipito


PS: ich habe die Suchfunktion verwendet, und habe einen Thread vom
02.08.2002 gefunden. Aber vielleicht ist es heute ein wenig leichter
einen solchen Analyzer zu entwickeln; wobei mir klar ist, dass bereits
die Verarbeitung der Datenpakete im PC auch nicht leicht sein wird
(NRIZ-Kodierung, Bit-Stuffing, ...)

PS2: falls jemand den Tusb3410 programmiert hat, dann bitte melden

[1] http://focus.ti.com/docs/toolsw/folders/print/tusb3410gpiopdk.html
[2] http://www.getcatalyst.com/analyzers_pro_SBAE30.jsp

von Thomas (Gast)


Lesenswert?

Du hast ein generelles Problem. Bei der Enumerierung von Win kommt gar
nie ein GetDescriptor (Device) mit wLength=0x0008.
Windows macht das entweder mit wLength = 0x0040 vor dem SetAddress
danach mit wlength = 0x0012.
Sehr warscheinlich ist dein SetAddress kaput.

Einen USB Analyzer selbst zu bauen kannst du vergessen, solange du eine
Enum nicht hinbekommst.
schau mal bei http://www.ellisys.com/ die bieten sowas relativ
preiswert an.

Ich habe übrigens die TUSBs schon programmiert.:-)

Thomas

von Felipe (Gast)


Lesenswert?

Hallo Thomas,
herzlichen Dank für Deine Antwort. Ich gebe Dir Recht, laut
Spezifikation müsste wLength=0x40 sein, und nach dem SetAddress müsste
er einen Request mit wLength=0x12 erhalten, aber aus irgendeinem Grund
erhalte ich folgenden GetDeviceDescriptor-Request:

80 06 00 01 00 00 08 00

Diese Werte stammen aus dem Setup-Paket-Block (bei einem VECINT=0x32),
und wie man sieht, ist wLength=0x08.

Nach dem Anschliessen des Tusb3410 an meinem PC (Linux-BS) erhalte
ich folgende Systemmeldungen:

Dec 30 01:08:23 felipito kernel: usb 1-1: new full speed USB device
using address 8
Dec 30 01:08:28 felipito kernel: usb 1-1: control timeout on ep0in
Dec 30 01:08:31 felipito kernel: usb 1-1: device descriptor read/all,
error
-110

(Da die Usb-Enumeration laut Spezifikation generisch sein sollte,
müsste auch bei Windows gleich ablaufen, aber mangels eines
Windows-Systems habe ich es nicht testen können)

Nachdem Anschliessen des Tusb3410 an dem Usb-Bus (CONT=1) erhalte ich
folgende Setup-Pakete vom Host:

00 05 08 00 00 00 00 00
80 06 00 01 00 00 08 00
80 06 00 01 00 00 08 00
80 06 00 01 00 00 08 00

Dreimal den gleichen GetDeviceDescriptor-Request mit wLength=0x08, und
danach ist Feierabend.

Nun ich weiss nicht, ob es zu viel verlangt ist, aber könntest Du mir
vielleicht sagen, ob Du einen Eeprom für das Speichern Deines
Anwenderprogramms (Firmware) verwendet hast...?! und wenn ja, mit
welcher Art von Firmware Du es hingekriegt hast: Binary Firmware oder
Autexec Binary Firmware ?!
Ich wäre Dir sehr dankbar für diese Infos, denn ich habe
in den letzten Tagen mit beiden Optionen versucht, aber leider
erfolglos.

Danke im Voraus, und frohes neues Jahr wünsche ich Dir

Felipe

von René König (Gast)


Lesenswert?

Hallo!

Ich kenne den TUSB zwar nicht, aber kann es vielleicht sein, daß Du die
Adresse zu früh aktivierst? Die Status-Stage des SetAddress-Requests muß
auf jeden Fall noch auf Adresse 0 laufen, ansonsten passieren die
dollsten Sachen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.