# HG changeset patch # User Jacob Alexander # Date 1332821083 14400 # Node ID 8eee22f99cae3fd492fa3f0fc9465a8dc67a06b3 # Parent 0ee2207c5919dd38c939ea44ffec08d60e657a96 Completing the BETKB support - Keyboard is fully functional - LED, Beeper, and keyboard input not yet implemented diff -r 0ee2207c5919 -r 8eee22f99cae Keymap/betkb.h --- a/Keymap/betkb.h Mon Mar 26 19:02:46 2012 -0400 +++ b/Keymap/betkb.h Tue Mar 27 00:04:43 2012 -0400 @@ -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 -r 0ee2207c5919 -r 8eee22f99cae Macro/buffer/macro.c --- a/Macro/buffer/macro.c Mon Mar 26 19:02:46 2012 -0400 +++ b/Macro/buffer/macro.c Tue Mar 27 00:04:43 2012 -0400 @@ -215,6 +215,7 @@ } return 1; */ + /* // BudKeypad // Is this a bootloader sequence key? if ( !Bootloader_KeyDetected @@ -240,6 +241,7 @@ Bootloader_ConditionState = 0; erro_dPrint("Arg"); } + */ return 0; } diff -r 0ee2207c5919 -r 8eee22f99cae Scan/BETKB/scan_loop.c --- a/Scan/BETKB/scan_loop.c Mon Mar 26 19:02:46 2012 -0400 +++ b/Scan/BETKB/scan_loop.c Tue Mar 27 00:04:43 2012 -0400 @@ -67,6 +67,7 @@ // ----- Function Declarations ----- void processKeyValue( uint8_t keyValue ); +void removeKeyValue( uint8_t keyValue ); @@ -78,36 +79,37 @@ 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 raw packet from the USART - keyValue = UDR1; + // 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 ); - // Debug - char tmpStr[6]; - hexToStr( keyValue, tmpStr ); - dPrintStrs( tmpStr, " " ); - - // Process the scancode - processKeyValue( keyValue ); + // Process the scancode + switch ( keyState ) + { + case 0x00: // Released + dPrintStrs( tmpStr, "R " ); // Debug - // Last packet of the set - if ( keyValue & 0x80 ) - { - dPrintStrs( "**" ); - break; - } + // Remove key from press buffer + removeKeyValue( keyValue & 0x7F ); + break; - // Delay enough so we don't run into the same packet (or the previous buffered packet) - _delay_us(10000); + case 0x02: // Pressed + dPrintStrs( tmpStr, "P " ); // Debug + + // New key to process + processKeyValue( keyValue & 0x7F ); + break; } sei(); // Re-enable Interrupts @@ -156,23 +158,9 @@ // 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 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 @@ // 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 -r 0ee2207c5919 -r 8eee22f99cae Scan/BETKB/scan_loop.h --- a/Scan/BETKB/scan_loop.h Mon Mar 26 19:02:46 2012 -0400 +++ b/Scan/BETKB/scan_loop.h Tue Mar 27 00:04:43 2012 -0400 @@ -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