Hallo
Ich habe Probleme mit LibUSB. Mein Mp3-Player ist in der Regel ein
MassStorageDevice. Für Debugzwecke habe ich ein weiteres Interface
definiert, mit Classcode 0xff und 2 weiteren Endpoints.
Mit Hilfe von LibUSB für Winsdows wollte ich nun auf meine Endpoints
zugreifen. Das funktioniert jedoch absolut nicht zuverlässig. Das Gerät
hängt sich auf (Host-Seitig).
Auf dem Mp3-PLayer läuft das Atmel MSD mit angepassten DeviceDescriptor
und zusätzlicher Abfrage der 2 weiteren Debug-Endpoints.
Was ich bissher festgestellt habe: Der Mp3-Player läuft mit LibUSB nur
zuverlässig, wenn das MSD deaktiviert ist und der treiber explizit für
die PID und VID des Players installiert ist.
Wird der Player als "Verbundgerät" angemeldet kann ich NUR für dieses
LibUSB installieren. Obwohl der Gerätemanager das MSD als auch das
DebugInterface (bei "Unbekannte Geräte") anzeigt.
Liegt das unstabile verhalten an dieser tatsache? Kommen sich eventuell
die Treiber in die Quere? Es ist ja so, dass für das verbundgerät im
ganzen LibUSB als Treiber genommen wird und das MSD ja für sich seinen
eigenen Treiber lädt.
Des weiteren habe ich auf dem Device Softwareseitig ein Problem:
Ich bekomme eine Anfrage die ich ohne CompositeDevice nicht bekomme.
Und zwar bekommt der Control-Endpoint die Anfrage "CLEAR FEATURE" mit
dem RequestType 0x81 (129). Ohne CompostiteDevice (Also NUR MSD) wird da
NUR RequestType 0, 1, oder 2 gesendet.
Ich poste mal den Code:
1 | void usb_process_request(void)
|
2 | {
|
3 | ...
|
4 | bmRequest = ...
|
5 | bmRequestType = ...
|
6 | ...
|
7 | switch (bmRequest)
|
8 | {
|
9 | ...
|
10 | case CLEAR_FEATURE:
|
11 | /*if (bmRequestType <= 0x02)*/ usb_clear_feature();
|
12 | //else { /*asm volatile ("breakpoint"); */goto unsupported_request; }
|
13 | break;
|
14 | ...
|
15 | }
|
16 | }
|
Zugegebener maßen weiß ich zur Zeit nicht was ich mit diesem RequestType
anfangen soll und ob das eventuell mein Fehler ist.
Es kann ja auch sein, dass der Host abkackt, weil das Device noch unfug
macht.
Kann mir da jemand bitte Helfen? :-)
Zur Ergänzung: LibUSB rennt hauptsächlich in (2.5sec-)Timeouts, kann
Interfaces nicht "release"n oder "claim"en, und Folgefehler die sich
daraus ergeben, da Windows das Gerät dann einfach abmeldet ohne den
Treiber zu entladen.
Verwendet wird Simpler Bulk-Transport.
Ich bitte um Antworten :-)
MFG