2017-04-30 5 views
0

Mein USB-Gerät verfügt über eine HID Class-Schnittstelle.Multi-Top-Level-HID-Sammlung in USB ... Ist es möglich, 2 Berichte gleichzeitig an den Host zu liefern?

Ich habe derzeit in meinem Bericht Deskriptor 2 Geräte definiert: eine Maus (Bericht ID == 1) und eine Tastatur (Bericht ID == 2).

Ich habe den HID-Abfragezeitraum auf 100ms eingestellt.

Um den Host zu informieren, ich Daten Tastatur oder Maus bin das Senden, muss ich die vorausgehen Daten mit dem Report-ID, wie in:

//Mouse data for the host 
0x01 //report ID for mouse 
0x0n //buttons 
0xnn //delta X 
0xnn //delta y 

Also, ich bin, wo eine Situation mit Blick auf I kann den Host nur jeweils über eines dieser Geräte aktualisieren.

Meine Frage ist: Gibt es eine Möglichkeit, beide Berichte (Maus und Tastatur) gleichzeitig zu senden?

Wenn nicht, wäre eine Verdoppelung der Abfragehäufigkeit und der Wechsel zwischen beiden Geräten eine angemessene Lösung?

Antwort

0

Zwei verschiedene Berichte werden immer nacheinander gemeldet, da beide die gleiche Interrupt-Pipe verwenden, um durchzukommen.

Wenn Sie jetzt keine Bootprotokoll-Tastatur- und -Mausberichte benötigen, können Sie einen benutzerdefinierten Berichtsdeskriptor entwerfen, der einen einzelnen Bericht mit sowohl Maus- als auch Tastaturdaten beschreibt. Auf diese Weise können Sie beide Datensätze synchron senden.

Mit einem niedrigeren Abfrageintervall wird es jedoch einfacher.

Beispielbericht Deskriptors:

0x05, 0x01,     // UsagePage (desktop) 
0x09, 0x06,     // Usage (Keyboard) 
0xa1, 0x01,     // Collection (Application) 
0x85, 0x01,     //  ReportID (1) 
0x25, 0x01,     //  LogicalMaximum (1) 
0x75, 0x01,     //  ReportSize (1) 
0x95, 0x08,     //  ReportCount (8) 
0x05, 0x07,     //  UsagePage (keyboard) 
0x19, 0xe0,     //  UsageMinimum (LeftControl) 
0x29, 0xe7,     //  UsageMaximum (RightGui) 
0x81, 0x02,     //  Input (Variable) 
0x26, 0xdd, 0x00,    //  LogicalMaximum (221) 
0x75, 0x08,     //  ReportSize (8) 
0x95, 0x06,     //  ReportCount (6) 
0x19, 0x00,     //  UsageMinimum (NoEvent) 
0x29, 0xdd,     //  UsageMaximum (KeypadHexadecimal) 
0x81, 0x00,     //  Input 
0x25, 0x01,     //  LogicalMaximum (1) 
0x75, 0x01,     //  ReportSize (1) 
0x95, 0x03,     //  ReportCount (3) 
0x05, 0x08,     //  UsagePage (led) 
0x19, 0x01,     //  UsageMinimum (NumLock) 
0x29, 0x03,     //  UsageMaximum (ScrollLock) 
0x91, 0x02,     //  Output (Variable) 
0x15, 0x81,     //  LogicalMinimum (-127) 
0x25, 0x7f,     //  LogicalMaximum (127) 
0x75, 0x08,     //  ReportSize (8) 
0x95, 0x02,     //  ReportCount (2) 
0x05, 0x01,     //  UsagePage (desktop) 
0x09, 0x30,     //  Usage (X) 
0x09, 0x31,     //  Usage (Y) 
0x81, 0x04,     //  Input (Relative) 
0x15, 0x00,     //  LogicalMinimum (0) 
0x25, 0x01,     //  LogicalMaximum (1) 
0x75, 0x01,     //  ReportSize (1) 
0x95, 0x03,     //  ReportCount (3) 
0x05, 0x09,     //  UsagePage (button) 
0x19, 0x01,     //  UsageMinimum (Button(1)) 
0x29, 0x03,     //  UsageMaximum (Button(3)) 
0x81, 0x02,     //  Input (Variable) 
0xc0,       // EndCollection 

Dies beschreibt:

  • einen Eingangs Report # 1, enthaltend:

    Data Byte : [0  ][1 .. 6][7  ][8  ][9   ] 
    Data  : [Modifiers][Keys ][Mouse dx][Mouse dy][Mouse Btns] 
    
  • ein Ausgangsbericht # 1, enthaltend:

    Data Byte : [0  ] 
    Data  : [Kbd leds] 
    
+0

Ich dachte, der Host würde ein HID-Mausgerät nicht laden, es sei denn, ich erstellte speziell eine Top-Level-Sammlung mit dem Feld "Verwendung" als "Maus" definiert. Ich werde Ihre Lösung versuchen und Sie wissen lassen, ob es funktioniert. Vielen Dank! – ismarlowe

Verwandte Themen