]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Fixed Linux NKRO bitmap bug.
authorJacob Alexander <haata@kiibohd.com>
Thu, 2 Oct 2014 08:40:14 +0000 (01:40 -0700)
committerJacob Alexander <haata@kiibohd.com>
Thu, 2 Oct 2014 08:40:14 +0000 (01:40 -0700)
- Thanks hasu for pointing it out
- Keycode 50 is problematic under Linux, so removing (it's a duplicate keycode anyways)

Output/pjrcUSB/arm/usb_desc.c
Output/pjrcUSB/arm/usb_keyboard.c
Output/pjrcUSB/avr/usb_keyboard_serial.c
Output/pjrcUSB/avr/usb_keyboard_serial.h
Output/pjrcUSB/output_com.c
Output/pjrcUSB/output_com.h

index 2549ce9b91ceaddb593e62028ae87f99b51603dd..e5d8af5775070fbde88484c0eeba34f591eb7a3c 100644 (file)
@@ -186,14 +186,16 @@ static uint8_t nkro_keyboard_report_desc[] = {
        // See http://www.usb.org/developers/hidpage/Hut1_12v2.pdf Chapter 10
        // Or Macros/PartialMap/usb_hid.h
        //
+       // 50 must be excluded due to a Linux bug with bitmaps (not useful anyways)
        // 165-175 are reserved/unused as well as 222-223 and 232-65535
        // 224-231 are used for modifiers (see above)
        //
        // Packing of bitmaps are as follows:
-       //   4-164 : 20 bytes + 1 Report ID byte (0x04-0xA4)
-       // 176-221 :  6 bytes + 1 Report ID byte (0xB0-0xDD) (45 bits + 3 padding bits for 6 bytes total)
+       //   4-49  :  6 bytes + 1 Report ID byte (0x04-0x31) ( 46 bits + 2 padding bits for 6 bytes total)
+       //  51-164 : 20 bytes + 1 Report ID byte (0x33-0xA4) (114 bits + 6 padding bits for 15 bytes total)
+       // 176-221 :  6 bytes + 1 Report ID byte (0xB0-0xDD) ( 46 bits + 2 padding bits for 6 bytes total)
        //
-       // 4-164 (20 bytes/160 bits)
+       // 4-49 (6 bytes/46 bits)
         0x85, 0x03,          //   Report ID (3),
         0x75, 0x01,          //   Report Size (1),
         0x95, 0xA0,          //   Report Count (160),
@@ -201,12 +203,33 @@ static uint8_t nkro_keyboard_report_desc[] = {
         0x25, 0x01,          //   Logical Maximum (1),
         0x05, 0x07,          //   Usage Page (Key Codes),
         0x19, 0x04,          //   Usage Minimum (4),
-        0x29, 0xA4,          //   Usage Maximum (164),
+        0x29, 0x31,          //   Usage Maximum (49),
         0x81, 0x02,          //   Input (Data, Variable, Absolute, Bitfield),
 
-       // 176-221 (45 bits)
+       // Padding (2 bits)
+        0x75, 0x02,          //   Report Size (2),
+        0x95, 0x01,          //   Report Count (1),
+        0x81, 0x03,          //   Input (Constant),
+
+       // 51-164 (15 bytes/160 bits)
         0x85, 0x04,          //   Report ID (4),
         0x75, 0x01,          //   Report Size (1),
+        0x95, 0xA0,          //   Report Count (160),
+        0x15, 0x00,          //   Logical Minimum (0),
+        0x25, 0x01,          //   Logical Maximum (1),
+        0x05, 0x07,          //   Usage Page (Key Codes),
+        0x19, 0x33,          //   Usage Minimum (51),
+        0x29, 0xA4,          //   Usage Maximum (164),
+        0x81, 0x02,          //   Input (Data, Variable, Absolute, Bitfield),
+
+       // Padding (6 bits)
+        0x75, 0x06,          //   Report Size (6),
+        0x95, 0x01,          //   Report Count (1),
+        0x81, 0x03,          //   Input (Constant),
+
+       // 176-221 (6 bytes/46 bits)
+        0x85, 0x05,          //   Report ID (5),
+        0x75, 0x01,          //   Report Size (1),
         0x95, 0x2D,          //   Report Count (45),
         0x15, 0x00,          //   Logical Minimum (0),
         0x25, 0x01,          //   Logical Maximum (1),
@@ -215,8 +238,8 @@ static uint8_t nkro_keyboard_report_desc[] = {
         0x29, 0xDD,          //   Usage Maximum (221),
         0x81, 0x02,          //   Input (Data, Variable, Absolute, Bitfield),
 
-       // 176-221 Padding (3 bits)
-        0x75, 0x03,          //   Report Size (3),
+       // Padding (2 bits)
+        0x75, 0x02,          //   Report Size (2),
         0x95, 0x01,          //   Report Count (1),
         0x81, 0x03,          //   Input (Constant),
         0xc0,                // End Collection - Keyboard
@@ -229,7 +252,7 @@ static uint8_t nkro_keyboard_report_desc[] = {
         0x05, 0x01,          // Usage Page (Generic Desktop),
         0x09, 0x80,          // Usage (System Control),
         0xA1, 0x01,          // Collection (Application),
-        0x85, 0x05,          //   Report ID (5),
+        0x85, 0x06,          //   Report ID (6),
         0x75, 0x08,          //   Report Size (8),
         0x95, 0x01,          //   Report Count (1),
         0x16, 0x81, 0x00,    //   Logical Minimum (129),
@@ -247,7 +270,7 @@ static uint8_t nkro_keyboard_report_desc[] = {
         0x05, 0x0c,          // Usage Page (Consumer),
         0x09, 0x01,          // Usage (Consumer Control),
         0xA1, 0x01,          // Collection (Application),
-        0x85, 0x06,          //   Report ID (6),
+        0x85, 0x07,          //   Report ID (7),
         0x75, 0x10,          //   Report Size (16),
         0x95, 0x01,          //   Report Count (1),
         0x16, 0x20, 0x00,    //   Logical Minimum (32),
index a5fc2559e4d1e1e814c6d78097c211b8178b384a..7e435cd22eb3aa073002ca5ba33baa901aa9322e 100644 (file)
@@ -149,9 +149,9 @@ void usb_keyboard_send()
                {
                        *tx_buf++ = 0x03; // ID
 
-                       // 4-164 (first 20 bytes)
-                       memcpy( tx_buf, USBKeys_Keys, 20 );
-                       tx_packet->len = 21;
+                       // 4-49 (first 6 bytes)
+                       memcpy( tx_buf, USBKeys_Keys, 6 );
+                       tx_packet->len = 7;
 
                        // Send USB Packet
                        usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
@@ -162,18 +162,31 @@ void usb_keyboard_send()
                {
                        *tx_buf++ = 0x04; // ID
 
+                       // 51-164 (Middle 15 bytes)
+                       memcpy( tx_buf, USBKeys_Keys + 6, 15 );
+                       tx_packet->len = 16;
+
+                       // Send USB Packet
+                       usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
+                       USBKeys_Changed &= ~USBKeyChangeState_SecondaryKeys; // Mark sent
+               }
+               // Check tertiary key section
+               else if ( USBKeys_Changed & USBKeyChangeState_TertiaryKeys )
+               {
+                       *tx_buf++ = 0x05; // ID
+
                        // 176-221 (last 6 bytes)
-                       memcpy( tx_buf, USBKeys_Keys + 20, 6 );
+                       memcpy( tx_buf, USBKeys_Keys + 21, 6 );
                        tx_packet->len = 7;
 
                        // Send USB Packet
                        usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet );
-                       USBKeys_Changed &= ~USBKeyChangeState_SecondaryKeys; // Mark sent
+                       USBKeys_Changed &= ~USBKeyChangeState_TertiaryKeys; // Mark sent
                }
                // Check system control keys
                else if ( USBKeys_Changed & USBKeyChangeState_System )
                {
-                       *tx_buf++ = 0x05; // ID
+                       *tx_buf++ = 0x06; // ID
                        *tx_buf   = USBKeys_SysCtrl;
                        tx_packet->len = 2;
 
@@ -184,7 +197,7 @@ void usb_keyboard_send()
                // Check consumer control keys
                else if ( USBKeys_Changed & USBKeyChangeState_Consumer )
                {
-                       *tx_buf++ = 0x06; // ID
+                       *tx_buf++ = 0x07; // ID
                        *tx_buf++ = (uint8_t)(USBKeys_ConsCtrl & 0x00FF);
                        *tx_buf   = (uint8_t)(USBKeys_ConsCtrl >> 8);
                        tx_packet->len = 3;
index 63a8f7288cb51e9a35f71a9f9a08671c0780c830..9c2324ee3437e6722556e11de9e70ae0cb0d30c2 100644 (file)
@@ -118,8 +118,8 @@ inline void usb_keyboard_send()
                {
                        UEDATX = 0x03; // ID
 
-                       // 4-164 (first 20 bytes)
-                       for ( uint8_t byte = 0; byte < 20; byte++ )
+                       // 4-49 (first 6 bytes)
+                       for ( uint8_t byte = 0; byte < 6; byte++ )
                                UEDATX = USBKeys_Keys[ byte ];
 
                        UEINTX = 0; // Finished with ID
@@ -131,18 +131,31 @@ inline void usb_keyboard_send()
                {
                        UEDATX = 0x04; // ID
 
-                       // 176-221 (last 6 bytes)
-                       for ( uint8_t byte = 20; byte < 26; byte++ )
+                       // 51-164 (Middle 15 bytes)
+                       for ( uint8_t byte = 6; byte < 21; byte++ )
                                UEDATX = USBKeys_Keys[ byte ];
 
                        UEINTX = 0; // Finished with ID
 
                        USBKeys_Changed &= ~USBKeyChangeState_SecondaryKeys; // Mark sent
                }
+               // Check tertiary key section
+               else if ( USBKeys_Changed & USBKeyChangeState_TertiaryKeys )
+               {
+                       UEDATX = 0x05; // ID
+
+                       // 176-221 (last 6 bytes)
+                       for ( uint8_t byte = 21; byte < 27; byte++ )
+                               UEDATX = USBKeys_Keys[ byte ];
+
+                       UEINTX = 0; // Finished with ID
+
+                       USBKeys_Changed &= ~USBKeyChangeState_TertiaryKeys; // Mark sent
+               }
                // Check system control keys
                else if ( USBKeys_Changed & USBKeyChangeState_System )
                {
-                       UEDATX = 0x05; // ID
+                       UEDATX = 0x06; // ID
                        UEDATX = USBKeys_SysCtrl;
                        UEINTX = 0; // Finished with ID
 
@@ -151,7 +164,7 @@ inline void usb_keyboard_send()
                // Check consumer control keys
                else if ( USBKeys_Changed & USBKeyChangeState_Consumer )
                {
-                       UEDATX = 0x06; // ID
+                       UEDATX = 0x07; // ID
                        UEDATX = (uint8_t)(USBKeys_ConsCtrl & 0x00FF);
                        UEDATX = (uint8_t)(USBKeys_ConsCtrl >> 8);
                        UEINTX = 0; // Finished with ID
index aac7c7d30516117febb8dd63d7b11d93c25a8667..6dc727fb74fcb00da4148c6ecfb63683baa0c235 100644 (file)
@@ -370,14 +370,16 @@ static const uint8_t PROGMEM keyboard_nkro_hid_report_desc[] = {
        // See http://www.usb.org/developers/hidpage/Hut1_12v2.pdf Chapter 10
        // Or Macros/PartialMap/usb_hid.h
        //
+       // 50 must be excluded due to a Linux bug with bitmaps (not useful anyways)
        // 165-175 are reserved/unused as well as 222-223 and 232-65535
        // 224-231 are used for modifiers (see above)
        //
        // Packing of bitmaps are as follows:
-       //   4-164 : 20 bytes + 1 Report ID byte (0x04-0xA4)
-       // 176-221 :  6 bytes + 1 Report ID byte (0xB0-0xDD) (45 bits + 3 padding bits for 6 bytes total)
+       //   4-49  :  6 bytes + 1 Report ID byte (0x04-0x31) ( 46 bits + 2 padding bits for 6 bytes total)
+       //  51-164 : 20 bytes + 1 Report ID byte (0x33-0xA4) (114 bits + 6 padding bits for 15 bytes total)
+       // 176-221 :  6 bytes + 1 Report ID byte (0xB0-0xDD) ( 46 bits + 2 padding bits for 6 bytes total)
        //
-       // 4-164 (20 bytes/160 bits)
+       // 4-49 (6 bytes/46 bits)
         0x85, 0x03,          //   Report ID (3),
         0x75, 0x01,          //   Report Size (1),
         0x95, 0xA0,          //   Report Count (160),
@@ -385,12 +387,33 @@ static const uint8_t PROGMEM keyboard_nkro_hid_report_desc[] = {
         0x25, 0x01,          //   Logical Maximum (1),
         0x05, 0x07,          //   Usage Page (Key Codes),
         0x19, 0x04,          //   Usage Minimum (4),
-        0x29, 0xA4,          //   Usage Maximum (164),
+        0x29, 0x31,          //   Usage Maximum (49),
         0x81, 0x02,          //   Input (Data, Variable, Absolute, Bitfield),
 
-       // 176-221 (45 bits)
+       // Padding (2 bits)
+        0x75, 0x02,          //   Report Size (2),
+        0x95, 0x01,          //   Report Count (1),
+        0x81, 0x03,          //   Input (Constant),
+
+       // 51-164 (15 bytes/160 bits)
         0x85, 0x04,          //   Report ID (4),
         0x75, 0x01,          //   Report Size (1),
+        0x95, 0xA0,          //   Report Count (160),
+        0x15, 0x00,          //   Logical Minimum (0),
+        0x25, 0x01,          //   Logical Maximum (1),
+        0x05, 0x07,          //   Usage Page (Key Codes),
+        0x19, 0x33,          //   Usage Minimum (51),
+        0x29, 0xA4,          //   Usage Maximum (164),
+        0x81, 0x02,          //   Input (Data, Variable, Absolute, Bitfield),
+
+       // Padding (6 bits)
+        0x75, 0x06,          //   Report Size (6),
+        0x95, 0x01,          //   Report Count (1),
+        0x81, 0x03,          //   Input (Constant),
+
+       // 176-221 (6 bytes/46 bits)
+        0x85, 0x05,          //   Report ID (5),
+        0x75, 0x01,          //   Report Size (1),
         0x95, 0x2D,          //   Report Count (45),
         0x15, 0x00,          //   Logical Minimum (0),
         0x25, 0x01,          //   Logical Maximum (1),
@@ -399,8 +422,8 @@ static const uint8_t PROGMEM keyboard_nkro_hid_report_desc[] = {
         0x29, 0xDD,          //   Usage Maximum (221),
         0x81, 0x02,          //   Input (Data, Variable, Absolute, Bitfield),
 
-       // 176-221 Padding (3 bits)
-        0x75, 0x03,          //   Report Size (3),
+       // Padding (2 bits)
+        0x75, 0x02,          //   Report Size (2),
         0x95, 0x01,          //   Report Count (1),
         0x81, 0x03,          //   Input (Constant),
         0xc0,                // End Collection - Keyboard
index e29cd30b230077935d1e7146274b4180db711d15..cb85fcddfd6eb7e6b1db108c09d31a88364557fd 100644 (file)
@@ -281,9 +281,10 @@ void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a
        // Depending on which mode the keyboard is in, USBKeys_Keys array is used differently
        // Boot mode - Maximum of 6 byte codes
        // NKRO mode - Each bit of the 26 byte corresponds to a key
-       //  Bits   0 - 160 (first 20 bytes) correspond to USB Codes 4   - 164
-       //  Bits 161 - 205 (last 6 bytes)   correspond to USB Codes 176 - 221
-       //  Bits 206 - 208 (last byte)      correspond to the 3 padded bits in USB (unused)
+       //  Bits   0 -  45 (bytes  0 -  5) correspond to USB Codes   4 -  49 (Main)
+       //  Bits  48 - 161 (bytes  6 - 20) correspond to USB Codes  51 - 164 (Secondary)
+       //  Bits 168 - 213 (bytes 21 - 26) correspond to USB Codes 176 - 221 (Tertiary)
+       //  Bits 214 - 216                 unused
        uint8_t bytePosition = 0;
        uint8_t byteShift = 0;
        switch ( USBKeys_Protocol )
@@ -335,11 +336,11 @@ void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a
                        USBKeys_Changed |= USBKeyChangeState_Modifiers;
                        break;
                }
-               // First 20 bytes
-               else if ( key >= 4 && key <= 164 )
+               // First 6 bytes
+               else if ( key >= 4 && key <= 50 )
                {
                        // Lookup (otherwise division or multiple checks are needed to do alignment)
-                       uint8_t keyPos = key - 4; // Starting position in array
+                       uint8_t keyPos = key - (4 - 0); // Starting position in array
                        switch ( keyPos )
                        {
                                byteLookup( 0 );
@@ -348,6 +349,17 @@ void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a
                                byteLookup( 3 );
                                byteLookup( 4 );
                                byteLookup( 5 );
+                       }
+
+                       USBKeys_Changed |= USBKeyChangeState_MainKeys;
+               }
+               // Next 15 bytes
+               else if ( key >= 51 && key <= 164 )
+               {
+                       // Lookup (otherwise division or multiple checks are needed to do alignment)
+                       uint8_t keyPos = key - (51 - 48); // Starting position in array
+                       switch ( keyPos )
+                       {
                                byteLookup( 6 );
                                byteLookup( 7 );
                                byteLookup( 8 );
@@ -362,26 +374,27 @@ void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a
                                byteLookup( 17 );
                                byteLookup( 18 );
                                byteLookup( 19 );
+                               byteLookup( 20 );
                        }
 
-                       USBKeys_Changed |= USBKeyChangeState_MainKeys;
+                       USBKeys_Changed |= USBKeyChangeState_SecondaryKeys;
                }
                // Last 6 bytes
                else if ( key >= 176 && key <= 221 )
                {
                        // Lookup (otherwise division or multiple checks are needed to do alignment)
-                       uint8_t keyPos = key - 176; // Starting position in array
+                       uint8_t keyPos = key - (176 - 168); // Starting position in array
                        switch ( keyPos )
                        {
-                               byteLookup( 20 );
                                byteLookup( 21 );
                                byteLookup( 22 );
                                byteLookup( 23 );
                                byteLookup( 24 );
                                byteLookup( 25 );
+                               byteLookup( 26 );
                        }
 
-                       USBKeys_Changed |= USBKeyChangeState_SecondaryKeys;
+                       USBKeys_Changed |= USBKeyChangeState_TertiaryKeys;
                }
                // Invalid key
                else
index 4146cab41f55d00118632a6b940e9658ef150c98..5d7a1d4a644b80b486677f66f02dd99622f6e410 100644 (file)
@@ -50,8 +50,9 @@ typedef enum USBKeyChangeState {
        USBKeyChangeState_Modifiers     = 0x01,
        USBKeyChangeState_MainKeys      = 0x02,
        USBKeyChangeState_SecondaryKeys = 0x04,
-       USBKeyChangeState_System        = 0x08,
-       USBKeyChangeState_Consumer      = 0x10,
+       USBKeyChangeState_TertiaryKeys  = 0x08,
+       USBKeyChangeState_System        = 0x10,
+       USBKeyChangeState_Consumer      = 0x20,
 } USBKeyChangeState;