www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USB-HID Report Descriptor


Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich probier gerade ein USB-HID zu progammieren, ich hab mir auch schon 
die entsprechenden Dokumente von usb.org geholt.
Ich blicke da aber nicht so recht Durch.
Ich wollte die Libarys von http://www.obdev.at/avrusb/ verwenden.
Ich hab jetzt doch mal ein paar Fragen zum USB-HID Reportdescriptor und 
zur Übertragung.

Ist es richtig das im Reportdescriptor beschrieben wird wie die Daten 
sich beim Übertragen zusammensetzen?

Bsp.:

Gamepad mit 24 Buttons...

0x05,0x01      ;Usage_Page (Generic Desktop)
0x09,0x05      ;Usage (Game Pad)
0xA1,0x01      ;Collection (Application)
0x05,0x09      ;Usage_Page (Button)
0x19,0x01      ;Usage_Minimum (Button 1)
0x29,0x18      ;Usage_Maximum (Button 24)
0x15,0x00      ;Logical_Minimum (0)
0x25,0x01      ;Logical_Maximum (1)
0x75,0x01      ;Report_Size (1)
0x95,0x18      ;Report_Count (24)
0x55,0x00      ;Unit_Exponent (0)
0x65,0x00      ;Unit (None)
0x81,0x02      ;Input (Data, Var, Abs)
0xC0                      ;End_Collection

24 Buttons * 1Bit = 3 Bytes

Ist das im Prinzip so das ich jetzt die 24 Bits für die Buttons zu 3 
Bytes zusammenfasse und dann über den Befehl

usbSetInterrupt(reportBuffer, sizeof(reportBuffer));

zum PC rausschicke?

Ich hoffe ich hab mich jetzt nicht allzu Dämlich ausgedrückt.

Aber Vielen Dank schon mal!

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe deinen Descriptor nicht geprüft, aber versuch mal ein einfaches 
Beispiel.
Du kannst mit USB nix schicken, der Host (PC) holt sich die Daten ab. Du 
musst auf die Anfragen reagieren, um das klarzustellen.

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also stellt die Funktion "usbSetInterrupt(reportBuffer, 
sizeof(reportBuffer))" die Daten bereit die sich der PC abholt?

Was wäre so ein einfaches Beispiel? Hast Du da einen Tip oder ein 
Beispiel?

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mit AVR USB noch nicht gearbeitet. Nimm ein einfaches Beispiel, 
zB bei Tastendruck wird was auf dem Bildschirm (PC) geschrieben, wenns 
eine Tastaturemulation ist.
So einfach wie RS232 ist USB leider nicht.

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir keiner ein kleines Beispiel für ein Gamepad mit z.B. einer 
Taste geben, auf das ich dann entsprechend aufbauen kann?
Ich blicke bei den großen Projekten nicht so recht Durch.
Ich möchte nicht jeden Schrit vorgekaut bekommen nur so ein paar Tips 
zum grundsätzlichen Aufbau und Ablauf. In den Dokumenten von usb.org ist 
zwar alles haarklein beschrieben aber Irgendwie bekomme ich die nötigen 
Infos nicht zusammen.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier aus dem EzHID-Projekt der Descriptor für ein SNES-Gamepad:

/* the device descriptor */
static code Byte dev_desc[] = {
   0x12, // bLength             : Length of Descriptor
   0x01, // bDescriptorType     : Descriptor Type = Device
   0x10, // bcdUSB (L)          : USB Specification Version 1.10 (L)
   0x01, // bcdUSB (H)          : USB Specification Version 1.10 (H)
   0x00, // bDeviceClass        : Device Class (0xff is Vendor Specific)
   0x00, // bDeviceSubClass     : Device Sub-Class (0xff is Vendor Specific)
   0x00, // bDeviceProtocol     : Device Protocol (0xff is Vendor Specific)
   0x40, // bMaxPacketSize0     : Maximum Packet Size for EP0
   0xcd, // idVendor (L)        : Vendor ID (L)
   0x06, // idVendor (H)        : Vendor ID (H)
   0x05, // idProduct (L)       : Product ID (L)
   0xc0, // idProduct (H)       : Product ID (H)
   0x00, // bcdDevice (L)       : Device Release Number (BCD,L)
   0x01, // bcdDevice (H)       : Device Release Number (BCD,H)
   0x01, // iManufacturer       : Manufacturer Index String
   0x02, // iProduct            : Product Index String
   0x00, // iSerialNumber       : Serial Number Index String
   0x01  // bNumConfigurations  : Number of Configurations in this Device
};

