Hallo zusammen, ist es möglich ein USB-Gerät mit 2 HID´s (Tastatur/Maus) als einen Endpunkt mit folgender Description zu betreiben: 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x95, 0x06, // REPORT_COUNT (6) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x65, // LOGICAL_MAXIMUM (101) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs) 0xc0, // END_COLLECTION 0xc0, // END_COLLECTION 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x06, // INPUT (Data,Var,Rel) 0xc0, // END_COLLECTION 0xc0 // END_COLLECTION In der vusb-Config habe ich Endpunkt mit 1 angegeben...soweit klappt die Verbindung auch im Sinne von: Es kommen Daten an und die Maus bewegt sich. Allerdings zeigt USBlyzer Fehler "URB Bulk or Interrupt Transfer failed" und die Verbindung reißt kurzzeitig ab (Übertragung abgehackt). Verwendet wird ein atmega88 mit vusb. Daher würde ich mich Freuen wenn sich jemand mit USB-Erfahrung kurz zur Description äussern könnte. Vielen Dank.
vusb-user schrieb: > ist es möglich ein USB-Gerät mit 2 HID´s (Tastatur/Maus) als einen > Endpunkt mit folgender Description zu betreiben: Ist das eine Frage oder eine Feststellung? vusb-user schrieb: > Allerdings zeigt USBlyzer Fehler "URB Bulk or Interrupt Transfer > failed" und die Verbindung reißt kurzzeitig ab (Übertragung abgehackt). Ich tippe auf die Hardware. Bulk gibt es nur bei high- oder fullspeed daher auszuschließen. Poste mal deine ganze Schaltung + gesamten Sourcecode.
Lehrmann Michael schrieb: > Bulk gibt es nur bei high- oder fullspeed > daher auszuschließen. Bei V-USB auch bei "Einzelgeräten" so gesehen: z.B. AVR-CDC von http://www.recursion.jp/AVR-CDC/ macht das auch so. Die Leute schreiben da auch sowas wie "[...]goes somehow beyond the spec[...]". Komischerweise scheinen Windows-Maschinen den Bulk-Transfer bei LowSpeed in mehr Fällen nicht zu schlucken wie Unixoide Maschinen. Weißt du mehr dazu bzw. warum das so ist, Michael? mfg mf
Anscheinend gehts nun... der Timer0 hat mir übel mitgespielt ;) Allerdings würd mich folgendes noch interessieren. Lehrmann Michael schrieb: > Ist das eine Frage oder eine Feststellung? Eine Vermutung. Es wäre sehr schön wenn mir jemand Endpoint und Report_id in einem Satz erklären könnte...Habe zwar "Jan Axelson" angeschaut aber so klar sind die Begrifflichkeiten doch nicht in Bezug auf einen Verbund von Maus + Tastatur zum Beispiel. Im Buch habe ich generell wenig über Verbunde gefunden.
Der Datenaustausch zwischen Host und Device erfolgt über Pipes (Datenkanäle). Eine Pipe endet auf Device-Seite in einem Endpunkt. Dieser Endpunkt besteht aus Datenpuffer und ein paar Registern. Mit Ausnahme vom Endpunkt 0 (bidirektional) erfolgt der Datenaustausch in einer Pipe immer nur in eine Richtung - also entweder zum Host oder zum Device. Um beide Richtungen zu bedienen werden deshalb viele Schnittstellen auch mit mindestens 2 Endpunkten ausgeführt. Näheres zu Maus und Keyboard findest Du hier: http://www.cygnal.org/ubb/Forum9/HTML/001381.html Gruß Potter
Beim Datenaustausch über HID werden die Daten in sog. Reports übertragen. Oft hat man lediglich einen INPUT/OUTPUT/FEATURE-Report je HID und man muss keine ID angegeben (als ID wird automatisch 0 verwendet). Will man jetzt aber z.B. die zu sendenden Daten weitergehend strukturieren, so definiert man mehrere Reports im Descriptor - dann aber mit unterschiedlichen ID's. PS: Deine Descriptoren sind unvollständig. Maus-Buttons und Keyboard-LED's funktionieren so nicht. Maus:
1 | 0x05, 0x01, // Usage Page (Generic Desktop) |
2 | 0x09, 0x02, // Usage (Mouse) |
3 | 0xA1, 0x01, // Collection (Application) |
4 | 0x09, 0x01, // Usage (Pointer) |
5 | 0xA1, 0x00, // Collection (Physical) |
6 | 0x85, 2, // REPORT-ID (2) |
7 | 0x95, 0x03, // Report Count (3) |
8 | 0x75, 0x01, // Report Size (1) |
9 | 0x05, 0x09, // Usage Page (Buttons) |
10 | 0x19, 0x01, // Usage Minimum (01) |
11 | 0x29, 0x03, // Usage Maximum (03) |
12 | 0x15, 0x00, // Logical Minimum (0) |
13 | 0x25, 0x01, // Logical Maximum (1) |
14 | 0x81, 0x02, // Input (Data, Variable, Absolute) |
15 | 0x95, 0x01, // Report Count (1) |
16 | 0x75, 0x05, // Report Size (5) |
17 | 0x81, 0x01, // Input (Constant) for padding |
18 | 0x05, 0x01, // Usage Page (Generic Desktop) |
19 | 0x09, 0x30, // Usage (X) |
20 | 0x09, 0x31, // Usage (Y) |
21 | 0x15, 0x81, // Logical Minimum (-127) |
22 | 0x25, 0x7F, // Logical Maximum (127) |
23 | 0x75, 0x08, // Report Size (8) |
24 | 0x95, 0x02, // Report Count (2) |
25 | 0x81, 0x06, // Input (Data, Variable, Relative) |
26 | 0xC0, // End Collection (Physical) |
27 | 0xC0 // End Collection (Application) |
Warum meckert eigentlich noch keiner, dass der Link falsch ist? http://www.recursion.jp/avrcdc/index.html mfg mf
Mini Float schrieb: > Warum meckert eigentlich noch keiner, dass der Link falsch ist? Warscheinlich weil es in diesem Thread nicht um CDC-Anbindung geht, wäre sinnvoll einen neuen aufzumachen ;) Potter schrieb: > Will man jetzt aber z.B. die zu sendenden Daten weitergehend > strukturieren, so definiert man mehrere Reports im Descriptor - dann > aber mit unterschiedlichen ID's. Verstehe ich das richtig, dass man weder mehrere Endpoints noch unterschiedliche Report_id´s braucht um mehrere HID´s zu behandeln? Nur der Übersichtlichkeit werden die Reports aufgeteilt anstatt alles am Stück zu senden. LED´s habe ich bei absichtlich weggelassen, da das Gerät keine hat. Sollte HID ja keine Probleme machen - Maustasten wegen der Vereinfachung erst mal unter den Tisch gekehrt - trotzdem Danke für den Hinweis!
Es wird hier nicht alles am Stück gesendet. Dein Beispiel von oben verhält sich so, dass Du entweder die Maus, oder das Keyboard zum Leben erweckst. Je nachdem, welchen Report (welche ID) Du sendest. Dass man hierzu nur einen Endpunkt braucht, siehst Du richtig. Es werden nämlich nur Daten zum Host gesendet. Wenn Du jetzt auch noch das Schalten der Keyboard LED's implementieren wolltest (Daten vom Host zum Device), dann benötigst Du auch noch einen weiteren Endpunkt - nämlich für die Transfer-Richtung Host - Device.
Nun sollte alles klar sein, besten Dank nochmal. Wenn alles funktioniert kümmer ich mich evtl. noch um einen OUT-Endpoint - bis dahin... Wünsche euch noch schöne Osterfeiertage.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.