Forum: Mikrocontroller und Digitale Elektronik hid description


von vusb-user (Gast)


Lesenswert?

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.

von Lehrmann M. (ubimbo)


Lesenswert?

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.

von Achim M. (minifloat)


Lesenswert?

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

von vusb-user (Gast)


Lesenswert?

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.

von Potter (Gast)


Lesenswert?

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

von Potter (Gast)


Lesenswert?

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)

von Achim M. (minifloat)


Lesenswert?

Warum meckert eigentlich noch keiner, dass der Link falsch ist?
http://www.recursion.jp/avrcdc/index.html
mfg mf

von vusb-user (Gast)


Lesenswert?

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!

von Potter (Gast)


Lesenswert?

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.

von vusb-user (Gast)


Lesenswert?

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.

von Mars (Gast)


Lesenswert?

Das Schaltend er LEDs wird normalerweise über den Controll-Endpoint 
gemacht.

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.