aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-11-28 19:58:09 +0100
committerLouis Burda <quent.burda@gmail.com>2022-11-28 19:58:09 +0100
commita7bfb47f666c8fadffb80b1beeee1905ad3fe029 (patch)
tree1b2f068f9492b011f6087b3b4938a80e5f0ab0c2 /src
parent7f1cf3407ab3ba4827053133a7a47901ce763c61 (diff)
downloadsxkbd-a7bfb47f666c8fadffb80b1beeee1905ad3fe029.tar.gz
sxkbd-a7bfb47f666c8fadffb80b1beeee1905ad3fe029.zip
Basic key matrix scan and keycode setup
Diffstat (limited to 'src')
-rw-r--r--src/board.h3
-rw-r--r--src/hid.c75
-rw-r--r--src/hid.h4
-rw-r--r--src/keycode.h513
-rw-r--r--src/keymap.c45
-rw-r--r--src/keymap.h6
-rw-r--r--src/keysym.h47
-rw-r--r--src/keysym_de.h149
-rw-r--r--src/keysym_us.h228
-rw-r--r--src/main.c38
-rw-r--r--src/util.c2
-rw-r--r--src/util.h2
12 files changed, 1087 insertions, 25 deletions
diff --git a/src/board.h b/src/board.h
index 77d1840..8e78a7c 100644
--- a/src/board.h
+++ b/src/board.h
@@ -13,3 +13,6 @@ enum {
};
extern struct neopix onboard_led;
+
+extern const uint32_t **keymap_layers;
+
diff --git a/src/hid.c b/src/hid.c
new file mode 100644
index 0000000..7ff1159
--- /dev/null
+++ b/src/hid.c
@@ -0,0 +1,75 @@
+#include "board.h"
+#include "util.h"
+
+#include "hardware/timer.h"
+
+#define KEY_ROWS ARRLEN(matrix_row_pins)
+#define KEY_COLS ARRLEN(matrix_col_pins)
+#define KEY_COUNT (KEY_ROWS * KEY_COLS)
+
+static void handle_press(uint x, uint y);
+static void handle_release(uint x, uint y);
+
+static const uint matrix_col_pins[] = { 4, 5, 6, 7 };
+static const uint matrix_row_pins[] = { 29, 28, 27, 26, 22, 20 };
+
+//static uint press_index = 0;
+static bool press_map[KEY_COUNT] = { 0 };
+//static uint32_t press_syms[KEY_COUNT] = { 0 };
+//static uint8_t press_order[KEY_COUNT] = { 0 };
+
+void
+handle_press(uint x, uint y)
+{
+
+}
+
+void
+handle_release(uint x, uint y)
+{
+
+}
+
+void
+hid_init(void)
+{
+ uint x, y;
+
+ for (y = 0; y < ARRLEN(matrix_row_pins); y++) {
+ gpio_init(matrix_row_pins[y]);
+ gpio_set_dir(matrix_row_pins[y], GPIO_IN);
+ gpio_pull_up(matrix_row_pins[y]);
+ }
+
+ for (x = 0; x < ARRLEN(matrix_col_pins); x++) {
+ gpio_init(matrix_col_pins[x]);
+ gpio_set_dir(matrix_col_pins[x], GPIO_OUT);
+ }
+}
+
+void
+hid_task(void)
+{
+ bool pressed;
+ uint x, y;
+
+ /* scan matrix */
+ for (y = 0; y < ARRLEN(matrix_row_pins); y++) {
+ for (x = 0; x < ARRLEN(matrix_col_pins); x++) {
+ gpio_put(matrix_col_pins[x], 0);
+ busy_wait_us(5);
+ pressed = !gpio_get(matrix_row_pins[y]);
+ if (pressed && !press_map[y * KEY_COLS + x]) {
+ handle_press(x, y);
+ press_map[y * KEY_COLS + x] = true;
+ } else if (!pressed && press_map[y * KEY_COLS + x]) {
+ handle_release(x, y);
+ press_map[y * KEY_COLS + x] = false;
+ }
+ gpio_put(matrix_col_pins[x], 1);
+ busy_wait_us(5);
+ }
+ }
+
+ /* assemble hid report */
+}
diff --git a/src/hid.h b/src/hid.h
new file mode 100644
index 0000000..9bb7ae6
--- /dev/null
+++ b/src/hid.h
@@ -0,0 +1,4 @@
+#pragma once
+
+void hid_init(void);
+void hid_task(void);
diff --git a/src/keycode.h b/src/keycode.h
new file mode 100644
index 0000000..b90004b
--- /dev/null
+++ b/src/keycode.h
@@ -0,0 +1,513 @@
+#pragma once
+/*
+ * Keycodes based on HID Keyboard/Keypad Usage Page (0x07) plus media keys from Generic Desktop Page (0x01) and Consumer Page (0x0C)
+ *
+ * See https://web.archive.org/web/20060218214400/http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
+ * or http://www.usb.org/developers/hidpage/Hut1_12v2.pdf (older)
+ */
+
+#define IS_ERROR(code) (KC_ROLL_OVER <= (code) && (code) <= KC_UNDEFINED)
+#define IS_ANY(code) (KC_A <= (code) && (code) <= 0xFF)
+#define IS_KEY(code) (KC_A <= (code) && (code) <= KC_EXSEL)
+#define IS_MOD(code) (KC_LEFT_CTRL <= (code) && (code) <= KC_RIGHT_GUI)
+
+#define IS_SPECIAL(code) ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
+#define IS_SYSTEM(code) (KC_PWR <= (code) && (code) <= KC_WAKE)
+#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_BRID)
+
+#define IS_MOUSEKEY(code) (KC_MS_UP <= (code) && (code) <= KC_MS_ACCEL2)
+#define IS_MOUSEKEY_MOVE(code) (KC_MS_UP <= (code) && (code) <= KC_MS_RIGHT)
+#define IS_MOUSEKEY_BUTTON(code) (KC_MS_BTN1 <= (code) && (code) <= KC_MS_BTN8)
+#define IS_MOUSEKEY_WHEEL(code) (KC_MS_WH_UP <= (code) && (code) <= KC_MS_WH_RIGHT)
+#define IS_MOUSEKEY_ACCEL(code) (KC_MS_ACCEL0 <= (code) && (code) <= KC_MS_ACCEL2)
+
+#define MOD_BIT(code) (1 << MOD_INDEX(code))
+#define MOD_INDEX(code) ((code)&0x07)
+
+#define MOD_MASK_CTRL (MOD_BIT(KC_LEFT_CTRL) | MOD_BIT(KC_RIGHT_CTRL))
+#define MOD_MASK_SHIFT (MOD_BIT(KC_LEFT_SHIFT) | MOD_BIT(KC_RIGHT_SHIFT))
+#define MOD_MASK_ALT (MOD_BIT(KC_LEFT_ALT) | MOD_BIT(KC_RIGHT_ALT))
+#define MOD_MASK_GUI (MOD_BIT(KC_LEFT_GUI) | MOD_BIT(KC_RIGHT_GUI))
+#define MOD_MASK_CS (MOD_MASK_CTRL | MOD_MASK_SHIFT)
+#define MOD_MASK_CA (MOD_MASK_CTRL | MOD_MASK_ALT)
+#define MOD_MASK_CG (MOD_MASK_CTRL | MOD_MASK_GUI)
+#define MOD_MASK_SA (MOD_MASK_SHIFT | MOD_MASK_ALT)
+#define MOD_MASK_SG (MOD_MASK_SHIFT | MOD_MASK_GUI)
+#define MOD_MASK_AG (MOD_MASK_ALT | MOD_MASK_GUI)
+#define MOD_MASK_CSA (MOD_MASK_CTRL | MOD_MASK_SHIFT | MOD_MASK_ALT)
+#define MOD_MASK_CSG (MOD_MASK_CTRL | MOD_MASK_SHIFT | MOD_MASK_GUI)
+#define MOD_MASK_CAG (MOD_MASK_CTRL | MOD_MASK_ALT | MOD_MASK_GUI)
+#define MOD_MASK_SAG (MOD_MASK_SHIFT | MOD_MASK_ALT | MOD_MASK_GUI)
+#define MOD_MASK_CSAG (MOD_MASK_CTRL | MOD_MASK_SHIFT | MOD_MASK_ALT | MOD_MASK_GUI)
+
+/* Short names for ease of definition of keymap */
+
+/* Transparent */
+#define KC_TRANSPARENT 0x01
+#define KC_TRNS KC_TRANSPARENT
+
+/* Punctuation */
+#define KC_ENT KC_ENTER
+#define KC_ESC KC_ESCAPE
+#define KC_BSPC KC_BACKSPACE
+#define KC_SPC KC_SPACE
+#define KC_MINS KC_MINUS
+#define KC_EQL KC_EQUAL
+#define KC_LBRC KC_LEFT_BRACKET
+#define KC_RBRC KC_RIGHT_BRACKET
+#define KC_BSLS KC_BACKSLASH
+#define KC_NUHS KC_NONUS_HASH
+#define KC_SCLN KC_SEMICOLON
+#define KC_QUOT KC_QUOTE
+#define KC_GRV KC_GRAVE
+#define KC_COMM KC_COMMA
+#define KC_SLSH KC_SLASH
+#define KC_NUBS KC_NONUS_BACKSLASH
+
+/* Lock Keys */
+#define KC_CAPS KC_CAPS_LOCK
+#define KC_SCRL KC_SCROLL_LOCK
+#define KC_NUM KC_NUM_LOCK
+#define KC_LCAP KC_LOCKING_CAPS_LOCK
+#define KC_LNUM KC_LOCKING_NUM_LOCK
+#define KC_LSCR KC_LOCKING_SCROLL_LOCK
+
+/* Commands */
+#define KC_PSCR KC_PRINT_SCREEN
+#define KC_PAUS KC_PAUSE
+#define KC_BRK KC_PAUSE
+#define KC_INS KC_INSERT
+#define KC_PGUP KC_PAGE_UP
+#define KC_DEL KC_DELETE
+#define KC_PGDN KC_PAGE_DOWN
+#define KC_RGHT KC_RIGHT
+#define KC_APP KC_APPLICATION
+#define KC_EXEC KC_EXECUTE
+#define KC_SLCT KC_SELECT
+#define KC_AGIN KC_AGAIN
+#define KC_PSTE KC_PASTE
+#define KC_ERAS KC_ALTERNATE_ERASE
+#define KC_SYRQ KC_SYSTEM_REQUEST
+#define KC_CNCL KC_CANCEL
+#define KC_CLR KC_CLEAR
+#define KC_PRIR KC_PRIOR
+#define KC_RETN KC_RETURN
+#define KC_SEPR KC_SEPARATOR
+#define KC_CLAG KC_CLEAR_AGAIN
+#define KC_CRSL KC_CRSEL
+#define KC_EXSL KC_EXSEL
+
+/* Keypad */
+#define KC_PSLS KC_KP_SLASH
+#define KC_PAST KC_KP_ASTERISK
+#define KC_PMNS KC_KP_MINUS
+#define KC_PPLS KC_KP_PLUS
+#define KC_PENT KC_KP_ENTER
+#define KC_P1 KC_KP_1
+#define KC_P2 KC_KP_2
+#define KC_P3 KC_KP_3
+#define KC_P4 KC_KP_4
+#define KC_P5 KC_KP_5
+#define KC_P6 KC_KP_6
+#define KC_P7 KC_KP_7
+#define KC_P8 KC_KP_8
+#define KC_P9 KC_KP_9
+#define KC_P0 KC_KP_0
+#define KC_PDOT KC_KP_DOT
+#define KC_PEQL KC_KP_EQUAL
+#define KC_PCMM KC_KP_COMMA
+
+/* Language Specific */
+#define KC_INT1 KC_INTERNATIONAL_1
+#define KC_INT2 KC_INTERNATIONAL_2
+#define KC_INT3 KC_INTERNATIONAL_3
+#define KC_INT4 KC_INTERNATIONAL_4
+#define KC_INT5 KC_INTERNATIONAL_5
+#define KC_INT6 KC_INTERNATIONAL_6
+#define KC_INT7 KC_INTERNATIONAL_7
+#define KC_INT8 KC_INTERNATIONAL_8
+#define KC_INT9 KC_INTERNATIONAL_9
+#define KC_LNG1 KC_LANGUAGE_1
+#define KC_LNG2 KC_LANGUAGE_2
+#define KC_LNG3 KC_LANGUAGE_3
+#define KC_LNG4 KC_LANGUAGE_4
+#define KC_LNG5 KC_LANGUAGE_5
+#define KC_LNG6 KC_LANGUAGE_6
+#define KC_LNG7 KC_LANGUAGE_7
+#define KC_LNG8 KC_LANGUAGE_8
+#define KC_LNG9 KC_LANGUAGE_9
+
+/* Modifiers */
+#define KC_LCTL KC_LEFT_CTRL
+#define KC_LSFT KC_LEFT_SHIFT
+#define KC_LALT KC_LEFT_ALT
+#define KC_LOPT KC_LEFT_ALT
+#define KC_LGUI KC_LEFT_GUI
+#define KC_LCMD KC_LEFT_GUI
+#define KC_LWIN KC_LEFT_GUI
+#define KC_RCTL KC_RIGHT_CTRL
+#define KC_RSFT KC_RIGHT_SHIFT
+#define KC_RALT KC_RIGHT_ALT
+#define KC_ALGR KC_RIGHT_ALT
+#define KC_ROPT KC_RIGHT_ALT
+#define KC_RGUI KC_RIGHT_GUI
+#define KC_RCMD KC_RIGHT_GUI
+#define KC_RWIN KC_RIGHT_GUI
+
+/* Generic Desktop Page (0x01) */
+#define KC_PWR KC_SYSTEM_POWER
+#define KC_SLEP KC_SYSTEM_SLEEP
+#define KC_WAKE KC_SYSTEM_WAKE
+
+/* Consumer Page (0x0C) */
+#define KC_MUTE KC_AUDIO_MUTE
+#define KC_VOLU KC_AUDIO_VOL_UP
+#define KC_VOLD KC_AUDIO_VOL_DOWN
+#define KC_MNXT KC_MEDIA_NEXT_TRACK
+#define KC_MPRV KC_MEDIA_PREV_TRACK
+#define KC_MSTP KC_MEDIA_STOP
+#define KC_MPLY KC_MEDIA_PLAY_PAUSE
+#define KC_MSEL KC_MEDIA_SELECT
+#define KC_EJCT KC_MEDIA_EJECT
+#define KC_CALC KC_CALCULATOR
+#define KC_MYCM KC_MY_COMPUTER
+#define KC_WSCH KC_WWW_SEARCH
+#define KC_WHOM KC_WWW_HOME
+#define KC_WBAK KC_WWW_BACK
+#define KC_WFWD KC_WWW_FORWARD
+#define KC_WSTP KC_WWW_STOP
+#define KC_WREF KC_WWW_REFRESH
+#define KC_WFAV KC_WWW_FAVORITES
+#define KC_MFFD KC_MEDIA_FAST_FORWARD
+#define KC_MRWD KC_MEDIA_REWIND
+#define KC_BRIU KC_BRIGHTNESS_UP
+#define KC_BRID KC_BRIGHTNESS_DOWN
+
+/* System Specific */
+#define KC_BRMU KC_PAUSE
+#define KC_BRMD KC_SCROLL_LOCK
+
+/* Mouse Keys */
+#define KC_MS_U KC_MS_UP
+#define KC_MS_D KC_MS_DOWN
+#define KC_MS_L KC_MS_LEFT
+#define KC_MS_R KC_MS_RIGHT
+#define KC_BTN1 KC_MS_BTN1
+#define KC_BTN2 KC_MS_BTN2
+#define KC_BTN3 KC_MS_BTN3
+#define KC_BTN4 KC_MS_BTN4
+#define KC_BTN5 KC_MS_BTN5
+#define KC_BTN6 KC_MS_BTN6
+#define KC_BTN7 KC_MS_BTN7
+#define KC_BTN8 KC_MS_BTN8
+#define KC_WH_U KC_MS_WH_UP
+#define KC_WH_D KC_MS_WH_DOWN
+#define KC_WH_L KC_MS_WH_LEFT
+#define KC_WH_R KC_MS_WH_RIGHT
+#define KC_ACL0 KC_MS_ACCEL0
+#define KC_ACL1 KC_MS_ACCEL1
+#define KC_ACL2 KC_MS_ACCEL2
+
+/* Keyboard/Keypad Page (0x07) */
+enum hid_keyboard_keypad_usage {
+ KC_NO = 0x00,
+ KC_ROLL_OVER,
+ KC_POST_FAIL,
+ KC_UNDEFINED,
+ KC_A,
+ KC_B,
+ KC_C,
+ KC_D,
+ KC_E,
+ KC_F,
+ KC_G,
+ KC_H,
+ KC_I,
+ KC_J,
+ KC_K,
+ KC_L,
+ KC_M, // 0x10
+ KC_N,
+ KC_O,
+ KC_P,
+ KC_Q,
+ KC_R,
+ KC_S,
+ KC_T,
+ KC_U,
+ KC_V,
+ KC_W,
+ KC_X,
+ KC_Y,
+ KC_Z,
+ KC_1,
+ KC_2,
+ KC_3, // 0x20
+ KC_4,
+ KC_5,
+ KC_6,
+ KC_7,
+ KC_8,
+ KC_9,
+ KC_0,
+ KC_ENTER,
+ KC_ESCAPE,
+ KC_BACKSPACE,
+ KC_TAB,
+ KC_SPACE,
+ KC_MINUS,
+ KC_EQUAL,
+ KC_LEFT_BRACKET,
+ KC_RIGHT_BRACKET, // 0x30
+ KC_BACKSLASH,
+ KC_NONUS_HASH,
+ KC_SEMICOLON,
+ KC_QUOTE,
+ KC_GRAVE,
+ KC_COMMA,
+ KC_DOT,
+ KC_SLASH,
+ KC_CAPS_LOCK,
+ KC_F1,
+ KC_F2,
+ KC_F3,
+ KC_F4,
+ KC_F5,
+ KC_F6,
+ KC_F7, // 0x40
+ KC_F8,
+ KC_F9,
+ KC_F10,
+ KC_F11,
+ KC_F12,
+ KC_PRINT_SCREEN,
+ KC_SCROLL_LOCK,
+ KC_PAUSE,
+ KC_INSERT,
+ KC_HOME,
+ KC_PAGE_UP,
+ KC_DELETE,
+ KC_END,
+ KC_PAGE_DOWN,
+ KC_RIGHT,
+ KC_LEFT, // 0x50
+ KC_DOWN,
+ KC_UP,
+ KC_NUM_LOCK,
+ KC_KP_SLASH,
+ KC_KP_ASTERISK,
+ KC_KP_MINUS,
+ KC_KP_PLUS,
+ KC_KP_ENTER,
+ KC_KP_1,
+ KC_KP_2,
+ KC_KP_3,
+ KC_KP_4,
+ KC_KP_5,
+ KC_KP_6,
+ KC_KP_7,
+ KC_KP_8, // 0x60
+ KC_KP_9,
+ KC_KP_0,
+ KC_KP_DOT,
+ KC_NONUS_BACKSLASH,
+ KC_APPLICATION,
+ KC_KB_POWER,
+ KC_KP_EQUAL,
+ KC_F13,
+ KC_F14,
+ KC_F15,
+ KC_F16,
+ KC_F17,
+ KC_F18,
+ KC_F19,
+ KC_F20,
+ KC_F21, // 0x70
+ KC_F22,
+ KC_F23,
+ KC_F24,
+ KC_EXECUTE,
+ KC_HELP,
+ KC_MENU,
+ KC_SELECT,
+ KC_STOP,
+ KC_AGAIN,
+ KC_UNDO,
+ KC_CUT,
+ KC_COPY,
+ KC_PASTE,
+ KC_FIND,
+ KC_KB_MUTE,
+ KC_KB_VOLUME_UP, // 0x80
+ KC_KB_VOLUME_DOWN,
+ KC_LOCKING_CAPS_LOCK,
+ KC_LOCKING_NUM_LOCK,
+ KC_LOCKING_SCROLL_LOCK,
+ KC_KP_COMMA,
+ KC_KP_EQUAL_AS400,
+ KC_INTERNATIONAL_1,
+ KC_INTERNATIONAL_2,
+ KC_INTERNATIONAL_3,
+ KC_INTERNATIONAL_4,
+ KC_INTERNATIONAL_5,
+ KC_INTERNATIONAL_6,
+ KC_INTERNATIONAL_7,
+ KC_INTERNATIONAL_8,
+ KC_INTERNATIONAL_9,
+ KC_LANGUAGE_1, // 0x90
+ KC_LANGUAGE_2,
+ KC_LANGUAGE_3,
+ KC_LANGUAGE_4,
+ KC_LANGUAGE_5,
+ KC_LANGUAGE_6,
+ KC_LANGUAGE_7,
+ KC_LANGUAGE_8,
+ KC_LANGUAGE_9,
+ KC_ALTERNATE_ERASE,
+ KC_SYSTEM_REQUEST,
+ KC_CANCEL,
+ KC_CLEAR,
+ KC_PRIOR,
+ KC_RETURN,
+ KC_SEPARATOR,
+ KC_OUT, // 0xA0
+ KC_OPER,
+ KC_CLEAR_AGAIN,
+ KC_CRSEL,
+ KC_EXSEL,
+
+#if 0
+ /* These keycodes are present in the HID spec, but are
+ * nonfunctional on modern OSes */
+
+ KC_KP_00 = 0xB0,
+ KC_KP_000,
+ KC_THOUSANDS_SEPARATOR,
+ KC_DECIMAL_SEPARATOR,
+ KC_CURRENCY_UNIT,
+ KC_CURRENCY_SUB_UNIT,
+ KC_KP_LEFT_PARENTHESIS,
+ KC_KP_RIGHT_PARENTHESIS,
+ KC_KP_LEFT_BRACE,
+ KC_KP_RIGHT_BRACE,
+ KC_KP_TAB,
+ KC_KP_BACKSPACE,
+ KC_KP_A,
+ KC_KP_B,
+ KC_KP_C,
+ KC_KP_D,
+ KC_KP_E, //0xC0
+ KC_KP_F,
+ KC_KP_XOR,
+ KC_KP_HAT,
+ KC_KP_PERCENT,
+ KC_KP_LESS_THAN,
+ KC_KP_GREATER_THAN,
+ KC_KP_AND,
+ KC_KP_LAZY_AND,
+ KC_KP_OR,
+ KC_KP_LAZY_OR,
+ KC_KP_COLON,
+ KC_KP_HASH,
+ KC_KP_SPACE,
+ KC_KP_AT,
+ KC_KP_EXCLAMATION,
+ KC_KP_MEM_STORE, //0xD0
+ KC_KP_MEM_RECALL,
+ KC_KP_MEM_CLEAR,
+ KC_KP_MEM_ADD,
+ KC_KP_MEM_SUB,
+ KC_KP_MEM_MUL,
+ KC_KP_MEM_DIV,
+ KC_KP_PLUS_MINUS,
+ KC_KP_CLEAR,
+ KC_KP_CLEAR_ENTRY,
+ KC_KP_BINARY,
+ KC_KP_OCTAL,
+ KC_KP_DECIMAL,
+ KC_KP_HEXADECIMAL,
+#endif
+
+ /* Modifiers */
+ KC_LEFT_CTRL = 0xE0,
+ KC_LEFT_SHIFT,
+ KC_LEFT_ALT,
+ KC_LEFT_GUI,
+ KC_RIGHT_CTRL,
+ KC_RIGHT_SHIFT,
+ KC_RIGHT_ALT,
+ KC_RIGHT_GUI
+
+ /* Range 0xF0-0xFF is unallocated in the HID spec */
+};
+
+/* Media and Function keys */
+enum internal_special_keycodes {
+ /* Generic Desktop Page (0x01) */
+ KC_SYSTEM_POWER = 0xA5,
+ KC_SYSTEM_SLEEP,
+ KC_SYSTEM_WAKE,
+
+ /* Consumer Page (0x0C) */
+ KC_AUDIO_MUTE,
+ KC_AUDIO_VOL_UP,
+ KC_AUDIO_VOL_DOWN,
+ KC_MEDIA_NEXT_TRACK,
+ KC_MEDIA_PREV_TRACK,
+ KC_MEDIA_STOP,
+ KC_MEDIA_PLAY_PAUSE,
+ KC_MEDIA_SELECT,
+ KC_MEDIA_EJECT, // 0xB0
+ KC_MAIL,
+ KC_CALCULATOR,
+ KC_MY_COMPUTER,
+ KC_WWW_SEARCH,
+ KC_WWW_HOME,
+ KC_WWW_BACK,
+ KC_WWW_FORWARD,
+ KC_WWW_STOP,
+ KC_WWW_REFRESH,
+ KC_WWW_FAVORITES,
+ KC_MEDIA_FAST_FORWARD,
+ KC_MEDIA_REWIND,
+ KC_BRIGHTNESS_UP,
+ KC_BRIGHTNESS_DOWN
+};
+
+/* Mouse Buttons */
+enum mouse_keys {
+#ifdef VIA_ENABLE
+ KC_MS_UP = 0xF0,
+#else
+ KC_MS_UP = 0xED,
+#endif
+ KC_MS_DOWN,
+ KC_MS_LEFT,
+ KC_MS_RIGHT, // 0xF0
+ KC_MS_BTN1,
+ KC_MS_BTN2,
+ KC_MS_BTN3,
+ KC_MS_BTN4,
+ KC_MS_BTN5,
+#ifdef VIA_ENABLE
+ KC_MS_BTN6 = KC_MS_BTN5,
+ KC_MS_BTN7 = KC_MS_BTN5,
+ KC_MS_BTN8 = KC_MS_BTN5,
+#else
+ KC_MS_BTN6,
+ KC_MS_BTN7,
+ KC_MS_BTN8,
+#endif
+
+ /* Mouse Wheel */
+ KC_MS_WH_UP,
+ KC_MS_WH_DOWN,
+ KC_MS_WH_LEFT,
+ KC_MS_WH_RIGHT,
+
+ /* Acceleration */
+ KC_MS_ACCEL0,
+ KC_MS_ACCEL1,
+ KC_MS_ACCEL2 // 0xFF
+};
+
diff --git a/src/keymap.c b/src/keymap.c
new file mode 100644
index 0000000..d8239fe
--- /dev/null
+++ b/src/keymap.c
@@ -0,0 +1,45 @@
+#include "keymap.h"
+#include "keysym_de.h"
+#include "board.h"
+#include "util.h"
+
+#define KEYMAP( \
+ K11, K12, K13, K14, K15, K16, \
+ K21, K22, K23, K24, K25, K26, \
+ K31, K32, K33, K34, K35, K36, \
+ K44, K45, K46, \
+ K51, K52, K53, K54, K55, K56, \
+ K61, K62, K63, K64, K65, K66, \
+ K71, K72, K73, K74, K75, K76, \
+ K81, K82, K83 \
+ ) { \
+ K11, K12, K13, K14, K15, K16, \
+ K21, K22, K23, K24, K25, K26, \
+ K31, K32, K33, K34, K35, K36, \
+ 0x0, 0x0, 0x0, K44, K45, K46, \
+ K51, K52, K53, K54, K55, K56, \
+ K61, K62, K63, K64, K65, K66, \
+ K31, K32, K33, K34, K35, K36, \
+ K31, K32, K33, 0x0, 0x0, 0x0, \
+ }
+
+enum {
+ BA /* BASE */
+};
+
+static const uint32_t layer_base_de[] = KEYMAP(
+ _______, DE_Q , DE_W , DE_F , DE_P , DE_B ,
+ _______, DE_A , DE_R , DE_S , DE_T , DE_G ,
+ _______, DE_Z , DE_X , DE_C , DE_D , DE_V ,
+ KC_LALT, KC_LGUI, _______,
+
+ _______, DE_J , DE_L , DE_U , DE_Y , _______,
+ _______, DE_N , DE_E , DE_I , DE_O , _______,
+ _______, DE_H , DE_SCLN, DE_DOT , DE_MINS, _______,
+ _______, _______, _______
+);
+
+const uint32_t *keymap_layers_de[] = {
+ [BA] = layer_base_de
+};
+const uint32_t keymap_layers_de_count = ARRLEN(keymap_layers_de);
diff --git a/src/keymap.h b/src/keymap.h
new file mode 100644
index 0000000..5e7fa85
--- /dev/null
+++ b/src/keymap.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include <stdint.h>
+
+extern const uint32_t *keymap_layers_de[];
+extern const uint32_t keymap_layers_de_count;
diff --git a/src/keysym.h b/src/keysym.h
new file mode 100644
index 0000000..3a7720c
--- /dev/null
+++ b/src/keysym.h
@@ -0,0 +1,47 @@
+#pragma once
+
+#define XXXXXXX KC_NO
+#define _______ KC_TRNS
+
+#define IS_CTRL(x) ((x) & (1 << B_CTRL))
+#define IS_SHIFT(x) ((x) & (1 << B_SHIFT))
+#define IS_ALT(x) ((x) & (1 << B_ALT))
+#define IS_GUI(x) ((x) & (1 << B_GUI))
+#define IS_RIGHT(x) ((x) & (1 << B_RIGHT))
+#define IS_TOGGLE(x) ((x) & (1 << B_TOGGLE))
+#define IS_SWITCH(x) ((x) & (1 << B_SWITCH))
+
+#define TO_CODE(x) ((x) & 0xFF)
+#define TO_LAYER(x) ((x) & 0xFF)
+
+#define LCTL(x) ((x) | (1 << B_CTRL))
+#define LSFT(x) ((x) | (1 << B_SHIFT))
+#define LALT(x) ((x) | (1 << B_ALT))
+#define LGUI(x) ((x) | (1 << B_GUI))
+#define RCTL(x) (LCTL(x) | (1 << B_RIGHT))
+#define RSFT(x) (LSFT(x) | (1 << B_RIGHT))
+#define RALT(x) (LALT(x) | (1 << B_RIGHT))
+#define RGUI(x) (LGUI(x) | (1 << B_RIGHT))
+
+#define LOPT(x) LALT(x)
+#define LCMD(x) LGUI(x)
+#define LWIN(x) LGUI(x)
+#define ALGR(x) RALT(x)
+#define ROPT(x) RALT(x)
+#define RCMD(x) RGUI(x)
+
+#define C(x) LCTL(x)
+#define S(x) LSFT(x)
+#define A(x) LALT(x)
+#define G(x) LGUI(x)
+
+enum {
+ B_CTRL = 8,
+ B_SHIFT,
+ B_ALT,
+ B_GUI,
+ R_RIGHT,
+ B_TOGGLE,
+ B_SWITCH,
+};
+
diff --git a/src/keysym_de.h b/src/keysym_de.h
new file mode 100644
index 0000000..6bb871f
--- /dev/null
+++ b/src/keysym_de.h
@@ -0,0 +1,149 @@
+#pragma once
+
+#include "keysym.h"
+#include "keycode.h"
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ß │ ´ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ Ü │ + │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ö │ Ä │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define DE_CIRC KC_GRV // ^ (dead)
+#define DE_1 KC_1 // 1
+#define DE_2 KC_2 // 2
+#define DE_3 KC_3 // 3
+#define DE_4 KC_4 // 4
+#define DE_5 KC_5 // 5
+#define DE_6 KC_6 // 6
+#define DE_7 KC_7 // 7
+#define DE_8 KC_8 // 8
+#define DE_9 KC_9 // 9
+#define DE_0 KC_0 // 0
+#define DE_SS KC_MINS // ß
+#define DE_ACUT KC_EQL // ´ (dead)
+
+/* Row 2 */
+#define DE_Q KC_Q // Q
+#define DE_W KC_W // W
+#define DE_E KC_E // E
+#define DE_R KC_R // R
+#define DE_T KC_T // T
+#define DE_Z KC_Y // Z
+#define DE_U KC_U // U
+#define DE_I KC_I // I
+#define DE_O KC_O // O
+#define DE_P KC_P // P
+#define DE_UDIA KC_LBRC // Ü
+#define DE_PLUS KC_RBRC // +
+
+/* Row 3 */
+#define DE_A KC_A // A
+#define DE_S KC_S // S
+#define DE_D KC_D // D
+#define DE_F KC_F // F
+#define DE_G KC_G // G
+#define DE_H KC_H // H
+#define DE_J KC_J // J
+#define DE_K KC_K // K
+#define DE_L KC_L // L
+#define DE_ODIA KC_SCLN // Ö
+#define DE_ADIA KC_QUOT // Ä
+#define DE_HASH KC_NUHS // #
+
+/* Row 4 */
+#define DE_LABK KC_NUBS // <
+#define DE_Y KC_Z // Y
+#define DE_X KC_X // X
+#define DE_C KC_C // C
+#define DE_V KC_V // V
+#define DE_B KC_B // B
+#define DE_N KC_N // N
+#define DE_M KC_M // M
+#define DE_COMM KC_COMM // ,
+#define DE_DOT KC_DOT // .
+#define DE_MINS KC_SLSH // -
+
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ ! │ " │ § │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ * │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ ' │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define DE_DEG S(DE_CIRC) // °
+#define DE_EXLM S(DE_1) // !
+#define DE_DQUO S(DE_2) // "
+#define DE_SECT S(DE_3) // §
+#define DE_DLR S(DE_4) // $
+#define DE_PERC S(DE_5) // %
+#define DE_AMPR S(DE_6) // &
+#define DE_SLSH S(DE_7) // /
+#define DE_LPRN S(DE_8) // (
+#define DE_RPRN S(DE_9) // )
+#define DE_EQL S(DE_0) // =
+#define DE_QUES S(DE_SS) // ?
+#define DE_GRV S(DE_ACUT) // ` (dead)
+
+/* Row 2 */
+#define DE_ASTR S(DE_PLUS) // *
+
+/* Row 3 */
+#define DE_QUOT S(DE_HASH) // '
+
+/* Row 4 */
+#define DE_RABK S(DE_LABK) // >
+#define DE_SCLN S(DE_COMM) // ;
+#define DE_COLN S(DE_DOT) // :
+#define DE_UNDS S(DE_MINS) // _
+
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ ² │ ³ │ │ │ │ { │ [ │ ] │ } │ \ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ @ │ │ € │ │ │ │ │ │ │ │ │ ~ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ µ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define DE_SUP2 ALGR(DE_2) // ²
+#define DE_SUP3 ALGR(DE_3) // ³
+#define DE_LCBR ALGR(DE_7) // {
+#define DE_LBRC ALGR(DE_8) // [
+#define DE_RBRC ALGR(DE_9) // ]
+#define DE_RCBR ALGR(DE_0) // }
+#define DE_BSLS ALGR(DE_SS) // (backslash)
+
+/* Row 2 */
+#define DE_AT ALGR(DE_Q) // @
+#define DE_EURO ALGR(DE_E) // €
+#define DE_TILD ALGR(DE_PLUS) // ~
+
+/* Row 4 */
+#define DE_PIPE ALGR(DE_LABK) // |
+#define DE_MICR ALGR(DE_M) // µ
diff --git a/src/keysym_us.h b/src/keysym_us.h
new file mode 100644
index 0000000..2409868
--- /dev/null
+++ b/src/keysym_us.h
@@ -0,0 +1,228 @@
+#pragma once
+
+#include "keysym.h"
+#include "keycode.h"
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define US_GRV KC_GRV // `
+#define US_1 KC_1 // 1
+#define US_2 KC_2 // 2
+#define US_3 KC_3 // 3
+#define US_4 KC_4 // 4
+#define US_5 KC_5 // 5
+#define US_6 KC_6 // 6
+#define US_7 KC_7 // 7
+#define US_8 KC_8 // 8
+#define US_9 KC_9 // 9
+#define US_0 KC_0 // 0
+#define US_MINS KC_MINS // -
+#define US_EQL KC_EQL // =
+
+/* Row 2 */
+#define US_Q KC_Q // Q
+#define US_W KC_W // W
+#define US_E KC_E // E
+#define US_R KC_R // R
+#define US_T KC_T // T
+#define US_Y KC_Y // Y
+#define US_U KC_U // U
+#define US_I KC_I // I
+#define US_O KC_O // O
+#define US_P KC_P // P
+#define US_LBRC KC_LBRC // [
+#define US_RBRC KC_RBRC // ]
+#define US_BSLS KC_BSLS // (backslash)
+
+/* Row 3 */
+#define US_A KC_A // A
+#define US_S KC_S // S
+#define US_D KC_D // D
+#define US_F KC_F // F
+#define US_G KC_G // G
+#define US_H KC_H // H
+#define US_J KC_J // J
+#define US_K KC_K // K
+#define US_L KC_L // L
+#define US_SCLN KC_SCLN // ;
+#define US_QUOT KC_QUOT // '
+
+/* Row 4 */
+#define US_Z KC_Z // Z
+#define US_X KC_X // X
+#define US_C KC_C // C
+#define US_V KC_V // V
+#define US_B KC_B // B
+#define US_N KC_N // N
+#define US_M KC_M // M
+#define US_COMM KC_COMM // ,
+#define US_DOT KC_DOT // .
+#define US_SLSH KC_SLSH // /
+
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ : │ " │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define US_TILD S(US_GRV) // ~
+#define US_EXLM S(US_1) // !
+#define US_AT S(US_2) // @
+#define US_HASH S(US_3) // #
+#define US_DLR S(US_4) // $
+#define US_PERC S(US_5) // %
+#define US_CIRC S(US_6) // ^
+#define US_AMPR S(US_7) // &
+#define US_ASTR S(US_8) // *
+#define US_LPRN S(US_9) // (
+#define US_RPRN S(US_0) // )
+#define US_UNDS S(US_MINS) // _
+#define US_PLUS S(US_EQL) // +
+
+/* Row 2 */
+#define US_LCBR S(US_LBRC) // {
+#define US_RCBR S(US_RBRC) // }
+#define US_PIPE S(US_BSLS) // |
+
+/* Row 3 */
+#define US_COLN S(US_SCLN) // :
+#define US_DQUO S(US_QUOT) // "
+
+/* Row 4 */
+#define US_LABK S(US_COMM) // <
+#define US_RABK S(US_DOT) // >
+#define US_QUES S(US_SLSH) // ?
+
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ ¹ │ ² │ ³ │ ¤ │ € │ ^ │ ̛ │ ¾ │ ‘ │ ’ │ ¥ │ × │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Ä │ Å │ É │ ® │ Þ │ Ü │ Ú │ Í │ Ó │ Ö │ « │ » │ ¬ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ Á │ ß │ Ð │ │ │ │ Ï │ Œ │ Ø │ ¶ │ ' │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Æ │ │ © │ │ │ Ñ │ µ │ Ç │ ˙ │ ¿ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define US_DGRV ALGR(US_GRV) // ` (dead)
+#define US_SUP1 ALGR(US_1) // ¹
+#define US_SUP2 ALGR(US_2) // ²
+#define US_SUP3 ALGR(US_3) // ³
+#define US_CURR ALGR(US_4) // ¤
+#define US_EURO ALGR(US_5) // €
+#define US_DCIR ALGR(US_6) // ^ (dead)
+#define US_HORN ALGR(US_7) // ̛ (dead)
+#define US_OGON ALGR(US_8) // ˛ (dead)
+#define US_LSQU ALGR(US_9) // ‘
+#define US_RSQU ALGR(US_0) // ’
+#define US_YEN ALGR(US_MINS) // ¥
+#define US_MUL ALGR(US_EQL) // ×
+
+/* Row 2 */
+#define US_ADIA ALGR(US_Q) // Ä
+#define US_ARNG ALGR(US_W) // Å
+#define US_EACU ALGR(US_E) // É
+#define US_EDIA ALGR(US_R) // Ë
+#define US_THRN ALGR(US_T) // Þ
+#define US_UDIA ALGR(US_Y) // Ü
+#define US_UACU ALGR(US_U) // Ú
+#define US_IACU ALGR(US_I) // Í
+#define US_OACU ALGR(US_O) // Ó
+#define US_ODIA ALGR(US_P) // Ö
+#define US_LDAQ ALGR(US_LBRC) // «
+#define US_RDAQ ALGR(US_RBRC) // »
+#define US_NOT ALGR(US_BSLS) // ¬
+
+/* Row 3 */
+#define US_AACU ALGR(US_A) // Á
+#define US_SS ALGR(US_S) // ß
+#define US_ETH ALGR(US_D) // Ð
+#define US_IDIA ALGR(US_J) // Ï
+#define US_OE ALGR(US_K) // Œ
+#define US_OSTR ALGR(US_L) // Ø
+#define US_PILC ALGR(US_SCLN) // ¶
+#define US_ACUT ALGR(US_QUOT) // ´ (dead)
+
+/* Row 4 */
+#define US_AE ALGR(US_Z) // Æ
+#define US_OE_2 ALGR(US_X) // Œ
+#define US_COPY ALGR(US_C) // ©
+#define US_REGD ALGR(US_V) // ®
+#define US_NTIL ALGR(US_N) // Ñ
+#define US_MICR ALGR(US_M) // µ
+#define US_CCED ALGR(US_COMM) // Ç
+#define US_DOTA ALGR(US_DOT) // ˙ (dead)
+#define US_IQUE ALGR(US_SLSH) // ¿
+
+
+/* Shift+AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ¡ │ ˝ │ ¯ │ £ │ ¸ │ ¼ │ ½ │ ¾ │ ˘ │ ° │ ̣ │ ÷ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ “ │ ” │ ¦ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ § │ │ │ │ │ │ │ │ ° │ " │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ ¢ │ │ │ │ │ │ ˇ │ ̉ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+
+/* Row 1 */
+#define US_DTIL S(ALGR(US_GRV)) // ~ (dead)
+#define US_IEXL S(ALGR(US_1)) // ¡
+#define US_DACU S(ALGR(US_2)) // ˝ (dead)
+#define US_MACR S(ALGR(US_3)) // ¯ (dead)
+#define US_PND S(ALGR(US_4)) // £
+#define US_CEDL S(ALGR(US_5)) // ¸ (dead)
+#define US_QRTR S(ALGR(US_6)) // ¼
+#define US_HALF S(ALGR(US_7)) // ½
+#define US_TQTR S(ALGR(US_8)) // ¾
+#define US_BREV S(ALGR(US_9)) // ˘ (dead)
+#define US_RNGA S(ALGR(US_0)) // ° (dead)
+#define US_DOTB S(ALGR(US_MINS)) // ̣ (dead)
+#define US_DIV S(ALGR(US_EQL)) // ÷
+
+/* Row 2 */
+#define US_LDQU S(ALGR(US_LBRC)) // “
+#define US_RDQU S(ALGR(US_RBRC)) // ”
+#define US_BRKP S(ALGR(US_BSLS)) // ¦
+
+/* Row 3 */
+#define US_SECT S(ALGR(US_S)) // §
+#define US_DEG S(ALGR(US_SCLN)) // °
+#define US_DIAE S(ALGR(US_QUOT)) // ¨ (dead)
+
+/* Row 4 */
+#define US_CENT S(ALGR(US_C)) // ¢
+#define US_CARN S(ALGR(US_DOT)) // ˇ (dead)
+#define US_HOKA S(ALGR(US_SLSH)) // ̉ (dead)
diff --git a/src/main.c b/src/main.c
index 841ce45..0460e71 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,10 +1,13 @@
#include "board.h"
-#include "class/cdc/cdc_device.h"
-#include "class/hid/hid.h"
-#include "device/usbd.h"
+#include "hid.h"
+#include "keymap.h"
#include "neopix.h"
#include "util.h"
+#include "hardware/gpio.h"
+#include "class/cdc/cdc_device.h"
+#include "class/hid/hid.h"
+#include "device/usbd.h"
#include "pico/stdio/driver.h"
#include "pico/stdlib.h"
#include "bsp/board.h"
@@ -28,7 +31,6 @@ int stub_stdio_read(char *buf, int len);
bool send_hid_report(int id, bool state);
-void hid_task(void);
void blink_task(void);
static struct stdio_driver usb_stdio = {
@@ -42,6 +44,8 @@ static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
static bool hit_state = false;
+const uint32_t **keymap_layers = keymap_layers_de;
+
struct neopix onboard_led;
int
@@ -53,8 +57,10 @@ main(void)
stdio_init_all();
neopix_init(&onboard_led, pio0, 0, 25);
-
tud_init(BOARD_TUD_RHPORT);
+ hid_init();
+
+ DEBUG("Init done.");
while (true) {
tud_task();
@@ -244,24 +250,6 @@ send_hid_report_timed(void)
}
void
-hid_task(void)
-{
- const uint32_t poll_ms = 10;
- static uint32_t start_ms = 0;
-
- if (board_millis() - start_ms < poll_ms)
- return;
- start_ms += poll_ms;
-
- // if (tud_suspended()) {
- // tud_remote_wakeup();
- // return;
- // }
-
- send_hid_report_timed();
-}
-
-void
blink_task(void)
{
static uint32_t start_ms = 0;
@@ -271,7 +259,9 @@ blink_task(void)
return;
start_ms += blink_interval_ms;
+ DEBUG("blink");
+
state ^= true;
neopix_put(&onboard_led, neopix_u32rgb(255 * state, 0, 255 * state));
-
}
+
diff --git a/src/util.c b/src/util.c
index 5a6cf2d..797a259 100644
--- a/src/util.c
+++ b/src/util.c
@@ -8,7 +8,7 @@
#include <stdio.h>
-int loglevel = LOG_WARN;
+int loglevel = LOG_DEBUG;
static void
__attribute__((format(printf, 1, 0)))
diff --git a/src/util.h b/src/util.h
index e413883..376d132 100644
--- a/src/util.h
+++ b/src/util.h
@@ -3,6 +3,8 @@
#include <stdbool.h>
#include <stdarg.h>
+#define ARRLEN(x) (sizeof(x) / sizeof((x)[0]))
+
#define ERR(...) stdio_log(LOG_ERR, __VA_ARGS__)
#define WARN(...) stdio_log(LOG_WARN, __VA_ARGS__)
#define INFO(...) stdio_log(LOG_INFO, __VA_ARGS__)