From bba9a1c973c17d55093201756ab3e9e6808c82dd Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Wed, 1 Oct 2014 23:44:12 -0700 Subject: [PATCH] Adding NKRO and Boot mode capabilities. - When changing the mode, a key buffer flush is required (might confuse the OS temporarily) --- Output/pjrcUSB/capabilities.kll | 10 +++-- Output/pjrcUSB/output_com.c | 73 +++++++++++++++++++++++++++++++-- Output/pjrcUSB/output_com.h | 7 ++++ 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/Output/pjrcUSB/capabilities.kll b/Output/pjrcUSB/capabilities.kll index 211d6fb..13180c1 100644 --- a/Output/pjrcUSB/capabilities.kll +++ b/Output/pjrcUSB/capabilities.kll @@ -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 --git a/Output/pjrcUSB/output_com.c b/Output/pjrcUSB/output_com.c index 5b562e9..e29cd30 100644 --- a/Output/pjrcUSB/output_com.c +++ b/Output/pjrcUSB/output_com.c @@ -123,6 +123,60 @@ USBKeyChangeState USBKeys_Changed = USBKeyChangeState_None; // ----- 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 @@ void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a // ----- 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 @@ inline void Output_setup() // 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 --git a/Output/pjrcUSB/output_com.h b/Output/pjrcUSB/output_com.h index 30f7b54..4146cab 100644 --- a/Output/pjrcUSB/output_com.h +++ b/Output/pjrcUSB/output_com.h @@ -80,10 +80,15 @@ extern USBKeyChangeState USBKeys_Changed; // ----- 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_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a void Output_setup(); void Output_send(); +void Output_flushBuffers(); + void Output_firmwareReload(); void Output_softReset();