Hallo zusammen!
Ich möchte hier ein USB-Gerät bauen, das einerseits als HID
kommuniziert, andererseits sein Flash als Massenspeicher exportiert. Was
ich bisher erreicht habe:
-HID läuft
-MSC läuft
-HID und MSC laufen gleichzeitig
Aber ich möchte zumindest das MSC abschalten können, am besten vom Gerät
aus (also nicht mit einem USB-Befehl, der vom PC kommt). Also eine
Option wäre, das HID läuft immer und ich schalte das MSC dazu oder weg.
Oder ich wechsel komplett, so dass das HID weg ist, wenn das Gerät als
MSC läuft.
1. Wie stell ich das an? Vom Verständnis des USB-Protokolls her kann ich
entweder HID und MSC als verschiedene Konfigurationen definieren oder
als verschiedene alternate interfaces. Verschiedene Konfigurationen
macht man anscheinend nicht. Was sind denn die Vor- und Nachteile der
jeweiligen Lösungen?
2. Außerdem frage ich mich: muss ich mich selber darum kümmern, dass der
PC eine Variante auswählt? Denn mein Client-Programm (das legendäre
HIDClient.exe) hängt sich bisher immer auf, wenn ich zwei
Konfigurationen oder zwei alternate interfaces probiere.
Das sind die Deskriptoren, die ich verwende:
- Für zwei Konfigurationen:
Lass doch das MSD die ganze Zeit aktiv, aber sieh Dir an, was z.B.
Kartenleser machen, wenn aus ihnen die Karte entfernt wird. Das
MSD-Protokoll dürfte für diesen Fall eine Signalisierung vorsehen -- und
genau diese solltest Du verwenden können.
Hm, lustige Idee. Aber dann legt doch Windows trotzdem einen
Laufwerksbuchstaben an, nicht? Zumindest hab ich bei meinem Kartenleser
immer vier Buchstaben, selbst wenn nur eine Karte steckt.
Peter Parker schrieb:> Aber dann legt doch Windows trotzdem einen> Laufwerksbuchstaben an, nicht?
Deswegen kann man bei neueren Windows-Versionen konfigurieren, daß
"leere Laufwerke" nicht angezeigt werden.
Ah, das wusste ich nicht. Hilft mir aber leider auch nicht weiter, weil
auch digitale Analphabeten das Ding benutzen sollen. Ich hab
mittlerweile mit USBlyzer etwas rausbekommen:
Wenn ich nur das HID konfiguriert habe, bekomme ich auf dem Bus
regelmäßig (alle 32ms, klar) einen "URB Bulk or Interrupt Transfer
issued" und 64ms später den dazugehörigen (woher weiß der Bus
eigentlich, welche Antwort zu welcher Anfrage gehört?) "URB Bulk or
Interrupt Transfer succeeded" mit den Daten, die mein Gerät liefert.
Aber wenn ich HID und MSC konfiguriere (als alternate settings desselben
interfaces), sehe ich gar nichts auf dem Bus. Was kann ich denn daraus
lernen? Nachdem die Enumeratin problemlos läuft, hätte ich erwartet,
dass der PC schon weiß, wo er die Anfrage hinschicken soll. Aber
anscheinend ist dem nicht so...