diff Output/uartOut/arm/uart_serial.c @ 370:39e338a6733d

Fixing default ErgoDox layout and adding FlashMode button - 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
author Jacob Alexander <haata@kiibohd.com>
date Fri, 21 Aug 2015 19:43:45 -0700
parents e8841d3c6db5
children
line wrap: on
line diff
--- a/Output/uartOut/arm/uart_serial.c	Fri Aug 21 18:26:46 2015 -0700
+++ b/Output/uartOut/arm/uart_serial.c	Fri Aug 21 19:43:45 2015 -0700
@@ -27,6 +27,8 @@
 // Project Includes
 #include <Lib/OutputLib.h>
 #include <Lib/Interrupts.h>
+#include <print.h>
+#include <kll_defs.h>
 
 // Local Includes
 #include "uart_serial.h"
@@ -325,6 +327,48 @@
 
 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
 }