Forum: Mikrocontroller und Digitale Elektronik USB: Enumeration failure ( AT91SAM7S256)


von Dirk H. (xplod)


Lesenswert?

Ich habe ein Problem mit meiner USBDevice Klasse:

Die Klasse möchte ich dafür verwenden, um per virtual COM port Daten an 
den Host zu senden. Dazu möchte ich nicht andauernd ein usb->update() 
oder so ausführen müssen, sondern alles soll Interruptgesteuert "von 
alleine" funktionieren.

Jetzt mein Problem:
Meine Firmware empfängt folgende Pakete:
1. GetDeviceDescriptor [0x80,0x06,0x00,0x01,0x00,0x00,0x40,0x00]
2. SetAddress [0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00]
3. GetDeviceDescriptor [0x80,0x06,0x00,0x01,0x00,0x00,0x40,0x00]

Danach passiert Nichts mehr. Configuration und Interfaces werden nicht 
abgefragt. Kann mir jemand Tipps geben, was ich verkehrt mache?
Wenn die Antwort auf 1. verkehrt wäre, würden dann noch 2. und 3. 
kommen?

Gibt es ein Tool, mit dem man den Traffic von neuen Devices mitloggen 
kann, um zu sehen, wo das Problem liegt? Ich habe kein vernünftiges Tool 
gefunden.

Der Quellcode zu meinen Treiber liegt hier:
http://www.xplod.de/index.php?option=com_content&view=category&layout=blog&id=5&Itemid=19

Gruß
Dirk

von Thomas (Gast)


Lesenswert?

>Jetzt mein Problem:
>Meine Firmware empfängt folgende Pakete:
>1. GetDeviceDescriptor [0x80,0x06,0x00,0x01,0x00,0x00,0x40,0x00]
>2. SetAddress [0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00]
>3. GetDeviceDescriptor [0x80,0x06,0x00,0x01,0x00,0x00,0x40,0x00]
die Frage ist eher was sendest du bei diesen Reqquests zurück
zumindest wlength = 0x40 ist schon etwas komisch
Wie sieht dein Devicedexriptor aus ?
Da du nicht mal den GetConfigDescriptor siest wird dein Device wohl
nur Müll senden.

Thomas

von Michael W. (mictronics) Benutzerseite


Lesenswert?

Folgende Tools sind sehr nützlich zum Debuggen von USB: SourceQuest 
SourceUSB, und USBTrace.

von Dirk H. (xplod)


Lesenswert?

Thomas wrote:
>>Jetzt mein Problem:
>>Meine Firmware empfängt folgende Pakete:
>>1. GetDeviceDescriptor [0x80,0x06,0x00,0x01,0x00,0x00,0x40,0x00]
>>2. SetAddress [0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00]
>>3. GetDeviceDescriptor [0x80,0x06,0x00,0x01,0x00,0x00,0x40,0x00]
> die Frage ist eher was sendest du bei diesen Reqquests zurück
> zumindest wlength = 0x40 ist schon etwas komisch
> Wie sieht dein Devicedexriptor aus ?
> Da du nicht mal den GetConfigDescriptor siest wird dein Device wohl
> nur Müll senden.

Ich bin schon etwas weiter: Das Problem lag daran, dass sizeof() mir 
mehr zurückgeliefert hat, als die Struktur eigentlich gebraucht hätte. 
Seitdem ich die Größe händisch in den Descriptor eingetragen habe kommt 
ich bis zum GetConfigurationDescriptorabfrage ( den bekomme ich sogar 
zwei Mal. Einmal mit wLength=9 und einmal mit wLength=0xff).

Ich habe mir den ConfigurationDescriptor leider nur von einem USB 
Beispielprojekt "ausgeliehen". Ich hätte gerne, dass mein Device einen 
generischen "Virtuel COM Port" erzeugt, der an jedem Windows ab XP 
direkt ohne einen separaten Treiber erkannt wird. Jetzt durchforste ich 
die Communication Device Class (CDC) Spec nach einer passenden 
Implementierung, finde sie aber nicht. Ich habe leider noch nicht 
gefunden, wo die sagenumwobene "Serial communication emulation" class 
definiert sein soll...
Kennt jemand von euch einen solchen "allegemeinen" Descriptor, oder muss 
ich mir meinen Windows Treiber selber schreiben?

Vorteil von dem virtual COM Port wäre, dass man mit einfachsten Mitteln 
den Datenverkehr auslesen und manipulieren kann (z.B. in Matlab oder 
Labview). Oder kennzt jemand von euch eine bessere Variante?

Gruß
Dirk

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.