aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-12-19 19:29:41 +0100
committerLouis Burda <quent.burda@gmail.com>2022-12-19 19:29:41 +0100
commit878eb23b8394109aeb32cd505f79b96c74ec97f6 (patch)
treeed5aa20a4018fcecd0d7f922d66c92633822117c /src
parentd7c506450be613d6575649218fbcc90a4fabd150 (diff)
downloadsxkbd-878eb23b8394109aeb32cd505f79b96c74ec97f6.tar.gz
sxkbd-878eb23b8394109aeb32cd505f79b96c74ec97f6.zip
Add special hid functionality, consumer control working
Diffstat (limited to 'src')
-rw-r--r--src/hid.c206
-rw-r--r--src/hid.h4
-rw-r--r--src/hid/consumer.h68
-rw-r--r--src/hid/keyboard.h (renamed from src/keycode.h)159
-rw-r--r--src/hid/system.h17
-rw-r--r--src/keymap.c14
-rw-r--r--src/keysym.h32
-rw-r--r--src/keysym/consumer.c60
-rw-r--r--src/keysym/consumer.h57
-rw-r--r--src/keysym/keyboard_de.h (renamed from src/keysym_de.h)2
-rw-r--r--src/keysym/keyboard_us.h (renamed from src/keysym_us.h)2
-rw-r--r--src/keysym/mouse.h50
-rw-r--r--src/keysym/system.c20
-rw-r--r--src/keysym/system.h18
-rw-r--r--src/usb_descriptors.c4
15 files changed, 487 insertions, 226 deletions
diff --git a/src/hid.c b/src/hid.c
index d4fdb7c..96de5ea 100644
--- a/src/hid.c
+++ b/src/hid.c
@@ -1,5 +1,11 @@
#include "hid.h"
-#include "keycode.h"
+
+#include "keysym/consumer.h"
+#include "keysym/system.h"
+#include "hid/keyboard.h"
+#include "hid/consumer.h"
+#include "hid/system.h"
+
#include "split.h"
#include "keymat.h"
#include "keysym.h"
@@ -9,6 +15,7 @@
#include "bsp/board.h"
#include "pico/types.h"
+#include <stdbool.h>
#include <string.h>
struct layerkey {
@@ -16,10 +23,31 @@ struct layerkey {
uint key;
};
-struct hid_report {
+struct hid_keyboard_report {
uint8_t mods;
uint8_t codes[6];
- uint8_t codecnt;
+ uint8_t cnt;
+};
+
+struct hid_mouse_report {
+ uint8_t btns;
+ int8_t x, y;
+ int8_t v, h;
+};
+
+struct hid_consumer_report {
+ uint16_t code;
+};
+
+struct hid_system_report {
+ uint16_t code;
+};
+
+struct hid_gamepad_report {
+ int8_t x, y, z;
+ int8_t rx, ry, rz;
+ uint8_t hat;
+ uint32_t btns;
};
static uint32_t keysyms[KEY_ROWS][KEY_COLS] = { 0 };
@@ -27,15 +55,27 @@ static uint32_t keysyms[KEY_ROWS][KEY_COLS] = { 0 };
static struct layerkey active_stack[16] = { 0 };
static uint active_top = 0;
-static struct hid_report hid_report_prev;
-static struct hid_report hid_report;
+static struct hid_keyboard_report keyboard_report_prev = { 0 };
+static struct hid_keyboard_report keyboard_report = { 0 };
+
+static struct hid_mouse_report mouse_report_prev = { 0 };
+static struct hid_mouse_report mouse_report = { 0 };
+
+static struct hid_consumer_report consumer_report_prev = { 0 };
+static struct hid_consumer_report consumer_report = { 0 };
-static uint8_t active_weak_mods;
-static uint8_t active_mods;
+static struct hid_system_report system_report_prev = { 0 };
+static struct hid_system_report system_report = { 0 };
+
+static struct hid_gamepad_report gamepad_report_prev = { 0 };
+static struct hid_gamepad_report gamepad_report = { 0 };
+
+static uint8_t active_weak_mods = 0;
+static uint8_t active_mods = 0;
static uint64_t bounce_mat[KEY_ROWS][KEY_COLS] = { 0 };
-static bool seen_mat[KEY_ROWS][KEY_COLS];
+static bool seen_mat[KEY_ROWS][KEY_COLS] = { 0 };
static void active_pop(uint layer);
static void active_push(uint layer, uint key);
@@ -75,13 +115,13 @@ active_push(uint layer, uint key)
void
add_keycode(uint8_t keycode)
{
- if (hid_report.codecnt >= 6) {
+ if (keyboard_report.cnt >= 6) {
WARN("HID report overflow");
return;
}
- hid_report.codes[hid_report.codecnt] = keycode;
- hid_report.codecnt++;
+ keyboard_report.codes[keyboard_report.cnt] = keycode;
+ keyboard_report.cnt++;
}
uint8_t
@@ -141,6 +181,9 @@ handle_keypress_new(uint x, uint y)
/* FIXME: two keys pressed at the exact same time with
* different weak modifiers will not be reported correctly */
active_weak_mods = parse_modifiers(keysyms[y][x]);
+ } else if (IS_CONSUMER(keysyms[y][x])) {
+ consumer_report.code = keysym_to_consumer(keysyms[y][x]);
+ INFO("CONSUMER KEY %i", consumer_report.code);
}
}
@@ -217,47 +260,110 @@ update_report(void)
bool
send_keyboard_report(void)
{
- hid_report.mods = active_weak_mods | active_mods;
- if (memcmp(&hid_report, &hid_report_prev, sizeof(hid_report))) {
+ bool sent;
+
+ sent = false;
+ keyboard_report.mods = active_weak_mods | active_mods;
+ if (memcmp(&keyboard_report, &keyboard_report_prev,
+ sizeof(keyboard_report))) {
tud_hid_keyboard_report(REPORT_ID_KEYBOARD,
- hid_report.mods, hid_report.codes);
- memcpy(&hid_report_prev, &hid_report, sizeof(hid_report));
- return true;
+ keyboard_report.mods, keyboard_report.codes);
+ memcpy(&keyboard_report_prev, &keyboard_report,
+ sizeof(keyboard_report));
+ sent = true;
}
- return false;
+ memset(&keyboard_report, 0, sizeof(keyboard_report));
+ active_mods = 0;
+ memset(seen_mat, 0, sizeof(seen_mat));
+
+ return sent;
}
bool
-send_mouse_report(bool state)
+send_consumer_report(void)
{
- if (state) {
- tud_hid_mouse_report(REPORT_ID_MOUSE, 0, 10, 10, 0, 0);
+ bool sent;
+
+ INFO("CONSUMER %u", consumer_report.code);
+
+ sent = false;
+ if (memcmp(&consumer_report, &consumer_report_prev,
+ sizeof(consumer_report))) {
+ tud_hid_report(REPORT_ID_CONSUMER,
+ &consumer_report.code, 2);
+ memcpy(&consumer_report_prev, &consumer_report,
+ sizeof(consumer_report));
return true;
}
- return false;
+ memset(&consumer_report, 0, sizeof(consumer_report));
+
+ return sent;
}
bool
-send_consumer_control_report(bool state)
+send_system_report(void)
{
- static bool cleared = true;
- uint16_t report;
+ bool sent;
+
+ sent = false;
+ if (memcmp(&system_report, &system_report_prev,
+ sizeof(system_report))) {
+ tud_hid_report(REPORT_ID_SYSTEM,
+ &system_report.code, 2);
+ memcpy(&system_report_prev, &system_report,
+ sizeof(system_report));
+ sent = true;
+ }
- if (state) {
- report = HID_USAGE_CONSUMER_VOLUME_DECREMENT;
- tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &report, 2);
- cleared = false;
- return true;
- } else if (!cleared) {
- report = 0;
- tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &report, 2);
- cleared = true;
- return true;
+ memset(&system_report, 0, sizeof(system_report));
+
+ return sent;
+}
+
+bool
+send_mouse_report(void)
+{
+ bool sent;
+
+ sent = false;
+ if (memcmp(&mouse_report, &mouse_report_prev,
+ sizeof(mouse_report))) {
+ tud_hid_mouse_report(REPORT_ID_KEYBOARD,
+ mouse_report.btns,
+ mouse_report.x, mouse_report.y,
+ mouse_report.h, mouse_report.v);
+ memcpy(&mouse_report_prev, &mouse_report,
+ sizeof(mouse_report));
+ sent = true;
}
- return false;
+ memset(&mouse_report, 0, sizeof(mouse_report));
+
+ return sent;
+}
+
+bool
+send_gamepad_report(void)
+{
+ bool sent;
+
+ sent = false;
+ if (memcmp(&gamepad_report, &gamepad_report_prev,
+ sizeof(gamepad_report))) {
+ tud_hid_gamepad_report(REPORT_ID_GAMEPAD,
+ gamepad_report.x, gamepad_report.y, gamepad_report.z,
+ gamepad_report.rz, gamepad_report.rx, gamepad_report.ry,
+ gamepad_report.hat, gamepad_report.btns);
+ memcpy(&gamepad_report_prev, &gamepad_report,
+ sizeof(gamepad_report));
+ sent = true;
+ }
+
+ memset(&gamepad_report, 0, sizeof(gamepad_report));
+
+ return sent;
}
bool
@@ -266,28 +372,38 @@ send_hid_report(int id)
switch (id) {
case REPORT_ID_KEYBOARD:
return send_keyboard_report();
+ case REPORT_ID_CONSUMER:
+ return send_consumer_report();
+ case REPORT_ID_SYSTEM:
+ return send_system_report();
case REPORT_ID_MOUSE:
- return send_mouse_report(false);
- case REPORT_ID_CONSUMER_CONTROL:
- return send_consumer_control_report(false);
+ return send_mouse_report();
+ case REPORT_ID_GAMEPAD:
+ return send_gamepad_report();
}
return false;
}
void
-tud_hid_report_complete_cb(uint8_t instance,
- uint8_t const *report, uint8_t len)
+send_next_hid_report(uint8_t min)
{
uint8_t id;
- for (id = report[0] + 1; id < REPORT_ID_MAX; id++) {
+ for (id = min; id < REPORT_ID_MAX; id++) {
if (send_hid_report(id))
break;
}
}
void
+tud_hid_report_complete_cb(uint8_t instance,
+ uint8_t const *report, uint8_t len)
+{
+ send_next_hid_report(report[0] + 1);
+}
+
+void
hid_init(void)
{
}
@@ -311,10 +427,6 @@ void
hid_task(void)
{
update_report();
- if (tud_hid_ready()) {
- send_hid_report(REPORT_ID_MIN);
- memset(&hid_report, 0, sizeof(hid_report));
- memset(seen_mat, 0, sizeof(seen_mat));
- active_mods = 0;
- }
+ if (tud_hid_ready())
+ send_next_hid_report(REPORT_ID_MIN);
}
diff --git a/src/hid.h b/src/hid.h
index e455c80..7046724 100644
--- a/src/hid.h
+++ b/src/hid.h
@@ -8,8 +8,10 @@
#define REPORT_ID_MIN REPORT_ID_KEYBOARD
enum {
REPORT_ID_KEYBOARD = 1,
+ REPORT_ID_CONSUMER,
+ REPORT_ID_SYSTEM,
REPORT_ID_MOUSE,
- REPORT_ID_CONSUMER_CONTROL,
+ REPORT_ID_GAMEPAD,
REPORT_ID_MAX
};
diff --git a/src/hid/consumer.h b/src/hid/consumer.h
new file mode 100644
index 0000000..35dd0bc
--- /dev/null
+++ b/src/hid/consumer.h
@@ -0,0 +1,68 @@
+#pragma once
+
+#include <stdint.h>
+
+
+/* Consumer Page (0x0C)
+ *
+ * See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=75
+ */
+enum hid_consumer {
+ /* 15.5 Display Controls */
+ SNAPSHOT = 0x065,
+ /* https://www.usb.org/sites/default/files/hutrr41_0.pdf */
+ BRIGHTNESS_UP = 0x06F,
+ BRIGHTNESS_DOWN = 0x070,
+
+ /* 15.7 Transport Controls */
+ TRANSPORT_RECORD = 0x0B2,
+ TRANSPORT_FAST_FORWARD = 0x0B3,
+ TRANSPORT_REWIND = 0x0B4,
+ TRANSPORT_NEXT_TRACK = 0x0B5,
+ TRANSPORT_PREV_TRACK = 0x0B6,
+ TRANSPORT_STOP = 0x0B7,
+ TRANSPORT_EJECT = 0x0B8,
+ TRANSPORT_RANDOM_PLAY = 0x0B9,
+ TRANSPORT_STOP_EJECT = 0x0CC,
+ TRANSPORT_PLAY_PAUSE = 0x0CD,
+
+ /* 15.9.1 Audio Controls - Volume */
+ AUDIO_MUTE = 0x0E2,
+ AUDIO_VOL_UP = 0x0E9,
+ AUDIO_VOL_DOWN = 0x0EA,
+
+ /* 15.15 Application Launch Buttons */
+ AL_CC_CONFIG = 0x183,
+ AL_EMAIL = 0x18A,
+ AL_CALCULATOR = 0x192,
+ AL_LOCAL_BROWSER = 0x194,
+ AL_LOCK = 0x19E,
+ AL_CONTROL_PANEL = 0x19F,
+ AL_ASSISTANT = 0x1CB,
+ AL_KEYBOARD_LAYOUT = 0x1AE,
+
+ /* 15.16 Generic GUI Application Controls */
+ AC_NEW = 0x201,
+ AC_OPEN = 0x202,
+ AC_CLOSE = 0x203,
+ AC_EXIT = 0x204,
+ AC_MAXIMIZE = 0x205,
+ AC_MINIMIZE = 0x206,
+ AC_SAVE = 0x207,
+ AC_PRINT = 0x208,
+ AC_PROPERTIES = 0x209,
+ AC_UNDO = 0x21A,
+ AC_COPY = 0x21B,
+ AC_CUT = 0x21C,
+ AC_PASTE = 0x21D,
+ AC_SELECT_ALL = 0x21E,
+ AC_FIND = 0x21F,
+ AC_SEARCH = 0x221,
+ AC_HOME = 0x223,
+ AC_BACK = 0x224,
+ AC_FORWARD = 0x225,
+ AC_STOP = 0x226,
+ AC_REFRESH = 0x227,
+ AC_BOOKMARKS = 0x22A
+};
+
diff --git a/src/keycode.h b/src/hid/keyboard.h
index afd4378..c535ace 100644
--- a/src/keycode.h
+++ b/src/hid/keyboard.h
@@ -13,36 +13,8 @@
#define IS_KEY_KC(code) (KC_A <= (code) && (code) <= KC_EXSEL)
#define IS_MOD_KC(code) (KC_LEFT_CTRL <= (code) && (code) <= KC_RIGHT_GUI)
-#define IS_SPECIAL_KC(code) ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
-#define IS_SYSTEM_KC(code) (KC_PWR <= (code) && (code) <= KC_WAKE)
-#define IS_CONSUMER_KC(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) & 0b111)
-
-#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 */
+#define MOD_BIT(code) (1 << MOD_INDEX(code))
/* Transparent */
#define KC_TRANSPARENT 0x01
@@ -156,62 +128,8 @@
#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 {
+enum hid_keyboard {
KC_NO = 0x00,
KC_ROLL_OVER,
KC_POST_FAIL,
@@ -439,77 +357,4 @@ enum hid_keyboard_keypad_usage {
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/hid/system.h b/src/hid/system.h
new file mode 100644
index 0000000..6b67e40
--- /dev/null
+++ b/src/hid/system.h
@@ -0,0 +1,17 @@
+#pragma once
+
+/* Generic Desktop Page (0x01)
+ *
+ * See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=26
+ */
+enum hid_system {
+ /* 4.5.1 System Controls - Power Controls */
+ SYSTEM_POWER_DOWN = 0x81,
+ SYSTEM_SLEEP = 0x82,
+ SYSTEM_WAKE_UP = 0x83,
+ SYSTEM_RESTART = 0x8F,
+
+ /* 4.10 System Display Controls */
+ SYSTEM_DISPLAY_TOGGLE_INT_EXT = 0xB5
+};
+
diff --git a/src/keymap.c b/src/keymap.c
index 68c20a4..bf7fa91 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -1,7 +1,8 @@
#include "keymap.h"
-#include "keycode.h"
#include "keysym.h"
-#include "keysym_de.h"
+#include "keysym/consumer.h"
+#include "keysym/keyboard_de.h"
+#include "keysym/keyboard_us.h"
#include "hid.h"
#include "board.h"
#include "util.h"
@@ -81,8 +82,8 @@
_______ ,G(KC_TAB),G(DE_DOT), A(DE_B) , A(DE_F) ,A(KC_SPC), \
_______ , _______ , _______ , \
\
- _______ , G(KC_6) , G(KC_7) , G(KC_8) , G(KC_9) , G(KC_0) , \
- _______ , A(KC_6) , A(KC_7) , A(KC_8) , A(KC_9) , A(KC_0) , \
+ G(KC_6) , G(KC_7) , G(KC_8) , G(KC_9) , G(KC_0) , _______ , \
+ A(KC_6) , A(KC_7) , A(KC_8) , A(KC_9) , A(KC_0) , _______ , \
_______ , _______ , _______ , _______ , _______ , _______ , \
_______ , _______ , _______ \
)
@@ -117,8 +118,8 @@
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , \
_______ , _______ , _______ , \
\
- _______ , KC_VOLD , KC_VOLU , KC_MUTE , _______ , _______ , \
- _______ , KC_MPRV , KC_MNXT , KC_MPLY , _______ , _______ , \
+ _______ , KS_VOLD , KS_VOLU , KS_MUTE , _______ , _______ , \
+ _______ , KS_MPRV , KS_MNXT , KS_MPLY , _______ , _______ , \
KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , \
_______ , _______ , _______ \
)
@@ -164,7 +165,6 @@ process_user_keypress_new(uint8_t sym, uint x, uint y)
case KVM2:
break;
case QUSW:
- INFO("Handling quick switch %i", keymat[7][3]);
if (keymat[7][3]) {
hid_force_release(3, 7);
hid_switch_layer_with_key(QUIX, x, y);
diff --git a/src/keysym.h b/src/keysym.h
index 7737284..79dce3a 100644
--- a/src/keysym.h
+++ b/src/keysym.h
@@ -1,21 +1,28 @@
#pragma once
-#include "keycode.h"
-
#define XXXXXXX KC_NO
#define _______ KC_TRNS
#define MASK(hi, lo) ((1U << (hi)) - (1U << (lo)))
#define IS_KC(x) (!((x) & ~MASK(B_TOGGLE, 0)))
-#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 IS_USER(x) ((x) & (1 << B_USER))
+#define IS_CTRL(x) ((x) & (1U << B_CTRL))
+#define IS_SHIFT(x) ((x) & (1U << B_SHIFT))
+#define IS_ALT(x) ((x) & (1U << B_ALT))
+#define IS_GUI(x) ((x) & (1U << B_GUI))
+#define IS_RIGHT(x) ((x) & (1U << B_RIGHT))
+#define IS_TOGGLE(x) ((x) & (1U << B_TOGGLE))
+#define IS_SWITCH(x) ((x) & (1U << B_SWITCH))
+#define IS_SPECIAL(x) ((x) & (1U << B_SPECIAL))
+#define IS_USER(x) ((x) & (1U << B_USER))
+
+#define KEYSYM_MOUSE_MASK ((1U << B_SPECIAL) | (0b01 << B_SPECIAL_SEL))
+#define KEYSYM_SYSTEM_MASK ((1U << B_SPECIAL) | (0b10 << B_SPECIAL_SEL))
+#define KEYSYM_CONSUMER_MASK ((1U << B_SPECIAL) | (0b11 << B_SPECIAL_SEL))
+
+#define IS_MOUSE(x) ((x) & (KEYSYM_MOUSE_MASK))
+#define IS_SYSTEM(x) ((x) & (KEYSYM_SYSTEM_MASK))
+#define IS_CONSUMER(x) ((x) & (KEYSYM_CONSUMER_MASK))
#define IS_LEFT_CTRL(x) (IS_CTRL(x) && !IS_RIGHT(x))
#define IS_RIGHT_CTRL(x) (IS_CTRL(x) && IS_RIGHT(x))
@@ -26,7 +33,7 @@
#define IS_LEFT_GUI(x) (IS_GUI(x) && !IS_RIGHT(x))
#define IS_RIGHT_GUI(x) (IS_GUI(x) && IS_RIGHT(x))
-#define IS_MOD(x) ((x) & MASK(B_TOGGLE, 8))
+#define IS_MOD(x) ((x) & MASK(B_TOGGLE, B_CTRL))
#define TO_KC(x) ((x) & 0xFF)
#define TO_SYM(x) ((x) & 0xFF)
@@ -58,9 +65,11 @@
#define G(x) LGUI(x)
#define CS(x) C(SW(x))
+#define AS(x) A(SW(x))
#define GS(x) G(SW(x))
enum {
+ B_SPECIAL_SEL = 6,
B_CTRL = 8,
B_SHIFT,
B_ALT,
@@ -68,6 +77,7 @@ enum {
B_RIGHT,
B_TOGGLE,
B_SWITCH,
+ B_SPECIAL,
B_USER
};
diff --git a/src/keysym/consumer.c b/src/keysym/consumer.c
new file mode 100644
index 0000000..8e0e8c0
--- /dev/null
+++ b/src/keysym/consumer.c
@@ -0,0 +1,60 @@
+#include "keysym/consumer.h"
+
+#include "hid/consumer.h"
+
+#include <stdint.h>
+
+uint16_t
+keysym_to_consumer(uint32_t key)
+{
+ switch (key) {
+ case KS_AUDIO_MUTE:
+ return AUDIO_MUTE;
+ case KS_AUDIO_VOL_UP:
+ return AUDIO_VOL_UP;
+ case KS_AUDIO_VOL_DOWN:
+ return AUDIO_VOL_DOWN;
+ case KS_MEDIA_NEXT_TRACK:
+ return TRANSPORT_NEXT_TRACK;
+ case KS_MEDIA_PREV_TRACK:
+ return TRANSPORT_PREV_TRACK;
+ case KS_MEDIA_FAST_FORWARD:
+ return TRANSPORT_FAST_FORWARD;
+ case KS_MEDIA_REWIND:
+ return TRANSPORT_REWIND;
+ case KS_MEDIA_STOP:
+ return TRANSPORT_STOP;
+ case KS_MEDIA_EJECT:
+ return TRANSPORT_STOP_EJECT;
+ case KS_MEDIA_PLAY_PAUSE:
+ return TRANSPORT_PLAY_PAUSE;
+ case KS_MEDIA_SELECT:
+ return AL_CC_CONFIG;
+ case KS_MAIL:
+ return AL_EMAIL;
+ case KS_CALCULATOR:
+ return AL_CALCULATOR;
+ case KS_MY_COMPUTER:
+ return AL_LOCAL_BROWSER;
+ case KS_WWW_SEARCH:
+ return AC_SEARCH;
+ case KS_WWW_HOME:
+ return AC_HOME;
+ case KS_WWW_BACK:
+ return AC_BACK;
+ case KS_WWW_FORWARD:
+ return AC_FORWARD;
+ case KS_WWW_STOP:
+ return AC_STOP;
+ case KS_WWW_REFRESH:
+ return AC_REFRESH;
+ case KS_BRIGHTNESS_UP:
+ return BRIGHTNESS_UP;
+ case KS_BRIGHTNESS_DOWN:
+ return BRIGHTNESS_DOWN;
+ case KS_WWW_FAVORITES:
+ return AC_BOOKMARKS;
+ default:
+ return 0;
+ }
+}
diff --git a/src/keysym/consumer.h b/src/keysym/consumer.h
new file mode 100644
index 0000000..c760649
--- /dev/null
+++ b/src/keysym/consumer.h
@@ -0,0 +1,57 @@
+#pragma once
+
+#include "keysym.h"
+
+#include <stdint.h>
+
+/* Consumer Page (0x0C) */
+#define KS_MUTE KS_AUDIO_MUTE
+#define KS_VOLU KS_AUDIO_VOL_UP
+#define KS_VOLD KS_AUDIO_VOL_DOWN
+#define KS_MNXT KS_MEDIA_NEXT_TRACK
+#define KS_MPRV KS_MEDIA_PREV_TRACK
+#define KS_MSTP KS_MEDIA_STOP
+#define KS_MPLY KS_MEDIA_PLAY_PAUSE
+#define KS_MSEL KS_MEDIA_SELECT
+#define KS_EJCT KS_MEDIA_EJECT
+#define KS_CALC KS_CALCULATOR
+#define KS_MYCM KS_MY_COMPUTER
+#define KS_WSCH KS_WWW_SEARCH
+#define KS_WHOM KS_WWW_HOME
+#define KS_WBAK KS_WWW_BACK
+#define KS_WFWD KS_WWW_FORWARD
+#define KS_WSTP KS_WWW_STOP
+#define KS_WREF KS_WWW_REFRESH
+#define KS_WFAV KS_WWW_FAVORITES
+#define KS_MFFD KS_MEDIA_FAST_FORWARD
+#define KS_MRWD KS_MEDIA_REWIND
+#define KS_BRIU KS_BRIGHTNESS_UP
+#define KS_BRID KS_BRIGHTNESS_DOWN
+
+enum keysym_consumer {
+ KS_AUDIO_MUTE = KEYSYM_CONSUMER_MASK,
+ KS_AUDIO_VOL_UP,
+ KS_AUDIO_VOL_DOWN,
+ KS_MEDIA_NEXT_TRACK,
+ KS_MEDIA_PREV_TRACK,
+ KS_MEDIA_STOP,
+ KS_MEDIA_PLAY_PAUSE,
+ KS_MEDIA_SELECT,
+ KS_MEDIA_EJECT,
+ KS_MAIL,
+ KS_CALCULATOR,
+ KS_MY_COMPUTER,
+ KS_WWW_SEARCH,
+ KS_WWW_HOME,
+ KS_WWW_BACK,
+ KS_WWW_FORWARD,
+ KS_WWW_STOP,
+ KS_WWW_REFRESH,
+ KS_WWW_FAVORITES,
+ KS_MEDIA_FAST_FORWARD,
+ KS_MEDIA_REWIND,
+ KS_BRIGHTNESS_UP,
+ KS_BRIGHTNESS_DOWN
+};
+
+uint16_t keysym_to_consumer(uint32_t keysym);
diff --git a/src/keysym_de.h b/src/keysym/keyboard_de.h
index c4776d6..2294b46 100644
--- a/src/keysym_de.h
+++ b/src/keysym/keyboard_de.h
@@ -1,7 +1,7 @@
#pragma once
#include "keysym.h"
-#include "keycode.h"
+#include "hid/keyboard.h"
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
diff --git a/src/keysym_us.h b/src/keysym/keyboard_us.h
index 2409868..7107a9c 100644
--- a/src/keysym_us.h
+++ b/src/keysym/keyboard_us.h
@@ -1,7 +1,7 @@
#pragma once
#include "keysym.h"
-#include "keycode.h"
+#include "hid/keyboard.h"
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
diff --git a/src/keysym/mouse.h b/src/keysym/mouse.h
new file mode 100644
index 0000000..53d2a23
--- /dev/null
+++ b/src/keysym/mouse.h
@@ -0,0 +1,50 @@
+#pragma once
+
+#include "keysym.h"
+
+#define KS_MS_U KS_MS_UP
+#define KS_MS_D KS_MS_DOWN
+#define KS_MS_L KS_MS_LEFT
+#define KS_MS_R KS_MS_RIGHT
+#define KS_BTN1 KS_MS_BTN1
+#define KS_BTN2 KS_MS_BTN2
+#define KS_BTN3 KS_MS_BTN3
+#define KS_BTN4 KS_MS_BTN4
+#define KS_BTN5 KS_MS_BTN5
+#define KS_BTN6 KS_MS_BTN6
+#define KS_BTN7 KS_MS_BTN7
+#define KS_BTN8 KS_MS_BTN8
+#define KS_WH_U KS_MS_WH_UP
+#define KS_WH_D KS_MS_WH_DOWN
+#define KS_WH_L KS_MS_WH_LEFT
+#define KS_WH_R KS_MS_WH_RIGHT
+#define KS_ACL0 KS_MS_ACCEL0
+#define KS_ACL1 KS_MS_ACCEL1
+#define KS_ACL2 KS_MS_ACCEL2
+
+enum keysym_mouse {
+ /* Mouse Buttons */
+ KC_MS_UP = KEYSYM_MOUSE_MASK,
+ KC_MS_DOWN,
+ KC_MS_LEFT,
+ KC_MS_RIGHT,
+ KC_MS_BTN1,
+ KC_MS_BTN2,
+ KC_MS_BTN3,
+ KC_MS_BTN4,
+ KC_MS_BTN5,
+ KC_MS_BTN6,
+ KC_MS_BTN7,
+ KC_MS_BTN8,
+
+ /* 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
+};
diff --git a/src/keysym/system.c b/src/keysym/system.c
new file mode 100644
index 0000000..2aa9be9
--- /dev/null
+++ b/src/keysym/system.c
@@ -0,0 +1,20 @@
+#include "keysym/system.h"
+
+#include "hid/system.h"
+
+#include <stdint.h>
+
+uint16_t
+keysym_to_system(uint32_t keysym)
+{
+ switch (keysym) {
+ case KS_SYSTEM_POWER:
+ return SYSTEM_POWER_DOWN;
+ case KS_SYSTEM_SLEEP:
+ return SYSTEM_SLEEP;
+ case KS_SYSTEM_WAKE:
+ return SYSTEM_WAKE_UP;
+ default:
+ return 0;
+ }
+}
diff --git a/src/keysym/system.h b/src/keysym/system.h
new file mode 100644
index 0000000..f0174f5
--- /dev/null
+++ b/src/keysym/system.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "keysym.h"
+
+#include <stdint.h>
+
+/* Generic Desktop Page (0x01) */
+#define KS_PWR KS_SYSTEM_POWER
+#define KS_SLEP KS_SYSTEM_SLEEP
+#define KS_WAKE KS_SYSTEM_WAKE
+
+enum keysym_system {
+ KS_SYSTEM_POWER = KEYSYM_SYSTEM_MASK,
+ KS_SYSTEM_SLEEP,
+ KS_SYSTEM_WAKE,
+};
+
+uint16_t keysym_to_system(uint32_t keysym);
diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c
index 97a525b..9b70e2a 100644
--- a/src/usb_descriptors.c
+++ b/src/usb_descriptors.c
@@ -56,7 +56,9 @@ tusb_desc_device_t const desc_device = {
uint8_t const desc_hid_report[] = {
TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD)),
TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE)),
- TUD_HID_REPORT_DESC_CONSUMER(HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL))
+ TUD_HID_REPORT_DESC_CONSUMER(HID_REPORT_ID(REPORT_ID_CONSUMER)),
+ TUD_HID_REPORT_DESC_SYSTEM_CONTROL(HID_REPORT_ID(REPORT_ID_SYSTEM)),
+ TUD_HID_REPORT_DESC_GAMEPAD(HID_REPORT_ID(REPORT_ID_GAMEPAD))
};
uint8_t const desc_fs_configuration[] = {