# HG changeset patch # User Jacob Alexander # Date 1411950292 25200 # Node ID 9a3c9f6f4866ed7296ec51e0fc32424348746816 # Parent 4afb170978e91d41ea3ec1276b410544c23ec337 USB NKRO working for ARM! - Setting NKRO mode as default (up to bios to disable) diff -r 4afb170978e9 -r 9a3c9f6f4866 Output/pjrcUSB/arm/usb_keyboard.c --- a/Output/pjrcUSB/arm/usb_keyboard.c Sun Sep 28 16:44:57 2014 -0700 +++ b/Output/pjrcUSB/arm/usb_keyboard.c Sun Sep 28 17:24:52 2014 -0700 @@ -76,6 +76,7 @@ uint32_t wait_count = 0; usb_packet_t *tx_packet; + // Wait till ready while ( 1 ) { if ( !usb_configuration ) @@ -83,12 +84,26 @@ erro_print("USB not configured..."); return; } - if ( usb_tx_packet_count(KEYBOARD_ENDPOINT) < TX_PACKET_LIMIT ) + + if ( USBKeys_Protocol == 0 ) // Boot Mode { - tx_packet = usb_malloc(); - if ( tx_packet ) - break; + if ( usb_tx_packet_count( NKRO_KEYBOARD_ENDPOINT ) < TX_PACKET_LIMIT ) + { + tx_packet = usb_malloc(); + if ( tx_packet ) + break; + } } + else if ( USBKeys_Protocol == 1 ) // NKRO Mode + { + if ( usb_tx_packet_count( KEYBOARD_ENDPOINT ) < TX_PACKET_LIMIT ) + { + tx_packet = usb_malloc(); + if ( tx_packet ) + break; + } + } + if ( ++wait_count > TX_TIMEOUT || transmit_previous_timeout ) { transmit_previous_timeout = 1; @@ -98,15 +113,89 @@ yield(); } - // Boot Mode - *(tx_packet->buf) = USBKeys_Modifiers; - *(tx_packet->buf + 1) = 0; - memcpy( tx_packet->buf + 2, USBKeys_Keys, USB_BOOT_MAX_KEYS ); - tx_packet->len = 8; + // Pointer to USB tx packet buffer + uint8_t *tx_buf = tx_packet->buf; + + switch ( USBKeys_Protocol ) + { + // Send boot keyboard interrupt packet(s) + case 0: + // Boot Mode + *tx_buf++ = USBKeys_Modifiers; + *tx_buf++ = 0; + memcpy( tx_buf, USBKeys_Keys, USB_BOOT_MAX_KEYS ); + tx_packet->len = 8; + + // Send USB Packet + usb_tx( KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed = USBKeyChangeState_None; + break; + + // Send NKRO keyboard interrupts packet(s) + case 1: + // Check modifiers + if ( USBKeys_Changed & USBKeyChangeState_Modifiers ) + { + *tx_buf++ = 0x01; // ID + *tx_buf = USBKeys_Modifiers; + tx_packet->len = 2; + + // Send USB Packet + usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed &= ~USBKeyChangeState_Modifiers; // Mark sent + } + // Check main key section + else if ( USBKeys_Changed & USBKeyChangeState_MainKeys ) + { + *tx_buf++ = 0x03; // ID + + // 4-164 (first 20 bytes) + memcpy( tx_buf, USBKeys_Keys, 20 ); + tx_packet->len = 21; - // Send USB Packet - usb_tx( KEYBOARD_ENDPOINT, tx_packet ); - USBKeys_Changed = USBKeyChangeState_None; + // Send USB Packet + usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed &= ~USBKeyChangeState_MainKeys; // Mark sent + } + // Check secondary key section + else if ( USBKeys_Changed & USBKeyChangeState_SecondaryKeys ) + { + *tx_buf++ = 0x04; // ID + + // 176-221 (last 6 bytes) + memcpy( tx_buf, USBKeys_Keys + 20, 6 ); + tx_packet->len = 7; + + // Send USB Packet + usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed &= ~USBKeyChangeState_SecondaryKeys; // Mark sent + } + // Check system control keys + else if ( USBKeys_Changed & USBKeyChangeState_System ) + { + *tx_buf++ = 0x05; // ID + *tx_buf = USBKeys_SysCtrl; + tx_packet->len = 2; + + // Send USB Packet + usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed &= ~USBKeyChangeState_System; // Mark sent + } + // Check consumer control keys + else if ( USBKeys_Changed & USBKeyChangeState_Consumer ) + { + *tx_buf++ = 0x06; // ID + *tx_buf++ = (uint8_t)(USBKeys_ConsCtrl & 0x00FF); + *tx_buf = (uint8_t)(USBKeys_ConsCtrl >> 8); + tx_packet->len = 3; + + // Send USB Packet + usb_tx( NKRO_KEYBOARD_ENDPOINT, tx_packet ); + USBKeys_Changed &= ~USBKeyChangeState_Consumer; // Mark sent + } + + break; + } return; } diff -r 4afb170978e9 -r 9a3c9f6f4866 Output/pjrcUSB/output_com.c --- a/Output/pjrcUSB/output_com.c Sun Sep 28 16:44:57 2014 -0700 +++ b/Output/pjrcUSB/output_com.c Sun Sep 28 17:24:52 2014 -0700 @@ -106,7 +106,7 @@ // Protocol setting from the host. // 0 - Boot Mode // 1 - NKRO Mode (Default, unless set by a BIOS or boot interface) -volatile uint8_t USBKeys_Protocol = 0; +volatile uint8_t USBKeys_Protocol = 1; // Indicate if USB should send update // OS only needs update if there has been a change in state