diff --git a/Output/pjrcUSB/arm/usb_desc.c b/Output/pjrcUSB/arm/usb_desc.c index 2549ce9..e5d8af5 100644 --- a/Output/pjrcUSB/arm/usb_desc.c +++ b/Output/pjrcUSB/arm/usb_desc.c @@ -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,11 +203,32 @@ static uint8_t nkro_keyboard_report_desc[] = { 0x25, 0x01, // Logical Maximum (1), 0x05, 0x07, // Usage Page (Key Codes), 0x19, 0x04, // Usage Minimum (4), + 0x29, 0x31, // Usage Maximum (49), + 0x81, 0x02, // Input (Data, Variable, Absolute, Bitfield), + + // 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), - // 176-221 (45 bits) - 0x85, 0x04, // Report ID (4), + // 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), @@ -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), diff --git a/Output/pjrcUSB/arm/usb_keyboard.c b/Output/pjrcUSB/arm/usb_keyboard.c index a5fc255..7e435cd 100644 --- a/Output/pjrcUSB/arm/usb_keyboard.c +++ b/Output/pjrcUSB/arm/usb_keyboard.c @@ -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 - // 176-221 (last 6 bytes) - memcpy( tx_buf, USBKeys_Keys + 20, 6 ); - tx_packet->len = 7; + // 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 + 21, 6 ); + tx_packet->len = 7; + + // Send USB Packet + usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); + 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; diff --git a/Output/pjrcUSB/avr/usb_keyboard_serial.c b/Output/pjrcUSB/avr/usb_keyboard_serial.c index 63a8f72..9c2324e 100644 --- a/Output/pjrcUSB/avr/usb_keyboard_serial.c +++ b/Output/pjrcUSB/avr/usb_keyboard_serial.c @@ -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 diff --git a/Output/pjrcUSB/avr/usb_keyboard_serial.h b/Output/pjrcUSB/avr/usb_keyboard_serial.h index aac7c7d..6dc727f 100644 --- a/Output/pjrcUSB/avr/usb_keyboard_serial.h +++ b/Output/pjrcUSB/avr/usb_keyboard_serial.h @@ -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,11 +387,32 @@ 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, 0x31, // Usage Maximum (49), + 0x81, 0x02, // Input (Data, Variable, Absolute, Bitfield), + + // 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), - // 176-221 (45 bits) - 0x85, 0x04, // Report ID (4), + // 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), @@ -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 diff --git a/Output/pjrcUSB/output_com.c b/Output/pjrcUSB/output_com.c index e29cd30..cb85fcd 100644 --- a/Output/pjrcUSB/output_com.c +++ b/Output/pjrcUSB/output_com.c @@ -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 diff --git a/Output/pjrcUSB/output_com.h b/Output/pjrcUSB/output_com.h index 4146cab..5d7a1d4 100644 --- a/Output/pjrcUSB/output_com.h +++ b/Output/pjrcUSB/output_com.h @@ -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;