HID Fehler im Code

Gast #3254436
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
};
Moderator (Firma: Titel) Persönliche Seite #3254449
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"?
Gast #3254666
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.
#3254674
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 ...
Gast #3254692
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.
Gast #3254716
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).
Gast #3254732
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.
Gast #3255774
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?
Gast #3255821
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.
Gast #3256673
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren