- Adds proper flashMode support for all keyboards and microcontrollers (usb and serial)
- flashModeEnabled must be set to 1 otherwise it will only show an error
* This is on purpose (somewhat dangerous feature as it allows remote flashing)
- Capability cleanup
-// ----- Capabilities -----
-
-void Macro_layerState_capability( uint8_t state, uint8_t stateType, uint8_t *args );
-void Macro_layerLatch_capability( uint8_t state, uint8_t stateType, uint8_t *args );
-void Macro_layerLock_capability( uint8_t state, uint8_t stateType, uint8_t *args );
-void Macro_layerShift_capability( uint8_t state, uint8_t stateType, uint8_t *args );
-
-
-
// ----- Functions -----
void Macro_analogState( uint8_t scanCode, uint8_t state );
// Project Includes
#include <Lib/OutputLib.h>
#include <print.h>
+#include <kll_defs.h>
// Local Includes
#include "usb_dev.h"
void usb_device_reload()
{
+ if ( flashModeEnabled_define == 0 )
+ {
+ print( NL );
+ warn_print("flashModeEnabled not set, cancelling firmware reload...");
+ info_msg("Set flashModeEnabled to 1 in your kll configuration.");
+ return;
+ }
+
// MCHCK
#if defined(_mk20dx128vlf5_)
PORTA_PCR3 = PORT_PCR_PFE | PORT_PCR_MUX(1); // Internal pull-up
// Check for jumper
- if ( GPIOA_PDIR & (1<<3) )
+ if ( GPIOA_PDIR & (1<<3) && flashModeEnabled_define != 0 )
{
print( NL );
warn_print("Security jumper not present, cancelling firmware reload...");
Name = pjrcUSBCapabilities;
-Version = 0.5;
+Version = 0.6;
Author = "HaaTa (Jacob Alexander) 2014-2015";
-KLL = 0.3b;
+KLL = 0.3c;
# Modified Date
-Date = 2015-07-12;
+Date = 2015-08-21;
# Output capabilities
keyboardLocale => KeyboardLocale_define;
keyboardLocale = 0;
+# Bootloader Mode capability
+# XXX
+# By default this is disabled on purpose
+# It is a large security hazard
+flashModeEnabled => flashModeEnabled_define;
+flashModeEnabled = 0;
+
+flashMode => Output_flashMode_capability();
+
}
}
+void Output_flashMode_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Output_flashMode(usbCode)");
+ return;
+ }
+
+ // Start flash mode
+ Output_firmwareReload();
+}
+
// ----- Functions -----
-// ----- Capabilities -----
-
-// Output capabilities
-void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args );
-void Output_noneSend_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 -----
void Output_setup();
// Project Includes
#include <Lib/OutputLib.h>
#include <Lib/Interrupts.h>
+#include <print.h>
+#include <kll_defs.h>
// Local Includes
#include "uart_serial.h"
void uart_device_reload()
{
+ if ( flashModeEnabled_define == 0 )
+ {
+ print( NL );
+ warn_print("flashModeEnabled not set, cancelling firmware reload...");
+ info_msg("Set flashModeEnabled to 1 in your kll configuration.");
+ return;
+ }
+
+// MCHCK
+#if defined(_mk20dx128vlf5_)
+
+ // MCHCK Kiibohd Variant
+ // Check to see if PTA3 (has a pull-up) is connected to GND (usually via jumper)
+ // Only allow reload if the jumper is present (security)
+ GPIOA_PDDR &= ~(1<<3); // Input
+ PORTA_PCR3 = PORT_PCR_PFE | PORT_PCR_MUX(1); // Internal pull-up
+
+ // Check for jumper
+ if ( GPIOA_PDIR & (1<<3) && flashModeEnabled_define != 0 )
+ {
+ print( NL );
+ warn_print("Security jumper not present, cancelling firmware reload...");
+ info_msg("Replace jumper on middle 2 pins, or manually press the firmware reload button.");
+ }
+ else
+ {
+ // Copies variable into the VBAT register, must be identical to the variable in the bootloader to jump to the bootloader flash mode
+ for ( int pos = 0; pos < sizeof(sys_reset_to_loader_magic); pos++ )
+ (&VBAT)[ pos ] = sys_reset_to_loader_magic[ pos ];
+ SOFTWARE_RESET();
+ }
+
+// Kiibohd mk20dx256vlh7
+#elif defined(_mk20dx256vlh7_)
+ // Copies variable into the VBAT register, must be identical to the variable in the bootloader to jump to the bootloader flash mode
+ for ( int pos = 0; pos < sizeof(sys_reset_to_loader_magic); pos++ )
+ (&VBAT)[ pos ] = sys_reset_to_loader_magic[ pos ];
+ SOFTWARE_RESET();
+
+// Teensy 3.0 and 3.1
+#else
asm volatile("bkpt");
+#endif
}
Name = uartOutCapabilities;
-Version = 0.1;
+Version = 0.2;
Author = "HaaTa (Jacob Alexander) 2014";
KLL = 0.3;
# Modified Date
-Date = 2014-09-27;
+Date = 2014-08-21;
# Capabilties available to the uartOut output module
usbKeyOut => Output_usbCodeSend_capability( usbCode : 1 );
+# Bootloader Mode capability
+# XXX
+# By default this is disabled on purpose
+# It is a large security hazard
+flashModeEnabled => flashModeEnabled_define;
+flashModeEnabled = 0;
+
+flashMode => Output_flashMode_capability();
+
}
}
+void Output_flashMode_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Output_flashMode(usbCode)");
+ return;
+ }
+
+ // Start flash mode
+ Output_firmwareReload();
+}
+
// ----- Functions -----
}
}
+void Output_flashMode_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Output_flashMode(usbCode)");
+ return;
+ }
+
+ // Start flash mode
+ Output_firmwareReload();
+}
+
// ----- Functions -----
-Name = MDErgo1 Right Hand;
+Name = MDErgo1 Left Hand;
Version = 0.1;
Author = "HaaTa (Jacob Alexander) 2015";
KLL = 0.3c;
# Top Row
-S0x02 : U"6";
+S0x02 : U"Esc";
S0x03 : U"5";
S0x04 : U"4";
S0x05 : U"3";
S0x06 : U"2";
S0x07 : U"1";
-S0x08 : U"Esc";
+S0x08 : U"Equals";
# Top-Middle Row
-S0x0B : U"F4";
+S0x0B : U"Function1";
S0x0C : U"T";
S0x0D : U"R";
S0x0E : U"E";
S0x0F : U"W";
S0x10 : U"Q";
-S0x11 : U"Tab";
+S0x11 : U"Backslash";
# Middle Row
S0x15 : U"G";
S0x17 : U"D";
S0x18 : U"S";
S0x19 : U"A";
-S0x1A : U"Function1";
+S0x1A : U"Tab";
# Top Thumb Cluster
-S0x1B : U"Home";
-S0x1C : U"End";
+S0x1B : U"LAlt";
+S0x1C : U"LCtrl";
# Bottom-Middle Row
-S0x1D : U"F5";
+S0x1D : U"Function2";
S0x1E : U"B";
S0x1F : U"V";
S0x20 : U"C";
S0x23 : U"Left Shift";
# Bottom Thumb Cluster
-S0x24 : U"Left Alt";
-S0x25 : U"Left Ctrl";
+S0x24 : U"Home";
+S0x25 : U"End";
S0x26 : U"Delete";
-S0x27 : U"Space";
+S0x27 : U"Backspace";
# Bottom Row
S0x28 : U"Function5";
-S0x29 : U"Backtick";
-S0x2A : U"Right Brace";
-S0x2B : U"Left Brace";
-S0x2C : U"Function3";
+S0x29 : U"Function4";
+S0x2A : U"Function3";
+S0x2B : U"Backtick";
+S0x2C : U"LGui";
# Top Row
-S0x02 : U"7";
-S0x03 : U"8";
-S0x04 : U"9";
-S0x05 : U"0";
-S0x06 : U"Minus";
-S0x07 : U"Equal";
-S0x08 : U"Backspace";
+S0x02 : U"Function6";
+S0x03 : U"6";
+S0x04 : U"7";
+S0x05 : U"8";
+S0x06 : U"9";
+S0x07 : U"0";
+S0x08 : U"Minus";
# Top-Middle Row
-S0x0B : U"PageUp";
+S0x0B : U"Left Brace";
S0x0C : U"Y";
S0x0D : U"U";
S0x0E : U"I";
S0x0F : U"O";
S0x10 : U"P";
-S0x11 : U"BackSlash";
+S0x11 : U"Right Brace";
# Middle Row
S0x15 : U"H";
S0x1A : U"Quote";
# Top Thumb Cluster
-S0x1B : U"PrintScreen";
-S0x1C : U"Insert";
+S0x1B : U"RAlt";
+S0x1C : U"RCtrl";
# Bottom-Middle Row
-S0x1D : U"PageDown";
+S0x1D : U"Function7";
S0x1E : U"N";
S0x1F : U"M";
S0x20 : U"Comma";
S0x23 : U"Right Shift";
# Bottom Thumb Cluster
-S0x24 : U"Right Alt";
-S0x25 : U"Right Ctrl";
+S0x24 : U"PageUp";
+S0x25 : U"PageDown";
S0x26 : U"Enter";
-S0x27 : U"Function2";
+S0x27 : U"Space";
# Bottom Row
S0x28 : U"Left";
S0x29 : U"Down";
S0x2A : U"Up";
S0x2B : U"Right";
-S0x2C : U"Function4";
-
+S0x2C : U"RGui";