Mercurial > louis > kiibohd-controller
changeset 28:6ca5b1a395df
Adding soft entry bootloader via key sequence.
- Fixed up basic Macro module (still not to my liking)
- Added the bootloader entry bits
- Added logic for key sequence tracking
author | Jacob Alexander <triplehaata@gmail.com> |
---|---|
date | Sun, 16 Oct 2011 00:45:10 -0700 |
parents | 8b8cad3db8db |
children | f32c9b3061e0 |
files | Keymap/keymap.h Macro/basic/macro.c USB/pjrc/usb_com.c |
diffstat | 3 files changed, 103 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/Keymap/keymap.h Sat Oct 15 20:01:46 2011 -0700 +++ b/Keymap/keymap.h Sun Oct 16 00:45:10 2011 -0700 @@ -34,9 +34,13 @@ // ----- Variables ----- +// Lots of these variables are not used, so ignore gcc unused warnings +// But just for the variables in this file (and those included into it) +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic push + static uint8_t tandy1000_modifierMask[] = { 0x1D, 0x2A, 0x36, 0x38, 0x46 }; -/* static uint8_t tandy1000_map[] = { 0, KEY_ESC, KEY_1, @@ -129,7 +133,6 @@ KEY_F11, KEY_F12, // 0x5A }; -*/ static uint8_t tandy1000_colemak[] = { 0, KEY_ESC, @@ -449,5 +452,9 @@ KEY_RIGHT_ALT, KEY_SPACE }; */ + +// Only ignore unused warnings for the above variables +#pragma GCC diagnostic pop + #endif
--- a/Macro/basic/macro.c Sat Oct 15 20:01:46 2011 -0700 +++ b/Macro/basic/macro.c Sun Oct 16 00:45:10 2011 -0700 @@ -22,6 +22,8 @@ // ----- Includes ----- // AVR Includes +#include <util/delay.h> +#include <avr/interrupt.h> // Project Includes #include <led.h> @@ -38,30 +40,93 @@ +// ----- Variables ----- + +// Keeps track of the sequence used to reflash the teensy in software +static uint8_t Bootloader_ConditionSequence[] = {1,16,6,11}; + uint8_t Bootloader_ConditionState = 0; + uint8_t Bootloader_NextPositionReady = 1; + + + // ----- Functions ----- +void jumpToBootloader(void) +{ + cli(); + // disable watchdog, if enabled + // disable all peripherals + UDCON = 1; + USBCON = (1<<FRZCLK); // disable USB + UCSR1B = 0; + _delay_ms(5); + +#if defined(__AVR_AT90USB162__) // Teensy 1.0 + EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; + TIMSK0 = 0; TIMSK1 = 0; UCSR1B = 0; + DDRB = 0; DDRC = 0; DDRD = 0; + PORTB = 0; PORTC = 0; PORTD = 0; + asm volatile("jmp 0x3E00"); +#elif defined(__AVR_ATmega32U4__) // Teensy 2.0 + EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; + TIMSK0 = 0; TIMSK1 = 0; TIMSK3 = 0; TIMSK4 = 0; UCSR1B = 0; TWCR = 0; + DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; TWCR = 0; + PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; + asm volatile("jmp 0x7E00"); +#elif defined(__AVR_AT90USB646__) // Teensy++ 1.0 + EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; + TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0; + DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; + PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; + asm volatile("jmp 0xFC00"); +#elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0 + EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; + TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0; + DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; + PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; + asm volatile("jmp 0x1FC00"); +#endif +} + // Given a sampling array, and the current number of detected keypress // Add as many keypresses from the sampling array to the USB key send array as possible. inline void keyPressDetection( uint8_t *keys, uint8_t numberOfKeys, uint8_t *modifiers, uint8_t numberOfModifiers, uint8_t *map ) { - USBKeys_Sent = 0; + uint8_t Bootloader_KeyDetected = 0; + uint8_t processed_keys = 0; // Parse the detection array starting from 1 (all keys are purposefully mapped from 1 -> total as per typical PCB labels) for ( uint8_t key = 0; key < numberOfKeys + 1; key++ ) { if ( keys[key] & (1 << 7) ) { + processed_keys++; + // Display the detected scancode char tmpStr[4]; int8ToStr( key, tmpStr ); dPrintStrs( tmpStr, " " ); + // Is this a bootloader sequence key? + if ( !Bootloader_KeyDetected + && Bootloader_NextPositionReady + && key == Bootloader_ConditionSequence[Bootloader_ConditionState] ) + { + Bootloader_KeyDetected = 1; + Bootloader_NextPositionReady = 0; + Bootloader_ConditionState++; + } + else if ( Bootloader_ConditionState > 0 && key == Bootloader_ConditionSequence[Bootloader_ConditionState - 1] ) + { + Bootloader_KeyDetected = 1; + } + // Determine if the key is a modifier uint8_t modFound = 0; for ( uint8_t mod = 0; mod < numberOfModifiers; mod++ ) { // Modifier found if ( modifiers[mod] == key ) { - //USBKeys_Modifiers |= map[key]; + USBKeys_Modifiers |= map[key]; modFound = 1; break; } @@ -85,6 +150,23 @@ } } + // Boot loader sequence state handler + switch ( processed_keys ) + { + // The next bootloader key can now be pressed, if there were no keys processed + case 0: + Bootloader_NextPositionReady = 1; + break; + // If keys were detected, and it wasn't in the sequence (or there was multiple keys detected), start bootloader sequence over + // This case purposely falls through + case 1: + if ( Bootloader_KeyDetected ) + break; + default: + Bootloader_ConditionState = 0; + break; + } + // Add debug separator if keys sent via USB if ( USBKeys_Sent > 0 ) print("\033[1;32m|\033[0m\n"); @@ -92,7 +174,15 @@ inline void process_macros(void) { + // Online process macros once (if some were found), until the next USB send + if ( USBKeys_Sent != 0 ) + return; + // Debounce Sampling Array to USB Data Array keyPressDetection( KeyIndex_Array, KeyIndex_Size, MODIFIER_MASK, sizeof(MODIFIER_MASK), KEYINDEX_MASK ); + + // Check for bootloader condition + if ( Bootloader_ConditionState == sizeof( Bootloader_ConditionSequence ) ) + jumpToBootloader(); }