From 6dc6c4323893ec09171cf3f9d88d4e2a49d4b2f5 Mon Sep 17 00:00:00 2001 From: Robert Csordas Date: Sat, 12 Nov 2016 19:07:39 +0100 Subject: [PATCH 1/7] Able to type. --- right/src/led_driver.c | 2 +- right/src/usb_interface_keyboard.c | 84 +++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/right/src/led_driver.c b/right/src/led_driver.c index ab65132..4ddb2a0 100644 --- a/right/src/led_driver.c +++ b/right/src/led_driver.c @@ -42,7 +42,7 @@ void LedDriver_EnableAllLeds() LedDriver_WriteRegister(address, i, 0x00); } for (i=FRAME_REGISTER_PWM_FIRST; i<=FRAME_REGISTER_PWM_LAST; i++) { - LedDriver_WriteRegister(address, i, 0xff); + LedDriver_WriteRegister(address, i, 0x00); } } } diff --git a/right/src/usb_interface_keyboard.c b/right/src/usb_interface_keyboard.c index 673ecd5..2f76711 100644 --- a/right/src/usb_interface_keyboard.c +++ b/right/src/usb_interface_keyboard.c @@ -68,6 +68,86 @@ key_matrix_t keyMatrix = { #define KEY_STATE_COUNT (5*7) uint8_t leftKeyStates[KEY_STATE_COUNT] = {0}; +uint8_t scancodes[]={ + HID_KEYBOARD_SC_7_AND_AMPERSAND, + HID_KEYBOARD_SC_8_AND_ASTERISK, + HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS, + HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS, + HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE, + HID_KEYBOARD_SC_EQUAL_AND_PLUS, + HID_KEYBOARD_SC_BACKSPACE, + HID_KEYBOARD_SC_U, + HID_KEYBOARD_SC_I, + HID_KEYBOARD_SC_O, + HID_KEYBOARD_SC_P, + HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE, + HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE, + HID_KEYBOARD_SC_BACKSLASH_AND_PIPE, + HID_KEYBOARD_SC_Y, + HID_KEYBOARD_SC_J, + HID_KEYBOARD_SC_K, + HID_KEYBOARD_SC_L, + HID_KEYBOARD_SC_SEMICOLON_AND_COLON, + HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE, + HID_KEYBOARD_SC_ENTER, + HID_KEYBOARD_SC_H, + HID_KEYBOARD_SC_N, + HID_KEYBOARD_SC_M, + HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN, + HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN, + HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK, + HID_KEYBOARD_SC_RIGHT_SHIFT, + HID_KEYBOARD_SC_A, //?? + HID_KEYBOARD_SC_SPACE, + HID_KEYBOARD_SC_A, //?? + HID_KEYBOARD_SC_SPACE, //Fn + HID_KEYBOARD_SC_RIGHT_ALT, + HID_KEYBOARD_SC_RIGHT_GUI, + HID_KEYBOARD_SC_RIGHT_CONTROL, + //Left half + HID_KEYBOARD_SC_KEYPAD_1_AND_END, + HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW, + HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN, + HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW, + HID_KEYBOARD_SC_KEYPAD_5, + HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW, + HID_KEYBOARD_SC_TAB, + HID_KEYBOARD_SC_Q, + HID_KEYBOARD_SC_W, + HID_KEYBOARD_SC_E, + HID_KEYBOARD_SC_R, + HID_KEYBOARD_SC_A, //?? + HID_KEYBOARD_SC_T, + HID_KEYBOARD_SC_CAPS_LOCK, + HID_KEYBOARD_SC_A, + HID_KEYBOARD_SC_S, + HID_KEYBOARD_SC_D, + HID_KEYBOARD_SC_F, + HID_KEYBOARD_SC_A, //?? + HID_KEYBOARD_SC_G, + HID_KEYBOARD_SC_LEFT_SHIFT, + HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE, //no idea if this is the right one, + HID_KEYBOARD_SC_Z, + HID_KEYBOARD_SC_X, + HID_KEYBOARD_SC_C, + HID_KEYBOARD_SC_V, + HID_KEYBOARD_SC_B, + HID_KEYBOARD_SC_LEFT_CONTROL, + HID_KEYBOARD_SC_LEFT_GUI, + HID_KEYBOARD_SC_LEFT_ALT, + HID_KEYBOARD_SC_SPACE, //Fn + HID_KEYBOARD_SC_A, //?? + HID_KEYBOARD_SC_SPACE, //Mod +}; + +static uint8_t getKeycode(uint8_t keyId) +{ + if (keyId Date: Sat, 12 Nov 2016 20:25:15 +0100 Subject: [PATCH 2/7] Fixes+mod keys --- right/src/usb_interface_keyboard.c | 169 ++++++++++++++++------------- 1 file changed, 96 insertions(+), 73 deletions(-) diff --git a/right/src/usb_interface_keyboard.c b/right/src/usb_interface_keyboard.c index 2f76711..6ee1163 100644 --- a/right/src/usb_interface_keyboard.c +++ b/right/src/usb_interface_keyboard.c @@ -68,86 +68,102 @@ key_matrix_t keyMatrix = { #define KEY_STATE_COUNT (5*7) uint8_t leftKeyStates[KEY_STATE_COUNT] = {0}; -uint8_t scancodes[]={ - HID_KEYBOARD_SC_7_AND_AMPERSAND, - HID_KEYBOARD_SC_8_AND_ASTERISK, - HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS, - HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS, - HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE, - HID_KEYBOARD_SC_EQUAL_AND_PLUS, - HID_KEYBOARD_SC_BACKSPACE, - HID_KEYBOARD_SC_U, - HID_KEYBOARD_SC_I, - HID_KEYBOARD_SC_O, - HID_KEYBOARD_SC_P, - HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE, - HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE, - HID_KEYBOARD_SC_BACKSLASH_AND_PIPE, - HID_KEYBOARD_SC_Y, - HID_KEYBOARD_SC_J, - HID_KEYBOARD_SC_K, - HID_KEYBOARD_SC_L, - HID_KEYBOARD_SC_SEMICOLON_AND_COLON, - HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE, - HID_KEYBOARD_SC_ENTER, - HID_KEYBOARD_SC_H, - HID_KEYBOARD_SC_N, - HID_KEYBOARD_SC_M, - HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN, - HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN, - HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK, - HID_KEYBOARD_SC_RIGHT_SHIFT, - HID_KEYBOARD_SC_A, //?? - HID_KEYBOARD_SC_SPACE, - HID_KEYBOARD_SC_A, //?? - HID_KEYBOARD_SC_SPACE, //Fn - HID_KEYBOARD_SC_RIGHT_ALT, - HID_KEYBOARD_SC_RIGHT_GUI, - HID_KEYBOARD_SC_RIGHT_CONTROL, +uint8_t defaultLayout[][2]={ + {HID_KEYBOARD_SC_7_AND_AMPERSAND, HID_KEYBOARD_SC_F7}, + {HID_KEYBOARD_SC_8_AND_ASTERISK, HID_KEYBOARD_SC_F8}, + {HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS, HID_KEYBOARD_SC_F9}, + {HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS, HID_KEYBOARD_SC_F10}, + {HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE, HID_KEYBOARD_SC_F11}, + {HID_KEYBOARD_SC_EQUAL_AND_PLUS, HID_KEYBOARD_SC_F12}, + {HID_KEYBOARD_SC_BACKSPACE, HID_KEYBOARD_SC_DELETE}, + {HID_KEYBOARD_SC_U}, + {HID_KEYBOARD_SC_I, HID_KEYBOARD_SC_UP_ARROW}, + {HID_KEYBOARD_SC_O}, + {HID_KEYBOARD_SC_P, HID_KEYBOARD_SC_PRINT_SCREEN}, + {HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE, HID_KEYBOARD_SC_SCROLL_LOCK}, + {HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE, HID_KEYBOARD_SC_PAUSE}, + {HID_KEYBOARD_SC_BACKSLASH_AND_PIPE}, + {HID_KEYBOARD_SC_Y, HID_KEYBOARD_SC_PAGE_UP}, + {HID_KEYBOARD_SC_J, HID_KEYBOARD_SC_LEFT_ARROW}, + {HID_KEYBOARD_SC_K, HID_KEYBOARD_SC_DOWN_ARROW}, + {HID_KEYBOARD_SC_L, HID_KEYBOARD_SC_RIGHT_ARROW}, + {HID_KEYBOARD_SC_SEMICOLON_AND_COLON}, + {HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE}, + {HID_KEYBOARD_SC_ENTER}, + {HID_KEYBOARD_SC_H, HID_KEYBOARD_SC_PAGE_DOWN}, + {HID_KEYBOARD_SC_N, HID_KEYBOARD_SC_MEDIA_MUTE}, + {HID_KEYBOARD_SC_M}, + {HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN}, + {HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN}, + {HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK}, + {HID_KEYBOARD_SC_RIGHT_SHIFT}, + {0}, //?? + {HID_KEYBOARD_SC_SPACE}, + {0}, //?? + {0}, //Fn + {HID_KEYBOARD_SC_RIGHT_ALT}, + {HID_KEYBOARD_SC_RIGHT_GUI}, + {HID_KEYBOARD_SC_RIGHT_CONTROL}, //Left half - HID_KEYBOARD_SC_KEYPAD_1_AND_END, - HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW, - HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN, - HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW, - HID_KEYBOARD_SC_KEYPAD_5, - HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW, - HID_KEYBOARD_SC_TAB, - HID_KEYBOARD_SC_Q, - HID_KEYBOARD_SC_W, - HID_KEYBOARD_SC_E, - HID_KEYBOARD_SC_R, - HID_KEYBOARD_SC_A, //?? - HID_KEYBOARD_SC_T, - HID_KEYBOARD_SC_CAPS_LOCK, - HID_KEYBOARD_SC_A, - HID_KEYBOARD_SC_S, - HID_KEYBOARD_SC_D, - HID_KEYBOARD_SC_F, - HID_KEYBOARD_SC_A, //?? - HID_KEYBOARD_SC_G, - HID_KEYBOARD_SC_LEFT_SHIFT, - HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE, //no idea if this is the right one, - HID_KEYBOARD_SC_Z, - HID_KEYBOARD_SC_X, - HID_KEYBOARD_SC_C, - HID_KEYBOARD_SC_V, - HID_KEYBOARD_SC_B, - HID_KEYBOARD_SC_LEFT_CONTROL, - HID_KEYBOARD_SC_LEFT_GUI, - HID_KEYBOARD_SC_LEFT_ALT, - HID_KEYBOARD_SC_SPACE, //Fn - HID_KEYBOARD_SC_A, //?? - HID_KEYBOARD_SC_SPACE, //Mod + {HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE, HID_KEYBOARD_SC_ESCAPE}, + {HID_KEYBOARD_SC_1_AND_EXCLAMATION, HID_KEYBOARD_SC_F1}, + {HID_KEYBOARD_SC_2_AND_AT, HID_KEYBOARD_SC_F2}, + {HID_KEYBOARD_SC_3_AND_HASHMARK, HID_KEYBOARD_SC_F3}, + {HID_KEYBOARD_SC_4_AND_DOLLAR, HID_KEYBOARD_SC_F4}, + {HID_KEYBOARD_SC_5_AND_PERCENTAGE, HID_KEYBOARD_SC_F5}, + {HID_KEYBOARD_SC_6_AND_CARET, HID_KEYBOARD_SC_F6}, + {HID_KEYBOARD_SC_TAB}, + {HID_KEYBOARD_SC_Q}, + {HID_KEYBOARD_SC_W, HID_KEYBOARD_SC_UP_ARROW}, + {HID_KEYBOARD_SC_E}, + {HID_KEYBOARD_SC_R}, + {0}, //?? + {HID_KEYBOARD_SC_T, HID_KEYBOARD_SC_HOME}, + {HID_KEYBOARD_SC_CAPS_LOCK}, + {HID_KEYBOARD_SC_A, HID_KEYBOARD_SC_LEFT_ARROW}, + {HID_KEYBOARD_SC_S, HID_KEYBOARD_SC_DOWN_ARROW}, + {HID_KEYBOARD_SC_D, HID_KEYBOARD_SC_RIGHT_ARROW}, + {HID_KEYBOARD_SC_F, HID_KEYBOARD_SC_DELETE}, + {0}, //?? + {HID_KEYBOARD_SC_G, HID_KEYBOARD_SC_END}, + {HID_KEYBOARD_SC_LEFT_SHIFT}, + {HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE}, //no idea if this is the right one}, + {HID_KEYBOARD_SC_Z, HID_KEYBOARD_SC_MEDIA_BACKWARD}, + {HID_KEYBOARD_SC_X, HID_KEYBOARD_SC_MEDIA_PLAY}, + {HID_KEYBOARD_SC_C, HID_KEYBOARD_SC_MEDIA_FORWARD}, + {HID_KEYBOARD_SC_V, HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN}, + {HID_KEYBOARD_SC_B, HID_KEYBOARD_SC_MEDIA_VOLUME_UP}, + {HID_KEYBOARD_SC_LEFT_CONTROL}, + {HID_KEYBOARD_SC_LEFT_GUI}, + {HID_KEYBOARD_SC_LEFT_ALT}, + {0}, //Fn + {0}, //?? + {0}, //Mod }; + +#define MOD_PRESSED 1 +#define FN_PRESSED 2 + +#define MOD_KEYID 33 +#define LEFT_FN 30 +#define RIGHT_FN 33 + +#define LEFT_OFFSET 35 + +static uint8_t modifierState=0; + static uint8_t getKeycode(uint8_t keyId) { + int activeIndex = (modifierState & MOD_PRESSED) ? 1 : 0; + if (keyId Date: Sat, 12 Nov 2016 20:31:59 +0100 Subject: [PATCH 3/7] Fix typo+basic power management --- right/src/main.c | 4 +++- right/src/usb_interface_keyboard.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/right/src/main.c b/right/src/main.c index c9ba028..4794a6c 100644 --- a/right/src/main.c +++ b/right/src/main.c @@ -9,5 +9,7 @@ void main() { LedDriver_EnableAllLeds(); InitUsb(); - while (1); + while (1){ + asm("wfi"); + } } diff --git a/right/src/usb_interface_keyboard.c b/right/src/usb_interface_keyboard.c index 6ee1163..f18f685 100644 --- a/right/src/usb_interface_keyboard.c +++ b/right/src/usb_interface_keyboard.c @@ -157,7 +157,7 @@ static uint8_t getKeycode(uint8_t keyId) { int activeIndex = (modifierState & MOD_PRESSED) ? 1 : 0; - if (keyId Date: Sun, 13 Nov 2016 11:25:29 +0100 Subject: [PATCH 4/7] Refactoring and bugfixes. --- .../build/kds/.settings/language.settings.xml | 4 +- right/build/kds/.gitignore | 1 + .../build/kds/.settings/language.settings.xml | 4 +- .../build/kds/uhk-right release jlink.launch | 2 +- right/src/default_layout.c | 77 ++++++++++++ right/src/default_layout.h | 17 +++ right/src/keyboard_layout.h | 57 +++++++++ right/src/usb_interface_keyboard.c | 118 +++--------------- 8 files changed, 171 insertions(+), 109 deletions(-) create mode 100644 right/build/kds/.gitignore create mode 100644 right/src/default_layout.c create mode 100644 right/src/default_layout.h create mode 100644 right/src/keyboard_layout.h diff --git a/left/build/kds/.settings/language.settings.xml b/left/build/kds/.settings/language.settings.xml index 8a3e35d..2fd83ce 100644 --- a/left/build/kds/.settings/language.settings.xml +++ b/left/build/kds/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/right/build/kds/.gitignore b/right/build/kds/.gitignore new file mode 100644 index 0000000..530774c --- /dev/null +++ b/right/build/kds/.gitignore @@ -0,0 +1 @@ +/debug diff --git a/right/build/kds/.settings/language.settings.xml b/right/build/kds/.settings/language.settings.xml index dbd3995..4bdb3e2 100644 --- a/right/build/kds/.settings/language.settings.xml +++ b/right/build/kds/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/right/build/kds/uhk-right release jlink.launch b/right/build/kds/uhk-right release jlink.launch index 82c79b5..d223d70 100644 --- a/right/build/kds/uhk-right release jlink.launch +++ b/right/build/kds/uhk-right release jlink.launch @@ -70,7 +70,7 @@ - + diff --git a/right/src/default_layout.c b/right/src/default_layout.c new file mode 100644 index 0000000..b065827 --- /dev/null +++ b/right/src/default_layout.c @@ -0,0 +1,77 @@ +#include "default_layout.h" + +KEYBOARD_LAYOUT(defaultKeyboardLayout)={ + {HID_KEYBOARD_SC_7_AND_AMPERSAND, HID_KEYBOARD_SC_F7}, + {HID_KEYBOARD_SC_8_AND_ASTERISK, HID_KEYBOARD_SC_F8}, + {HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS, HID_KEYBOARD_SC_F9}, + {HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS, HID_KEYBOARD_SC_F10}, + {HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE, HID_KEYBOARD_SC_F11}, + {HID_KEYBOARD_SC_EQUAL_AND_PLUS, HID_KEYBOARD_SC_F12}, + {HID_KEYBOARD_SC_BACKSPACE, HID_KEYBOARD_SC_DELETE}, + {HID_KEYBOARD_SC_U}, + {HID_KEYBOARD_SC_I, HID_KEYBOARD_SC_UP_ARROW}, + {HID_KEYBOARD_SC_O}, + {HID_KEYBOARD_SC_P, HID_KEYBOARD_SC_PRINT_SCREEN}, + {HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE, HID_KEYBOARD_SC_SCROLL_LOCK}, + {HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE, HID_KEYBOARD_SC_PAUSE}, + {HID_KEYBOARD_SC_BACKSLASH_AND_PIPE}, + {HID_KEYBOARD_SC_Y, HID_KEYBOARD_SC_PAGE_UP}, + {HID_KEYBOARD_SC_J, HID_KEYBOARD_SC_LEFT_ARROW}, + {HID_KEYBOARD_SC_K, HID_KEYBOARD_SC_DOWN_ARROW}, + {HID_KEYBOARD_SC_L, HID_KEYBOARD_SC_RIGHT_ARROW}, + {HID_KEYBOARD_SC_SEMICOLON_AND_COLON}, + {HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE}, + {HID_KEYBOARD_SC_ENTER}, + {HID_KEYBOARD_SC_H, HID_KEYBOARD_SC_PAGE_DOWN}, + {HID_KEYBOARD_SC_N, HID_KEYBOARD_SC_MEDIA_MUTE}, + {HID_KEYBOARD_SC_M}, + {HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN}, + {HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN}, + {HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK}, + {HID_KEYBOARD_SC_RIGHT_SHIFT}, + {0}, //?? + {HID_KEYBOARD_SC_SPACE}, + {0}, //?? + {0}, //Fn + {HID_KEYBOARD_SC_RIGHT_ALT}, + {HID_KEYBOARD_SC_RIGHT_GUI}, + {HID_KEYBOARD_SC_RIGHT_CONTROL}, + + //Left half + {HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE, HID_KEYBOARD_SC_ESCAPE}, + {HID_KEYBOARD_SC_1_AND_EXCLAMATION, HID_KEYBOARD_SC_F1}, + {HID_KEYBOARD_SC_2_AND_AT, HID_KEYBOARD_SC_F2}, + {HID_KEYBOARD_SC_3_AND_HASHMARK, HID_KEYBOARD_SC_F3}, + {HID_KEYBOARD_SC_4_AND_DOLLAR, HID_KEYBOARD_SC_F4}, + {HID_KEYBOARD_SC_5_AND_PERCENTAGE, HID_KEYBOARD_SC_F5}, + {HID_KEYBOARD_SC_6_AND_CARET, HID_KEYBOARD_SC_F6}, + {HID_KEYBOARD_SC_TAB}, + {HID_KEYBOARD_SC_Q}, + {HID_KEYBOARD_SC_W, HID_KEYBOARD_SC_UP_ARROW}, + {HID_KEYBOARD_SC_E}, + {HID_KEYBOARD_SC_R}, + {0}, //?? + {HID_KEYBOARD_SC_T, HID_KEYBOARD_SC_HOME}, + {HID_KEYBOARD_SC_CAPS_LOCK}, + {HID_KEYBOARD_SC_A, HID_KEYBOARD_SC_LEFT_ARROW}, + {HID_KEYBOARD_SC_S, HID_KEYBOARD_SC_DOWN_ARROW}, + {HID_KEYBOARD_SC_D, HID_KEYBOARD_SC_RIGHT_ARROW}, + {HID_KEYBOARD_SC_F, HID_KEYBOARD_SC_DELETE}, + {0}, //?? + {HID_KEYBOARD_SC_G, HID_KEYBOARD_SC_END}, + {HID_KEYBOARD_SC_LEFT_SHIFT}, + {HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE}, //no idea if this is the right one}, + {HID_KEYBOARD_SC_Z, HID_KEYBOARD_SC_MEDIA_BACKWARD}, + {HID_KEYBOARD_SC_X, HID_KEYBOARD_SC_MEDIA_PLAY}, + {HID_KEYBOARD_SC_C, HID_KEYBOARD_SC_MEDIA_FORWARD}, + {HID_KEYBOARD_SC_V, HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN}, + {HID_KEYBOARD_SC_B, HID_KEYBOARD_SC_MEDIA_VOLUME_UP}, + {HID_KEYBOARD_SC_LEFT_CONTROL}, + {HID_KEYBOARD_SC_LEFT_GUI}, + {HID_KEYBOARD_SC_LEFT_ALT}, + {0}, //Fn + {0}, //?? + {0}, //Mod + {0} //?? +}; + diff --git a/right/src/default_layout.h b/right/src/default_layout.h new file mode 100644 index 0000000..f28875f --- /dev/null +++ b/right/src/default_layout.h @@ -0,0 +1,17 @@ +/* + * default_layout.h + * + * Created on: 2016 nov. 13 + * Author: xdever + */ + +#ifndef SRC_DEFAULT_LAYOUT_H_ +#define SRC_DEFAULT_LAYOUT_H_ + +#include +#include "keyboard_layout.h" + +extern KEYBOARD_LAYOUT(defaultKeyboardLayout); + + +#endif /* SRC_DEFAULT_LAYOUT_H_ */ diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h new file mode 100644 index 0000000..1df1e6e --- /dev/null +++ b/right/src/keyboard_layout.h @@ -0,0 +1,57 @@ +#ifndef KEYBOARD_LAYOUT_H_ +#define KEYBOARD_LAYOUT_H_ + +#include +#include "lufa/HIDClassCommon.h" + +/** + * Keyboard layout is a 2D array of scan codes. + * + * First dimension is the Key ID of a given key. Key IDs are the indices of the + * of the active keys of the key_matrix_t structure. In case of left half, an + * offset of 35 is added. + * + * For each Key ID, there are 4 different possible scan codes: + * - default, when no modifiers are pressed + * - mod layer + * - fn layer + * - mod+fn layer + * + */ + +#define KEY_STATE_COUNT (5*7) + +#define LAYOUT_KEY_COUNT 70 +#define LAYOUT_MOD_COUNT 4 + +#define LAYOUT_LEFT_OFFSET KEY_STATE_COUNT + +#define KEYBOARD_LAYOUT(name) const uint8_t name[LAYOUT_KEY_COUNT][LAYOUT_MOD_COUNT] + +#define KEYID_LEFT_MOD 33 +#define KEYID_LEFT_FN 31 +#define KEYID_RIGHT_FN 31 + +#define MODIFIER_MOD_PRESSED 1 +#define MODIFIER_FN_PRESSED 2 + + +static inline __attribute__((always_inline)) uint8_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId, uint8_t modifierState) +{ + if (keyId=USB_KEYBOARD_MAX_KEYS) + break; + + if (keyMatrix.keyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, keyId, modifierState); if (code) UsbKeyboardReport.scancodes[scancodeIdx++] = code; } } for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) + break; + + if (leftKeyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, LAYOUT_LEFT_OFFSET+keyId, modifierState); if (code) UsbKeyboardReport.scancodes[scancodeIdx++] = code; } From f2d3963b14d1d0397945780972377dc0d526ea2d Mon Sep 17 00:00:00 2001 From: Robert Csordas Date: Sun, 13 Nov 2016 11:29:02 +0100 Subject: [PATCH 5/7] Remove eclipse's bullshit. --- right/src/default_layout.h | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/right/src/default_layout.h b/right/src/default_layout.h index f28875f..3b830ba 100644 --- a/right/src/default_layout.h +++ b/right/src/default_layout.h @@ -1,10 +1,3 @@ -/* - * default_layout.h - * - * Created on: 2016 nov. 13 - * Author: xdever - */ - #ifndef SRC_DEFAULT_LAYOUT_H_ #define SRC_DEFAULT_LAYOUT_H_ @@ -13,5 +6,4 @@ extern KEYBOARD_LAYOUT(defaultKeyboardLayout); - -#endif /* SRC_DEFAULT_LAYOUT_H_ */ +#endif From fc434c7857ee2c42c80473b129c47efee4ff37ad Mon Sep 17 00:00:00 2001 From: Robert Csordas Date: Sun, 13 Nov 2016 15:50:49 +0100 Subject: [PATCH 6/7] Remove keyboard scanning from USB interrupt. Fix initial blink of LEDs when initializing. Coding style fixes. --- right/src/keyboard_layout.h | 20 +++-- right/src/led_driver.c | 8 +- right/src/led_driver.h | 2 +- right/src/main.c | 4 +- right/src/usb_interface_keyboard.c | 114 ++++++++++++++++++----------- right/src/usb_interface_keyboard.h | 1 + shared/i2c_adddresses.c | 8 +- shared/i2c_addresses.h | 4 +- 8 files changed, 99 insertions(+), 62 deletions(-) diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h index 1df1e6e..881ac0e 100644 --- a/right/src/keyboard_layout.h +++ b/right/src/keyboard_layout.h @@ -38,18 +38,26 @@ static inline __attribute__((always_inline)) uint8_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId, uint8_t modifierState) { - if (keyId=USB_KEYBOARD_MAX_KEYS) { + break; + } + + if (keyMatrix.keyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, keyId, modifierState); + if (code) { + UsbKeyboardReport[newLayout].scancodes[scancodeIdx++] = code; + } + } + } + + for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) { + break; + } + + if (leftKeyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, LAYOUT_LEFT_OFFSET+keyId, modifierState); + if (code) { + UsbKeyboardReport[newLayout].scancodes[scancodeIdx++] = code; + } + } + } + + //Change to the new layout in atomic operation (int copy). Even if + //the copy is not atomic itself, only single bit changes. So it can + //never be a problem + activeLayout = newLayout; +} static usb_status_t UsbKeyboardAction(void) { - uint8_t leftKeyStates[KEY_STATE_COUNT] = {0}; - - UsbKeyboardReport.modifiers = 0; - UsbKeyboardReport.reserved = 0; - - KeyMatrix_Init(&keyMatrix); - KeyMatrix_Scan(&keyMatrix); - - uint8_t scancodeIdx; - for (uint8_t scancodeIdx=0; scancodeIdx=USB_KEYBOARD_MAX_KEYS) - break; - - if (keyMatrix.keyStates[keyId]) { - uint8_t code=getKeycode(defaultKeyboardLayout, keyId, modifierState); - if (code) - UsbKeyboardReport.scancodes[scancodeIdx++] = code; - } - } - - for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) - break; - - if (leftKeyStates[keyId]) { - uint8_t code=getKeycode(defaultKeyboardLayout, LAYOUT_LEFT_OFFSET+keyId, modifierState); - if (code) - UsbKeyboardReport.scancodes[scancodeIdx++] = code; - } - } - return USB_DeviceHidSend(UsbCompositeDevice.keyboardHandle, USB_KEYBOARD_ENDPOINT_INDEX, - (uint8_t*)&UsbKeyboardReport, USB_KEYBOARD_REPORT_LENGTH); + (uint8_t*)&UsbKeyboardReport[activeLayout], USB_KEYBOARD_REPORT_LENGTH); } usb_status_t UsbKeyboardCallback(class_handle_t handle, uint32_t event, void *param) diff --git a/right/src/usb_interface_keyboard.h b/right/src/usb_interface_keyboard.h index b858751..c3fc84a 100644 --- a/right/src/usb_interface_keyboard.h +++ b/right/src/usb_interface_keyboard.h @@ -36,4 +36,5 @@ extern usb_status_t UsbKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration); extern usb_status_t UsbKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting); + extern void usbKeyboadTask(); #endif diff --git a/shared/i2c_adddresses.c b/shared/i2c_adddresses.c index 948d22b..3f3a650 100644 --- a/shared/i2c_adddresses.c +++ b/shared/i2c_adddresses.c @@ -1,7 +1,7 @@ #include "fsl_i2c.h" #include "i2c_addresses.h" -void I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) +status_t I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) { i2c_master_transfer_t masterXfer; masterXfer.slaveAddress = i2cAddress; @@ -11,10 +11,10 @@ void I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t s masterXfer.data = data; masterXfer.dataSize = size; masterXfer.flags = kI2C_TransferDefaultFlag; - I2C_MasterTransferBlocking(baseAddress, &masterXfer); + return I2C_MasterTransferBlocking(baseAddress, &masterXfer); } -void I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) +status_t I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size) { i2c_master_transfer_t masterXfer; masterXfer.slaveAddress = i2cAddress; @@ -24,5 +24,5 @@ void I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t masterXfer.data = data; masterXfer.dataSize = size; masterXfer.flags = kI2C_TransferDefaultFlag; - I2C_MasterTransferBlocking(baseAddress, &masterXfer); + return I2C_MasterTransferBlocking(baseAddress, &masterXfer); } diff --git a/shared/i2c_addresses.h b/shared/i2c_addresses.h index 687db97..5678d77 100644 --- a/shared/i2c_addresses.h +++ b/shared/i2c_addresses.h @@ -29,7 +29,7 @@ // Functions: - void I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); - void I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); + status_t I2cRead(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); + status_t I2cWrite(I2C_Type *baseAddress, uint8_t i2cAddress, uint8_t *data, uint8_t size); #endif From 93752a73478e9a41f3985e5838f7910bb3e7848c Mon Sep 17 00:00:00 2001 From: Robert Csordas Date: Sun, 13 Nov 2016 15:56:31 +0100 Subject: [PATCH 7/7] CPU suspend for left half --- left/src/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/left/src/main.c b/left/src/main.c index 7117ed8..51d23e6 100644 --- a/left/src/main.c +++ b/left/src/main.c @@ -78,5 +78,6 @@ int main(void) KeyMatrix_Init(&keyMatrix); while (1) { KeyMatrix_Scan(&keyMatrix); + asm("wfi"); } }