# HG changeset patch # User Jacob Alexander # Date 1412232252 25200 # Node ID aaf14110ea7b810c3591e50664ba41f3835533b8 # Parent 757e06368d0fce962c1d43bc8ebe1751713a65d4 Adding NKRO and Boot mode capabilities. - When changing the mode, a key buffer flush is required (might confuse the OS temporarily) diff -r 757e06368d0f -r aaf14110ea7b Output/pjrcUSB/capabilities.kll --- a/Output/pjrcUSB/capabilities.kll Wed Oct 01 00:16:14 2014 -0700 +++ b/Output/pjrcUSB/capabilities.kll Wed Oct 01 23:44:12 2014 -0700 @@ -1,14 +1,18 @@ Name = pjrcUSBCapabilities; -Version = 0.2; +Version = 0.3; Author = "HaaTa (Jacob Alexander) 2014"; KLL = 0.3; # Modified Date -Date = 2014-09-20; +Date = 2014-10-01; -# Capabilties available to the pjrcUSB output module +# Output capabilities consCtrlOut => Output_consCtrlSend_capability( consCode : 2 ); sysCtrlOut => Output_sysCtrlSend_capability( sysCode : 1 ); usbKeyOut => Output_usbCodeSend_capability( usbCode : 1 ); +# Configuration capabilities +kbdProtocolBoot => Output_kbdProtocolBoot_capability(); +kbdProtocolNKRO => Output_kbdProtocolNKRO_capability(); + diff -r 757e06368d0f -r aaf14110ea7b Output/pjrcUSB/output_com.c --- a/Output/pjrcUSB/output_com.c Wed Oct 01 00:16:14 2014 -0700 +++ b/Output/pjrcUSB/output_com.c Wed Oct 01 23:44:12 2014 -0700 @@ -123,6 +123,60 @@ // ----- Capabilities ----- +// Set Boot Keyboard Protocol +void Output_kbdProtocolBoot_capability( uint8_t state, uint8_t stateType, uint8_t *args ) +{ + // Display capability name + if ( stateType == 0xFF && state == 0xFF ) + { + print("Output_kbdProtocolBoot()"); + return; + } + + // Only set if necessary + if ( USBKeys_Protocol == 0 ) + return; + + // TODO Analog inputs + // Only set on key press + if ( stateType != 0x01 ) + return; + + // Flush the key buffers + Output_flushBuffers(); + + // Set the keyboard protocol to Boot Mode + USBKeys_Protocol = 0; +} + + +// Set NKRO Keyboard Protocol +void Output_kbdProtocolNKRO_capability( uint8_t state, uint8_t stateType, uint8_t *args ) +{ + // Display capability name + if ( stateType == 0xFF && state == 0xFF ) + { + print("Output_kbdProtocolNKRO()"); + return; + } + + // Only set if necessary + if ( USBKeys_Protocol == 1 ) + return; + + // TODO Analog inputs + // Only set on key press + if ( stateType != 0x01 ) + return; + + // Flush the key buffers + Output_flushBuffers(); + + // Set the keyboard protocol to NKRO Mode + USBKeys_Protocol = 1; +} + + // Sends a Consumer Control code to the USB Output buffer void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ) { @@ -358,6 +412,20 @@ // ----- Functions ----- +// Flush Key buffers +void Output_flushBuffers() +{ + // Zero out USBKeys_Keys array + for ( uint8_t c = 0; c < USB_NKRO_BITFIELD_SIZE_KEYS; c++ ) + USBKeys_Keys[ c ] = 0; + + // Zero out other key buffers + USBKeys_ConsCtrl = 0; + USBKeys_Modifiers = 0; + USBKeys_SysCtrl = 0; +} + + // USB Module Setup inline void Output_setup() { @@ -370,9 +438,8 @@ // Register USB Output CLI dictionary CLI_registerDictionary( outputCLIDict, outputCLIDictName ); - // Zero out USBKeys_Keys array - for ( uint8_t c = 0; c < USB_NKRO_BITFIELD_SIZE_KEYS; c++ ) - USBKeys_Keys[ c ] = 0; + // Flush key buffers + Output_flushBuffers(); } diff -r 757e06368d0f -r aaf14110ea7b Output/pjrcUSB/output_com.h --- a/Output/pjrcUSB/output_com.h Wed Oct 01 00:16:14 2014 -0700 +++ b/Output/pjrcUSB/output_com.h Wed Oct 01 23:44:12 2014 -0700 @@ -80,10 +80,15 @@ // ----- Capabilities ----- +// Output capabilities void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ); void Output_sysCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ); void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ); +// Configuration capabilities +void Output_kbdProtocolBoot_capability( uint8_t state, uint8_t stateType, uint8_t *args ); +void Output_kbdProtocolNKRO_capability( uint8_t state, uint8_t stateType, uint8_t *args ); + // ----- Functions ----- @@ -91,6 +96,8 @@ void Output_setup(); void Output_send(); +void Output_flushBuffers(); + void Output_firmwareReload(); void Output_softReset();