/* the configuration descriptor */
static code Byte conf_desc[] = {
   0x09, // bLength             : Length of Descriptor
   0x02, // bDescriptorType     : Descriptor Type = Configuration
   0x3b, // wTotalLength (L)    : Total Length (L) including Interface and Endpoint
   0x00, // wTotalLength (H)    : Total Length (H)

   0x02, // bNumInterfaces      : One Interface in this Configuration

   0x01, // bConfigurationValue : Configuration Value Used by Set_Configuration Request
         //                       to Select this Configuration
   0x00, // iConfiguration      : Index of String Describing this Configuration
   0x80, // bmAttributes        : Attributes
   0x32, // MaxPower            : Maximum Power


   /*
    * The interface descriptor for Pad 1
    */
   // Interface 0, alternate setting 0
   0x09, // bLength             : Length of Descriptor
   0x04, // bDescriptorType     : Descriptor Type = Interface
   0x00, // bInterfaceNumber    : Zero-based index of this Interface
   0x00, // bAlternateSetting   : Alternate Setting
   0x01, // bNumEndpoints       : Number of Endpoints in this Interface
   0x03, // bInterfaceClass     : Interface Class
   0x00, // bInterfaceSubClass  : Interface Sub-Class (boot interface)
   0x00, // bInterfaceProtocol  : Interface Protocol (keyboard)
   0x03, // iInterface          : Index to String Descriptor for this Interface
   
   // HID Descriptor
   0x09, // bLength             : Length of Descriptor
   0x21, // bDescriptorType     : Descriptor Type = HID
   0x00, // bcdHID (L)          : HID Class Specification release number (L)
   0x01, // bcdHID (H)          : HID Class Specification release number (H)
   0x00, // bCountryCode        : Hardware target country = not specific
   0x01, // bNumDescriptors     : Number of HID class descriptors to follow
   0x22, // bDescriptorType     : Report descriptor type
   0x36, // wDescriptorLength(L): Total length of Report descriptor (L)
   0x00, // wDescriptorLength(H): Total length of Report descriptor (H)
   
   // Endpoint Descriptor
   0x07, // bLength             : Length of Descriptor
   0x05, // bDescriptorType     : Descriptor Type = Endpoint
   0x81, // bEndpointAddress    : Endpoint Address
   0x03, // bmAttributes        : Endpoint Attributes = INT
   0x02, // wMaxPacketSize (L)  : Maximum Packet Size (L)
   0x00, // wMaxPacketSize (H)  : Maximum Packet Size (H)
   0x0a, // bInterval           : Polling intervall in Milliseconds


   /*
    * The interface descriptor for Pad 2
    */
   // Interface 1, alternate setting 0
   0x09, // bLength             : Length of Descriptor
   0x04, // bDescriptorType     : Descriptor Type = Interface
   0x01, // bInterfaceNumber    : Zero-based index of this Interface
   0x00, // bAlternateSetting   : Alternate Setting
   0x01, // bNumEndpoints       : Number of Endpoints in this Interface
   0x03, // bInterfaceClass     : Interface Class
   0x00, // bInterfaceSubClass  : Interface Sub-Class (boot interface)
   0x00, // bInterfaceProtocol  : Interface Protocol (keyboard)
   0x03, // iInterface          : Index to String Descriptor for this Interface
   
   // HID Descriptor
   0x09, // bLength             : Length of Descriptor
   0x21, // bDescriptorType     : Descriptor Type = HID
   0x00, // bcdHID (L)          : HID Class Specification release number (L)
   0x01, // bcdHID (H)          : HID Class Specification release number (H)
   0x00, // bCountryCode        : Hardware target country = not specific
   0x01, // bNumDescriptors     : Number of HID class descriptors to follow
   0x22, // bDescriptorType     : Report descriptor type
   0x36, // wDescriptorLength(L): Total length of Report descriptor (L)
   0x00, // wDescriptorLength(H): Total length of Report descriptor (H)
   
   // Endpoint Descriptor
   0x07, // bLength             : Length of Descriptor
   0x05, // bDescriptorType     : Descriptor Type = Endpoint
   0x82, // bEndpointAddress    : Endpoint Address
   0x03, // bmAttributes        : Endpoint Attributes = INT
   0x02, // wMaxPacketSize (L)  : Maximum Packet Size (L)
   0x00, // wMaxPacketSize (H)  : Maximum Packet Size (H)
   0x0a  // bInterval           : Polling intervall in Milliseconds
};


