Forum: Mikrocontroller und Digitale Elektronik HID Fehler im Code


von Peter (Gast)


Lesenswert?

Hallo,

ich versuche ein HID Multimedia Keyboard (VUSB) gerade um einige Tasten 
zu erweitern und nun geht nichts mehr.

Hatte bis jetzt 8 Tasten dran und nun sollen es mehr werden.

Brauche da echt etwas Hilfe.

Peter


Hier ist mal der Code:

  /* Standard HID class Interface descriptor */
     0x09, /* 0 bLength : Size of this descriptor, in bytes. */
     0x04, /* 1 bDescriptorType : INTERFACE descriptor */
     (7), /* 2 bInterfaceNumber : Index of this interface. */
     0x00,   /* 3 bAlternateSetting : Index of this setting.  */
     0x01,   /* 4 bNumEndpoints : 0 endpoints.  */
     0x03,   /* 5 bInterfaceClass : HID. */
     0x00,  /* 6 bInterfaceSubclass :  */
     0x00,   /* 7 bInterfaceProtocol : Unused. */
     0x00,   /* 8 iInterface : Unused. (field size 1 bytes) */

  /* class_descriptor hid   unbekannt ?*/
     0x09,   /* 0 bLength : Size of this descriptor, in bytes. */
     0x21,       /* 1 bDescriptorType : */
     0x00,0x01,  /* 2 bcdHID */
     0x00,       /* 4 Country Code */
     0x01,       /* 5 bNumDescriptors */
     0x22,       /* 6 bDescriptorTyp */
     0x24, 0x00,  /* 7 wItemlength */

    /* Endpoint Descriptor ( */
    0x07, /* 0  bLength: 7 */
    ENDPOINT, /* 1  bDescriptorType: ENDPOINT */
    0x85,     /* 2  bEndpointAddress (D7: 0:out, 1:in) */
    0x03,   /* 3  bmAttributes (bitmap)  */
//    1,0,    /* 4  wMaxPacketSize     */
    2,0,    /* 4  wMaxPacketSize     2 Byte ist doch richtig oder ? */
    0x0A,   /* 6  bInterval */







static unsigned char hidReportDescriptor[] =
{
   0x05, 0x0c,        // USAGE_PAGE (Consumer Devices)
   0x09, 0x01,        // USAGE (Consumer Control)
   0xA1, 0x01,        // COLLECTION (Application)
   0x15, 0x00,        //   LOGICAL_MINIMUM (0)
   0x25, 0x01,        //   LOGICAL_MAXIMUM (1)
   0x05, 0x0C,        //   USAGE_PAGE (Consumer Devices)
   0x09, 0xE2,        //   USAGE (Mute)
   0x09, 0xB3,        //   USAGE (Fast Forward)
   0x09, 0xB4,        //   USAGE (Rewind)
   0x09, 0xB5,        //   USAGE (Scan Next Track)
   0x09, 0xB6,        //   USAGE (Scan Previous Track)
   0x09, 0xB7,        //   USAGE (Stop)
   0x09, 0xCD,        //   USAGE (Play / Pause)
   0x09, 0x00,        //   USAGE (NC)

// neue 8 Befehle
   0x09, 0xB0,        //   USAGE (Play)
   0x09, 0xB1,        //   USAGE (Pause)
   0x09, 0xE9,        //   USAGE (Volume Up)
   0x09, 0xEA,        //   USAGE (Volume Down)
   0x09, 0xB2,        //   USAGE (Record)
   0x09, 0xBC,        //   USAGE (Repeat)
   0x09, 0xB9,        //   USAGE (Random Play)
   0x09, 0x00,        //   USAGE (NC)

//   0x95, 0x08,        //   REPORT_COUNT (8)
//   0x75, 0x01,        //   REPORT_SIZE (1)
   0x95, 0x10,        //   REPORT_COUNT (16)
   0x75, 0x02,        //   REPORT_SIZE (2)

   0x81, 0x42,        //   INPUT (Data,Var,Abs,Null)
   0xC0               // END_COLLECTION
};

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> Brauche da echt etwas Hilfe.
Der Fehler ist mit hoher Wahrscheinlichkeit nicht im geposteten 
Codeabschnitt.

> ich versuche ein HID Multimedia Keyboard (VUSB) gerade um einige Tasten
> zu erweitern und nun geht nichts mehr.
Was passiert, wenn du deine Änderugen rückgängig machst?
Was hast du geändert?
Was bedeutet "nichts mehr"?

von Frank K. (fchk)


Lesenswert?

Peter schrieb:

>    0x09, 0x00,        //   USAGE (NC)
>
> // neue 8 Befehle

Das ist sicher eine Endekennung oder sowas in der Richtung. Kommentiere 
das mal aus.

fchk

von Peter (Gast)


Lesenswert?

Wenn ich alles wieder zurück baue funktioniert es.

Gut es fehlt noch der Code wo ich sende.
Jetzt sende ich 2 Byte und vorher habe ich ein Byte gesendet.

Mehr Unterschiede gibt es nicht!


USAGE (NC) soll laut USB HID Info nur nicht belegt bedeuten.


Nichts mehr bedeutet das Windows die HID Schnittstelle als fehlerhaft 
kennzeichnet und sie somit nicht arbeitet.

von Wolfgang H. (frickelkram)


Lesenswert?

