Hallo,
ich mache gerade meine ersten Schritte mit USB mithilfe eines
ATmega32U2.
Was ich vorhabe, ist ein Gerät, welches sowohl als MIDI Device ( HID )
als auch als Generic HID Device ( für normale Steuerbefehle ) angemeldet
wird.
Mithilfe der Beispiele von LUFA ist mir auch entweder das eine oder das
andere gelungen, aber dank USB sollte es doch möglich sein, beides auf
einem USB-Gerät zu verbinden ( 2 Endpoints für MIDI, 2 Endpoints für
Generic HID ).
Leider fehlt mir ein vernünftiger Ansatz, das zu schaffen, es scheitert
an den Descriptors, insbesondere dem ConfigurationDescriptor.
Der ist bei beiden Geräten anders definiert...
für MIDI:
Die frage ist nun, wie bringe ich das unter einen Hut ?
Einfach beides zusammenkopieren hat nicht geholfen, dann übersteht das
Gerät nicht mal die Enumeration-Phase.
Hätte jemand einen Tipp, wie man das angeht ?
Gruß,
Artur
Im Configuration-Descriptor setzt Du nun aber bNumInterfaces auf 3 und
sorgst dafür, das die drei Interface-Descriptoren unterschiedliche Werte
für bInterfaceNumber aufweisen.
Da sowohl MIDI als auch Audio nicht HID ist und Du bereits für Audio
mehrere Interface-Descriptoren hast, die logisch zusammen gehören, wirst
Du wohl auch um den Interface Association Descriptor nicht herumkommen
(wie ihn die Version 2 der Audio Device Class Definition sogar
vorschreibt). Siehe:
http://www.usb.org/developers/whitepapers/iadclasscode_r10.pdf
Vielen Dank schonmal für diese Informationen ...
also habe ich das richtig verstanden ... die AudioControl und
AudioStream Interfaces in einer IAD und das GenericHID Interface in
einer anderen IAD zusammenfassen ?
Das würde dann so aussehen ( diesmal nicht die Typdefinition, sondern
die konkreten Werte ):
funktioniert leider immer noch nicht ... beim Anstecken sucht Windows
die Treiber, findet sie aber nicht und trägt das Gerät einfach nur als
"USB Composite Device" ein, mit der Info, dass das Gerät nicht gestartet
werden konnte.
Artur H. schrieb:> Vielen Dank schonmal für diese Informationen ...> also habe ich das richtig verstanden ... die AudioControl und> AudioStream Interfaces in einer IAD und das GenericHID Interface in> einer anderen IAD zusammenfassen ?
Das HID würde ich einfach folgen lassen. Es gibt hierfür ja nur ein
Interface, da brauchst Du nichts zusammenzufassen.
Für den IAD musst Du den Device Descriptor aber auch anpassen, um
anzuzeigen, dass Du eben den IAD verwenden willst (Tabelle 1-1 aus dem
oben verlinkten PDF). Hast Du das beachtet?
> funktioniert leider immer noch nicht ... beim Anstecken sucht Windows> die Treiber, findet sie aber nicht und trägt das Gerät einfach nur als> "USB Composite Device" ein, mit der Info, dass das Gerät nicht gestartet> werden konnte.
Welches Gerät? Sind beide betroffen, oder wird zumindest eines
verwendet?
René König schrieb:> Das HID würde ich einfach folgen lassen. Es gibt hierfür ja nur ein> Interface, da brauchst Du nichts zusammenzufassen.
Ok, habe ich mal gemacht.
> Für den IAD musst Du den Device Descriptor aber auch anpassen, um> anzuzeigen, dass Du eben den IAD verwenden willst (Tabelle 1-1 aus dem> oben verlinkten PDF). Hast Du das beachtet?
Jawohl, funktioniert immer noch nicht.
> Welches Gerät? Sind beide betroffen, oder wird zumindest eines> verwendet?
Beide sind betroffen, keins funktioniert.
Wenn ich jedoch den kompletten Generic-HID-Teil rauskommentiere,
funktioniert zumindest das MIDI-Device ohne Probleme ... mein Ziel ist
aber, beides zusammen hinzukriegen.
Das sehe ich ja jetzt erst: Wenn Du sie tatsächlich hier rausgelassen
hast, funktioniert das auch nicht. Ich hoffe, Du hast sie weiter oben,
also bereits vor dem HID_Interface, rausgelassen.
Ansonsten: Funktioniert das HID allein? Wenn ja, hast Du vielleicht
Endpoint-Adressen doppelt vergeben? HID IN und HID OUT darf sich nicht
mit Deinen MIDI Jacks beißen.
Hast Du Dir das mal mit einem Protokoll-Analyzer angesehen? Bis wohin
läuft denn die Enumeration?
René König schrieb:> Das sehe ich ja jetzt erst: Wenn Du sie tatsächlich hier rausgelassen> hast, funktioniert das auch nicht. Ich hoffe, Du hast sie weiter oben,> also bereits vor dem HID_Interface, rausgelassen.
In der Tat, das hat nun einiges geändert ... beim Anstöpseln will er nun
insgesamt 3 Treiber installieren ...
1) USB Composite Device, den Treiber findet er offenbar auch
2) USB Audio Device, den Treiber findet er nicht
3) USB Input Device ( also das Generic HID ), den findet er auch
Generic HID funktioniert nun, aber MIDI klappt nicht.
Endpoint Adressen habe ich 1(IN), 2(OUT) für MIDI und 3(IN), 4(OUT) für
Generic HID, das sollte also kein Problem geben.
> Hast Du Dir das mal mit einem Protokoll-Analyzer angesehen? Bis wohin> läuft denn die Enumeration?
Noch nicht, werd mich gleich mal auf die Suche nach solchen Programmen
machen.
Nebenbei bemerkt: Vielen Dank für deine Geduld, René :)
Hmh. Also wenn MIDI inklusive IAD ohne das HID funktioniert, sollte es
auch zusammen mit dem HID funktionieren. Ein Schuß ins Blaue: Stimmt die
Kalkulation von Audio_StreamInterface_SPC.TotalLength, oder kommt da
zusammen mit dem HID ein anderer Wert heraus?
René König schrieb:> Hmh. Also wenn MIDI inklusive IAD ohne das HID funktioniert, sollte es> auch zusammen mit dem HID funktionieren. Ein Schuß ins Blaue: Stimmt die> Kalkulation von Audio_StreamInterface_SPC.TotalLength, oder kommt da> zusammen mit dem HID ein anderer Wert heraus?
Wow, volltreffer!
Ich habe die Länge der HID-Structs raussubtrahiert, und nun geht beides.
Vielen Dank!
Entschuldigt das ich diesen alten Thread wieder ausgrabe aber ich habe
ein sehr aehnliches problem. Ich versuche ein CDC + MIDI geraet ueber
IAD anzumelden. An sich klappt das auch aber irgendwo laueft doch was
schief und die CDC kommunikation bricht ab.
Bis jetzt hatte ich die Audio_StreamInterface_SPC.TotalLength noch nicht
veraendert. Wie definiere ich denn die Laenge meines CDC-Structs? Wie
wurde denn die laenge des HID-Structs konkret im Kode definiert und
subtrahiert? Macht es in welcher reihenvolge ich die CDC-Endpoints und
die MIDI-Endpoints habe?