From 1877dcfa01d5f547647aefdc71368281e664ab33 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Tue, 27 Mar 2012 00:04:43 -0400 Subject: [PATCH] Completing the BETKB support - Keyboard is fully functional - LED, Beeper, and keyboard input not yet implemented --- Keymap/betkb.h | 494 ++++++++++++++++++++--------------------- Macro/buffer/macro.c | 2 + Scan/BETKB/scan_loop.c | 112 +++++----- Scan/BETKB/scan_loop.h | 2 +- 4 files changed, 306 insertions(+), 304 deletions(-) diff --git a/Keymap/betkb.h b/Keymap/betkb.h index eb13b11..31fab7a 100644 --- a/Keymap/betkb.h +++ b/Keymap/betkb.h @@ -26,268 +26,268 @@ // ----- Variables ----- -static uint8_t betkb_ModifierMask[] = { 0x48, 0x49, 0x4C, 0x4D, 0x45, 0x14 }; +static uint8_t betkb_ModifierMask[] = { 0x20, 0x2D, 0x2E, 0x30, 0x3E, 0x60 }; static uint8_t betkb_DefaultMap[] = { - KEY_TILDE, // 0x00 - KEY_UP, // 0x01 + 0, // 0x00 + 0, // 0x01 0, // 0x02 0, // 0x03 - KEY_PRINTSCREEN, // 0x04 - KEY_PAGE_DOWN, // 0x05 - KEY_LEFT_BRACE, // 0x06 - KEY_F11, // 0x07 - KEY_BACKSPACE, // 0x08 - KEY_TAB, // 0x09 - KEY_ENTER, // 0x0A - KEY_DOWN, // 0x0B - KEY_PAGE_UP, // 0x0C - KEYPAD_ENTER, // 0x0D - KEY_LEFT, // 0x0E - KEY_RIGHT, // 0x0F + 0, // 0x04 + 0, // 0x05 + 0, // 0x06 + 0, // 0x07 + 0, // 0x08 + 0, // 0x09 + 0, // 0x0A + 0, // 0x0B + 0, // 0x0C + 0, // 0x0D + 0, // 0x0E + 0, // 0x0F 0, // 0x10 - KEY_PAGE_UP, // 0x11 - KEY_F12, // 0x12 - KEY_PAGE_DOWN, // 0x13 - KEY_GUI, // 0x14 - KEY_F1, // 0x15 - KEY_F2, // 0x16 - KEY_F3, // 0x17 - KEY_F4, // 0x18 - KEY_F5, // 0x19 - KEY_F6, // 0x1A - KEY_ESC, // 0x1B - KEY_F7, // 0x1C - KEY_F8, // 0x1D - KEY_F9, // 0x1E - KEY_F10, // 0x1F - KEY_SPACE, // 0x20 - KEYPAD_9, // 0x21 - 0, // 0x22 - 0, // 0x23 - 0, // 0x24 - 0, // 0x25 - 0, // 0x26 - KEY_QUOTE, // 0x27 - 0, // 0x28 - 0, // 0x29 - 0, // 0x2A - KEY_EQUAL, // 0x2B - KEY_COMMA, // 0x2C - KEY_MINUS, // 0x2D - KEY_PERIOD, // 0x2E - KEY_SLASH, // 0x2F - KEY_0, // 0x30 - KEY_1, // 0x31 - KEY_2, // 0x32 - KEY_3, // 0x33 - KEY_4, // 0x34 - KEY_5, // 0x35 - KEY_6, // 0x36 - KEY_7, // 0x37 - KEY_8, // 0x38 - KEY_9, // 0x39 - 0, // 0x3A - KEY_SEMICOLON, // 0x3B + 0, // 0x11 + 0, // 0x12 + 0, // 0x13 + 0, // 0x14 + 0, // 0x15 + 0, // 0x16 + 0, // 0x17 + 0, // 0x18 + 0, // 0x19 + 0, // 0x1A + 0, // 0x1B + 0, // 0x1C + 0, // 0x1D + 0, // 0x1E + 0, // 0x1F + KEY_LEFT_SHIFT, // 0x20 + 0, // 0x21 + KEY_Z, // 0x22 + KEY_X, // 0x23 + KEY_C, // 0x24 + KEY_V, // 0x25 + KEY_B, // 0x26 + KEY_N, // 0x27 + KEY_M, // 0x28 + KEY_COMMA, // 0x29 + KEY_PERIOD, // 0x2A + KEY_SLASH, // 0x2B + 0, // 0x2C + KEY_RIGHT_SHIFT, // 0x2D + KEY_LEFT_ALT, // 0x2E + KEY_SPACE, // 0x2F + KEY_LEFT_CTRL, // 0x30 + KEY_A, // 0x31 + KEY_S, // 0x32 + KEY_D, // 0x33 + KEY_F, // 0x34 + KEY_G, // 0x35 + KEY_H, // 0x36 + KEY_J, // 0x37 + KEY_K, // 0x38 + KEY_L, // 0x39 + KEY_SEMICOLON, // 0x3A + KEY_QUOTE, // 0x3B 0, // 0x3C - KEY_EQUAL, // 0x3D - 0, // 0x3E - 0, // 0x3F - 0, // 0x40 - KEYPAD_6, // 0x41 - KEYPAD_MINUS, // 0x42 - KEY_PAUSE, // 0x43 - KEY_INSERT, // 0x44 - KEY_CTRL, // 0x45 - KEYPAD_2, // 0x46 - KEYPAD_3, // 0x47 - KEY_LEFT_SHIFT, // 0x48 - KEY_RIGHT_SHIFT, // 0x49 - KEYPAD_0, // 0x4A - KEYPAD_PERIOD, // 0x4B - KEY_LEFT_ALT, // 0x4C - KEY_RIGHT_ALT, // 0x4D - 0, // 0x4E - 0, // 0x4F - 0, // 0x50 - 0, // 0x51 - 0, // 0x52 - 0, // 0x53 - 0, // 0x54 - 0, // 0x55 - 0, // 0x56 - 0, // 0x57 - 0, // 0x58 - 0, // 0x59 - 0, // 0x5A - KEY_RIGHT_BRACE, // 0x5B - KEYPAD_7, // 0x5C - KEY_BACKSLASH, // 0x5D - KEY_ESC, // 0x5E - 0, // 0x5F - KEYPAD_1, // 0x60 - KEY_A, // 0x61 - KEY_B, // 0x62 - KEY_C, // 0x63 - KEY_D, // 0x64 - KEY_E, // 0x65 - KEY_F, // 0x66 - KEY_G, // 0x67 - KEY_H, // 0x68 - KEY_I, // 0x69 - KEY_J, // 0x6A - KEY_K, // 0x6B - KEY_L, // 0x6C - KEY_M, // 0x6D - KEY_N, // 0x6E - KEY_O, // 0x6F - KEY_P, // 0x70 - KEY_Q, // 0x71 - KEY_R, // 0x72 - KEY_S, // 0x73 - KEY_T, // 0x74 - KEY_U, // 0x75 - KEY_V, // 0x76 - KEY_W, // 0x77 - KEY_X, // 0x78 - KEY_Y, // 0x79 - KEY_Z, // 0x7A - KEYPAD_4, // 0x7B - KEYPAD_8, // 0x7C - KEYPAD_5, // 0x7D + KEY_ENTER, // 0x3D + KEY_RIGHT_GUI, // 0x3E + KEYPAD_1, // 0x3F + KEY_TAB, // 0x40 + KEY_Q, // 0x41 + KEY_W, // 0x42 + KEY_E, // 0x43 + KEY_R, // 0x44 + KEY_T, // 0x45 + KEY_Y, // 0x46 + KEY_U, // 0x47 + KEY_I, // 0x48 + KEY_O, // 0x49 + KEY_P, // 0x4A + KEY_LEFT_BRACE, // 0x4B + KEY_RIGHT_BRACE, // 0x4C + KEY_BACKSLASH, // 0x4D + KEY_DELETE, // 0x4E + KEYPAD_4, // 0x4F + KEY_ESC, // 0x50 + KEY_1, // 0x51 + KEY_2, // 0x52 + KEY_3, // 0x53 + KEY_4, // 0x54 + KEY_5, // 0x55 + KEY_6, // 0x56 + KEY_7, // 0x57 + KEY_8, // 0x58 + KEY_9, // 0x59 + KEY_0, // 0x5A + KEY_MINUS, // 0x5B + KEY_EQUAL, // 0x5C + KEY_TILDE, // 0x5D + KEY_BACKSPACE, // 0x5E + KEY_NUM_LOCK, // 0x5F + KEY_LEFT_GUI, // 0x60 + KEY_HOME, // 0x61 + KEY_END, // 0x62 + KEY_INSERT, // 0x63 + KEY_DELETE, // 0x64 + KEY_F1, // 0x65 + KEY_F2, // 0x66 + KEY_F3, // 0x67 + KEY_F4, // 0x68 + KEY_F5, // 0x69 + KEY_F6, // 0x6A + KEY_F7, // 0x6B + KEY_F8, // 0x6C + KEY_F9, // 0x6D + KEY_F10, // 0x6E + KEY_PRINTSCREEN, // 0x6F + KEY_PAGE_UP, // 0x70 + KEY_PAGE_DOWN, // 0x71 + KEY_F11, // 0x72 + KEYPAD_7, // 0x73 + KEYPAD_8, // 0x74 + KEYPAD_9, // 0x75 + KEYPAD_5, // 0x76 + KEYPAD_6, // 0x77 + KEYPAD_2, // 0x78 + KEYPAD_3, // 0x79 + KEYPAD_0, // 0x7A + KEYPAD_00, // 0x7B + KEYPAD_ENTER, // 0x7C + 0, // 0x7D 0, // 0x7E - KEY_DELETE, // 0x7F + 0, // 0x7F }; static uint8_t betkb_ColemakMap[] = { - KEY_TILDE, // 0x00 - KEY_UP, // 0x01 + 0, // 0x00 + 0, // 0x01 0, // 0x02 0, // 0x03 - KEY_PRINTSCREEN, // 0x04 - KEY_PAGE_DOWN, // 0x05 - KEY_LEFT_BRACE, // 0x06 - KEY_F11, // 0x07 - KEY_BACKSPACE, // 0x08 - KEY_TAB, // 0x09 - KEY_ENTER, // 0x0A - KEY_DOWN, // 0x0B - KEY_PAGE_UP, // 0x0C - KEYPAD_ENTER, // 0x0D - KEY_LEFT, // 0x0E - KEY_RIGHT, // 0x0F + 0, // 0x04 + 0, // 0x05 + 0, // 0x06 + 0, // 0x07 + 0, // 0x08 + 0, // 0x09 + 0, // 0x0A + 0, // 0x0B + 0, // 0x0C + 0, // 0x0D + 0, // 0x0E + 0, // 0x0F 0, // 0x10 - KEY_PAGE_UP, // 0x11 - KEY_F12, // 0x12 - KEY_PAGE_DOWN, // 0x13 - KEY_GUI, // 0x14 - KEY_F1, // 0x15 - KEY_F2, // 0x16 - KEY_F3, // 0x17 - KEY_F4, // 0x18 - KEY_F5, // 0x19 - KEY_F6, // 0x1A - KEY_ESC, // 0x1B - KEY_F7, // 0x1C - KEY_F8, // 0x1D - KEY_F9, // 0x1E - KEY_F10, // 0x1F - KEY_SPACE, // 0x20 - KEYPAD_9, // 0x21 - 0, // 0x22 - 0, // 0x23 - 0, // 0x24 - 0, // 0x25 - 0, // 0x26 - KEY_QUOTE, // 0x27 - 0, // 0x28 - 0, // 0x29 - 0, // 0x2A - KEY_EQUAL, // 0x2B - KEY_COMMA, // 0x2C - KEY_MINUS, // 0x2D - KEY_PERIOD, // 0x2E - KEY_SLASH, // 0x2F - KEY_0, // 0x30 - KEY_1, // 0x31 - KEY_2, // 0x32 - KEY_3, // 0x33 - KEY_4, // 0x34 - KEY_5, // 0x35 - KEY_6, // 0x36 - KEY_7, // 0x37 - KEY_8, // 0x38 - KEY_9, // 0x39 - 0, // 0x3A - KEY_O, // 0x3B + 0, // 0x11 + 0, // 0x12 + 0, // 0x13 + 0, // 0x14 + 0, // 0x15 + 0, // 0x16 + 0, // 0x17 + 0, // 0x18 + 0, // 0x19 + 0, // 0x1A + 0, // 0x1B + 0, // 0x1C + 0, // 0x1D + 0, // 0x1E + 0, // 0x1F + KEY_LEFT_SHIFT, // 0x20 + 0, // 0x21 + KEY_Z, // 0x22 + KEY_X, // 0x23 + KEY_C, // 0x24 + KEY_V, // 0x25 + KEY_B, // 0x26 + KEY_K, // 0x27 + KEY_M, // 0x28 + KEY_COMMA, // 0x29 + KEY_PERIOD, // 0x2A + KEY_SLASH, // 0x2B + 0, // 0x2C + KEY_RIGHT_SHIFT, // 0x2D + KEY_LEFT_ALT, // 0x2E + KEY_SPACE, // 0x2F + KEY_LEFT_CTRL, // 0x30 + KEY_A, // 0x31 + KEY_R, // 0x32 + KEY_S, // 0x33 + KEY_T, // 0x34 + KEY_D, // 0x35 + KEY_H, // 0x36 + KEY_N, // 0x37 + KEY_E, // 0x38 + KEY_I, // 0x39 + KEY_O, // 0x3A + KEY_QUOTE, // 0x3B 0, // 0x3C - KEY_EQUAL, // 0x3D - 0, // 0x3E - 0, // 0x3F - 0, // 0x40 - KEYPAD_6, // 0x41 - KEYPAD_MINUS, // 0x42 - KEY_PAUSE, // 0x43 - KEY_INSERT, // 0x44 - KEY_CTRL, // 0x45 - KEYPAD_2, // 0x46 - KEYPAD_3, // 0x47 - KEY_LEFT_SHIFT, // 0x48 - KEY_RIGHT_SHIFT, // 0x49 - KEYPAD_0, // 0x4A - KEYPAD_PERIOD, // 0x4B - KEY_LEFT_ALT, // 0x4C - KEY_RIGHT_ALT, // 0x4D - 0, // 0x4E - 0, // 0x4F - 0, // 0x50 - 0, // 0x51 - 0, // 0x52 - 0, // 0x53 - 0, // 0x54 - 0, // 0x55 - 0, // 0x56 - 0, // 0x57 - 0, // 0x58 - 0, // 0x59 - 0, // 0x5A - KEY_RIGHT_BRACE, // 0x5B - KEYPAD_7, // 0x5C - KEY_BACKSLASH, // 0x5D - KEY_ESC, // 0x5E - 0, // 0x5F - KEYPAD_1, // 0x60 - KEY_A, // 0x61 - KEY_B, // 0x62 - KEY_C, // 0x63 - KEY_S, // 0x64 - KEY_F, // 0x65 - KEY_T, // 0x66 - KEY_D, // 0x67 - KEY_H, // 0x68 - KEY_U, // 0x69 - KEY_N, // 0x6A - KEY_E, // 0x6B - KEY_I, // 0x6C - KEY_M, // 0x6D - KEY_K, // 0x6E - KEY_Y, // 0x6F - KEY_SEMICOLON, // 0x70 - KEY_Q, // 0x71 - KEY_P, // 0x72 - KEY_R, // 0x73 - KEY_G, // 0x74 - KEY_L, // 0x75 - KEY_V, // 0x76 - KEY_W, // 0x77 - KEY_X, // 0x78 - KEY_J, // 0x79 - KEY_Z, // 0x7A - KEYPAD_4, // 0x7B - KEYPAD_8, // 0x7C - KEYPAD_5, // 0x7D + KEY_ENTER, // 0x3D + KEY_RIGHT_GUI, // 0x3E + KEYPAD_1, // 0x3F + KEY_TAB, // 0x40 + KEY_Q, // 0x41 + KEY_W, // 0x42 + KEY_F, // 0x43 + KEY_P, // 0x44 + KEY_G, // 0x45 + KEY_J, // 0x46 + KEY_L, // 0x47 + KEY_U, // 0x48 + KEY_Y, // 0x49 + KEY_SEMICOLON, // 0x4A + KEY_LEFT_BRACE, // 0x4B + KEY_RIGHT_BRACE, // 0x4C + KEY_BACKSLASH, // 0x4D + KEY_DELETE, // 0x4E + KEYPAD_4, // 0x4F + KEY_ESC, // 0x50 + KEY_1, // 0x51 + KEY_2, // 0x52 + KEY_3, // 0x53 + KEY_4, // 0x54 + KEY_5, // 0x55 + KEY_6, // 0x56 + KEY_7, // 0x57 + KEY_8, // 0x58 + KEY_9, // 0x59 + KEY_0, // 0x5A + KEY_MINUS, // 0x5B + KEY_EQUAL, // 0x5C + KEY_TILDE, // 0x5D + KEY_BACKSPACE, // 0x5E + KEY_NUM_LOCK, // 0x5F + KEY_LEFT_GUI, // 0x60 + KEY_HOME, // 0x61 + KEY_END, // 0x62 + KEY_INSERT, // 0x63 + KEY_DELETE, // 0x64 + KEY_F1, // 0x65 + KEY_F2, // 0x66 + KEY_F3, // 0x67 + KEY_F4, // 0x68 + KEY_F5, // 0x69 + KEY_F6, // 0x6A + KEY_F7, // 0x6B + KEY_F8, // 0x6C + KEY_F9, // 0x6D + KEY_F10, // 0x6E + KEY_PRINTSCREEN, // 0x6F + KEY_PAGE_UP, // 0x70 + KEY_PAGE_DOWN, // 0x71 + KEY_F11, // 0x72 + KEYPAD_7, // 0x73 + KEYPAD_8, // 0x74 + KEYPAD_9, // 0x75 + KEYPAD_5, // 0x76 + KEYPAD_6, // 0x77 + KEYPAD_2, // 0x78 + KEYPAD_3, // 0x79 + KEYPAD_0, // 0x7A + KEYPAD_00, // 0x7B + KEYPAD_ENTER, // 0x7C + 0, // 0x7D 0, // 0x7E - KEY_DELETE, // 0x7F + 0, // 0x7F }; diff --git a/Macro/buffer/macro.c b/Macro/buffer/macro.c index 23e5138..fbada9f 100644 --- a/Macro/buffer/macro.c +++ b/Macro/buffer/macro.c @@ -215,6 +215,7 @@ int scancodeMacro( uint8_t scanCode ) } return 1; */ + /* // BudKeypad // Is this a bootloader sequence key? if ( !Bootloader_KeyDetected @@ -240,6 +241,7 @@ int scancodeMacro( uint8_t scanCode ) Bootloader_ConditionState = 0; erro_dPrint("Arg"); } + */ return 0; } diff --git a/Scan/BETKB/scan_loop.c b/Scan/BETKB/scan_loop.c index 6247592..80eba16 100644 --- a/Scan/BETKB/scan_loop.c +++ b/Scan/BETKB/scan_loop.c @@ -67,6 +67,7 @@ volatile uint8_t BufferReadyToClear; // ----- Function Declarations ----- void processKeyValue( uint8_t keyValue ); +void removeKeyValue( uint8_t keyValue ); @@ -78,36 +79,37 @@ ISR(USART1_RX_vect) cli(); // Disable Interrupts uint8_t keyValue = 0x00; + uint8_t keyState = 0x00; - // The interrupt is always for the first item of the packet set, reset the buffer - KeyIndex_BufferUsed = 0; + // Read the scancode packet from the USART (1st to 8th bits) + keyValue = UDR1; - // Only the first 7 bits have scancode data - // The last packet of the packet set has the 8th bit high, all the others are low - // - // Interrupts are too slow for the rest of the packet set, poll for the rest - while ( 1 ) + // Read the release/press bit (9th bit) XXX Unnecessary, and wrong it seems, parity bit? or something else? + keyState = UCSR1B & 0x02; + + // High bit of keyValue, also represents press/release + keyState = keyValue & 0x80 ? 0x00 : 0x02; + + // Debug + char tmpStr[6]; + hexToStr( keyValue & 0x7F, tmpStr ); + + // Process the scancode + switch ( keyState ) { - // Read the raw packet from the USART - keyValue = UDR1; + case 0x00: // Released + dPrintStrs( tmpStr, "R " ); // Debug - // Debug - char tmpStr[6]; - hexToStr( keyValue, tmpStr ); - dPrintStrs( tmpStr, " " ); + // Remove key from press buffer + removeKeyValue( keyValue & 0x7F ); + break; - // Process the scancode - processKeyValue( keyValue ); + case 0x02: // Pressed + dPrintStrs( tmpStr, "P " ); // Debug - // Last packet of the set - if ( keyValue & 0x80 ) - { - dPrintStrs( "**" ); - break; - } - - // Delay enough so we don't run into the same packet (or the previous buffered packet) - _delay_us(10000); + // New key to process + processKeyValue( keyValue & 0x7F ); + break; } sei(); // Re-enable Interrupts @@ -156,23 +158,9 @@ inline uint8_t scan_loop() // TODO void processKeyValue( uint8_t keyValue ) { - // Finalize output buffer - // Mask 8th bit - keyValue &= 0x7F; - // Interpret scan code switch ( keyValue ) { - case 0x40: // Clear buffer command - info_print("CLEAR!"); - - BufferReadyToClear = 1; - break; - case 0x7F: - scan_lockKeyboard(); - _delay_ms(3000); - scan_unlockKeyboard(); - default: // Make sure the key isn't already in the buffer for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ ) @@ -192,6 +180,36 @@ void processKeyValue( uint8_t keyValue ) } } +void removeKeyValue( uint8_t keyValue ) +{ + // Check for the released key, and shift the other keys lower on the buffer + uint8_t c; + for ( c = 0; c < KeyIndex_BufferUsed; c++ ) + { + // Key to release found + if ( KeyIndex_Buffer[c] == keyValue ) + { + // Shift keys from c position + for ( uint8_t k = c; k < KeyIndex_BufferUsed - 1; k++ ) + KeyIndex_Buffer[k] = KeyIndex_Buffer[k + 1]; + + // Decrement Buffer + KeyIndex_BufferUsed--; + + break; + } + } + + // Error case (no key to release) + if ( c == KeyIndex_BufferUsed + 1 ) + { + errorLED( 1 ); + char tmpStr[6]; + hexToStr( keyValue, tmpStr ); + erro_dPrint( "Could not find key to release: ", tmpStr ); + } +} + // Send data uint8_t scan_sendData( uint8_t dataPayload ) { @@ -210,24 +228,6 @@ void scan_finishedWithBuffer( void ) // TODO void scan_finishedWithUSBBuffer( void ) { - /* - uint8_t foundModifiers = 0; - - // Look for all of the modifiers present, there is a max of 8 (but only keys for 5 on the HASCI version) - for ( uint8_t c = 0; c < KeyIndex_BufferUsed; c++ ) - { - // The modifier range is from 0x80 to 0x8F (well, the last bit is the ON/OFF signal, but whatever...) - if ( KeyIndex_Buffer[c] <= 0x8F && KeyIndex_Buffer[c] >= 0x80 ) - { - // Add the modifier back into the the Key Buffer - KeyIndex_Buffer[foundModifiers] = KeyIndex_Buffer[c]; - foundModifiers++; - } - } - - // Adjust the size of the new Key Buffer - KeyIndex_BufferUsed = foundModifiers; - */ } // Reset/Hold keyboard diff --git a/Scan/BETKB/scan_loop.h b/Scan/BETKB/scan_loop.h index 65522a2..46f956b 100644 --- a/Scan/BETKB/scan_loop.h +++ b/Scan/BETKB/scan_loop.h @@ -33,7 +33,7 @@ // ----- Defines ----- -#define KEYBOARD_SIZE 0x100 // 255 - Size of the array space for the keyboard(max index) +#define KEYBOARD_SIZE 0x7F // 127 - Size of the array space for the keyboard(max index) #define KEYBOARD_BUFFER 24 // Max number of key signals to buffer