/* The Pad Report Descriptor */
static code Byte report_desc_pad[] = {
   0x05, 0x01, // Usage Page (Generic, Desktop),
   0x09, 0x05, // Usage (Game Pad),
   0xa1, 0x01, // Collection (Application),

   /* Pointer */
   0x09, 0x01, //   Usage (Pointer),
   0xa1, 0x00, //   Collection (Physical),
   0x09, 0x30, //     Usage (X),
   0x09, 0x31, //     Usage (Y),
   0x15, 0xff, //     Logical Minimum (-1),
   0x25, 0x01, //     Logical Maximum (+1),
   0x95, 0x02, //     Report Count (2),
   0x75, 0x02, //     Report Size (2),
   0x81, 0x02, //     Input (Data, Variable, Absolute, No Null),
   0xc0,       //   End Collection,

   /* Padding */
   0x95, 0x04, //   Report Count (4),
   0x75, 0x01, //   Report Size (1),
   0x81, 0x03, //   Input (Constant, Variable, Absolute),

   /* 8 Buttons */
   0x05, 0x09, //   Usage Page (Buttons),
   0x19, 0x01, //   Usage Minimum (Button 1),
   0x29, 0x08, //   Usage Maximum (Button 8),
   0x15, 0x00, //   Logical Minimum (0),
   0x25, 0x01, //   Logical Maximum (1),
   0x95, 0x08, //   Report Count (8),
   0x75, 0x01, //   Report Size (1),
   0x81, 0x02, //   Input (Data, Variable, Absolute, No Null),

   0xc0        // End Collection
};


Autor: Guido Körber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiele für Descriptoren stehen auch in der USB HID Spec.

Autor: Potter68 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal bei obdev auf der Seite. Da sollte das passende Beispiel für 
Dich dabei sein.

Gruss Potter68

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ist zwar schon ein Paar Tage her, aber jetzt habe ich wieder ein bischen 
Zeit mich mit der Thematik USB-HID auseinanderzusetzen.
Mittlerweile habe ich mir auch eine kleine Platine mit Atmega8 und der 
Notwendigen Beschaltung für USB erstellt.
Getestet hab ich die Schaltun mit HID-Keys von der Obdev-Seite.
Also die Hardware zu testen setht bereits.
Nach einigem erfolglosem rumbasteln habe ich jetzt verschiedene Fragen:

- Kann man ein Gamepad Reportdescriptor mit nur 8 Buttons und sonst 
keinen Steuerelementen erstellen der unter Windows funktioniert? (also 
Ohne Steuerkreuz)

z.B.
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x05,                    // USAGE (Game Pad)
    0xA1, 0x01,                    // Collection (Application)
    0x05, 0x09,                    // USAGE_PAGE (Button)
    0x19, 0x01,                    // USAGE_MINIMUM (Button 1)
    0x29, 0x08,                    // USAGE_MAXIMUM (Button 8)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x25, 0x01,                    // LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    // REPORT_SIZE (1)
    0x95, 0x08,                    // REPORT_COUNT (8)
    0x55, 0x00,                    // Unit_Exponent (0)
    0x65, 0x00,                    // Unit (None)
    0x81, 0x02,                    // INPUT (Data,Var,Abs)
    0xc0                           // END_COLLECTION

- Kann mir Jemand den Unterschied zwischen Report_Size und Report_Count 
erklären?

- Gibt es ein beispiel für ein Gampad USB-HID in C mit Atmega8? (Ich 
habe bisher nur Assembler Beispiele gefunden.)

- Gibt es Tools um einen Reportdescriptor zu Überprüfen. (ausser HID 
Descriptor Tool (DT))

- Würde es reichen z.B in HID.Keys erstmal den report Descriptor zu 
ändern das Windows das entsprechende Gerät erkennt.
Ddas da natürlich nichts an Daten ankommt ist mir klar das wäre dann 
Step2.

Viele Viele Fragen.
Ich Hoffe mir kann jemand Helfen.

Vielen Dank schonmal.

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es eigentlich eine USB-HID Dokumentation in Deutsch?

Autor: Sascha Dürkes (plutoonline)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat den niemand einen Tip?

Autor: Potter68 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

lies das Buch von Jan Axelson. Das ist eine sehr ausführliche 
Rundum-Einführung in USB.

Gruß Potter68

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.