Hi Peter,

hast Du den HID-Descriptor erweitert weil Du Tasten hinzu gefügt hast? 
Normalerweise musst Du das nicht tun. Es genügt andere Keycodes zu 
schicken.
Es sei denn Du jast kein USB-Keyboard sondern einen Joystick. Beim 
Joystick gibst Du die Anzahl der Tasten an, die wertest Du dann aber 
nicht als Tatstur aus sondern als einzelne Knöpfe über einen 
Gamecontroller.

Wenn Du aber tatsächlich eine Tastatur hast, dann stelle den alten 
HID-Descriptor wieder her.

Arbeitest Du unter Linux oder Windows? Wenn Du unter Linux arbeitest 
kannst Du einfach mal mit "lsusb" nach dem Gerät suchen um zu sehen wie 
es erkannt wird. Im USB-HID Code werden immer mal wieder USB-IDS 
aufgenommen, mit denen es Probleme gibt. Diese werden dann unter 
Umständen ignoriert.

Wenn Du also die USB-ID unglücklicher Weise auf eine solche, 
geblacklistete ID, gesetzt hast, wirst Du ebenfalls Probleme haben.
Ein Beispiel ist die V-MAME-Panel ID, welche seit Kernel 3.9.x nicht 
mehr als HID-Device erkannt wird. Irgendein FM-Radioadapter nutzt die 
selbe ID und der ist geblacklistet ... es kann einen MOment dauern das 
Problem zu erkennen ...

von Peter (Gast)


Lesenswert?

Ja ich habe 8 Tasten neu dazu gebaut und ich arbeite unter Windows.


Ich habe ein "Consumer Control" also nicht wirklich ein Keyboard.

Diese Tasten waren bis jetzt direkt einem Bit zugeordnet.
Nun habe ich weiter 8 Tasten / Bit und wollte die entsprechend senden.
Das geht ja Aufgrund eines Fehler nicht, den suche ich ja.

Wenn man das auch eleganter lösen kann dann bin ich da ganz offen für 
Informationen.

von schwarzGast (Gast)


Lesenswert?

Peter schrieb:
> //   0x95, 0x08,        //   REPORT_COUNT (8)
> //   0x75, 0x01,        //   REPORT_SIZE (1)
>    0x95, 0x10,        //   REPORT_COUNT (16)
>    0x75, 0x02,        //   REPORT_SIZE (2)

Die REPORT_SIZE muss 1 bleiben. Vorher sind es 8*1 Bits, jetzt sind es 
16*1 Bits und nicht 16*2 Bits.

REPORT_SIZE gibt die Länge eines einzelnen Reports an, REPORT_COUNT die 
Anzahl der einzelnen Reports (ein Report pro Usage).

von Peter (Gast)


Lesenswert?

Aber senden muss ich dann 2 Byte oder?

Und wieder was gelernt.

von schwarzGast (Gast)


Lesenswert?

Genau. Der USB-Host muss nur wissen, wieviel er bekommt und wie er die 
Daten zuordnen muss.

Die Deskriptoren habe ich nicht durchgesehen, aber bis auf die Länge des 
Reports solle sich nichts ändern.

von Peter (Gast)


Lesenswert?

Und wenn das immer noch nicht geht?

Ich habe nun etliches probiert aber nichts scheint richtig zu sein.

Zur Sicherheit habe ich auch der senden der Befehle deaktiviert.
Aber auch das bringt nichts.


Kann mir da jemand helfen?

Gibt nicht eine Bessere Methode diese Befehle an den PC zu senden?
Kann man nicht dieses sende universal machen und anstatt einen 
Bit-Codierten Befehl den entsprechenden Tasten-Befehl senden?

von Micha (Gast)


Lesenswert?

Wie ganz oben schon angemerkt kann das auch woanders liegen. Vielleicht 
postest du mal mehr Code.

von Peter (Gast)


Lesenswert?

Immer diese "Gibt alles dann kann man dir helfen" Antworten.
Die helfen nicht und nerven mich ehrlich gesagt!
Weil diese Aussage immer kommt wenn ich hier eine Frage habe und das 
sogar bei Fragen wo es überhaupt keine Software gibt.

Der Fehler kann nur in den beiden Tabellen liegen, soviel verstehe ich 
dann schon von den USB Sachen.

Noch mal zur Erklärung:
Alles geht solange ich nur 1 Byte (8 Befehle) nehme.
Wenn ich es erweitere erkennt Windows mein Gerät nicht mehr, weil 
vielleicht der descriptor oder der Endpoint einen Fehler hat.

von Jim M. (turboj)


Lesenswert?

Ich glaube, Du hast die wItemlength im HID Class Descriptor vergessen 
anzupassen. Die gibt die Länge des HID Report Deskriptors an.

von Peter (Gast)


Lesenswert?

Oh, da könntest Du recht haben 0x24 == 36 das war die alte Länge.

Werde ich heute Abend testen.

von Peter (Gast)


Lesenswert?

So dann muss ich mal Danke sagen.

wItemlength  und  REPORT_SIZE  waren meine Fehler.

Es geht nun alles wieder, jetzt halt mit 16 Tasten.


Noch mal Danke,
Peter

PS:
Wenn es aber doch zufällig eine Bessere Methode gibt,
wurde ich mein Programm noch mal anpassen.

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.