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 };
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"?
Peter schrieb: > 0x09, 0x00, // USAGE (NC) > > // neue 8 Befehle Das ist sicher eine Endekennung oder sowas in der Richtung. Kommentiere das mal aus. fchk
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.
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 ...
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.
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).
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.
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?
Wie ganz oben schon angemerkt kann das auch woanders liegen. Vielleicht postest du mal mehr Code.
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.
Ich glaube, Du hast die wItemlength im HID Class Descriptor vergessen anzupassen. Die gibt die Länge des HID Report Deskriptors an.
Oh, da könntest Du recht haben 0x24 == 36 das war die alte Länge. Werde ich heute Abend testen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.