Browse Source

feat(hid): Kconfig for basic/full consumer usages.

* Add ZMK_HID_CONSUMER_REPORT_USAGES choice to allow choosing
  between full consumer usage range, with poor OS compat,
  or basic consumer usage range, with broader compat.
xmkb
Peter Johanson 3 years ago committed by Pete Johanson
parent
commit
bc179b1030
  1. 19
      app/Kconfig
  2. 25
      app/include/zmk/hid.h
  3. 2
      app/src/hid.c

19
app/Kconfig

@ -51,13 +51,30 @@ config ZMK_HID_KEYBOARD_REPORT_SIZE
int "# Keyboard Keys Reportable" int "# Keyboard Keys Reportable"
default 6 default 6
endif endif
config ZMK_HID_CONSUMER_REPORT_SIZE config ZMK_HID_CONSUMER_REPORT_SIZE
int "# Consumer Keys Reportable" int "# Consumer Keys Reportable"
default 6 default 6
choice ZMK_HID_CONSUMER_REPORT_USAGES
prompt "HID Report Type"
config ZMK_HID_CONSUMER_REPORT_USAGES_FULL
bool "Full Consumer HID Usage Support"
help
Enable full Consumer usage ID values to be sent to hosts. Allows for less
frequently used usages, but has compatibability issues with some host OSes.
config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC
bool "Basic Consumer HID Usage Support"
help
Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to
hosts. Allows for broader compatibability with more host OSes.
endchoice
menu "Output Types" menu "Output Types"
config ZMK_USB config ZMK_USB

25
app/include/zmk/hid.h

@ -138,6 +138,24 @@ static const uint8_t zmk_hid_report_desc[] = {
/* USAGE_PAGE (Consumer) */ /* USAGE_PAGE (Consumer) */
HID_GI_USAGE_PAGE, HID_GI_USAGE_PAGE,
HID_USAGE_CONSUMER, HID_USAGE_CONSUMER,
#if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC)
/* LOGICAL_MINIMUM (0) */
HID_GI_LOGICAL_MIN(1),
0x00,
/* LOGICAL_MAXIMUM (0xFFFF) */
HID_GI_LOGICAL_MAX(1),
0xFF,
HID_LI_USAGE_MIN(1),
0x00,
/* USAGE_MAXIMUM (0xFFFF) */
HID_LI_USAGE_MAX(1),
0xFF,
/* INPUT (Data,Ary,Abs) */
/* REPORT_SIZE (8) */
HID_GI_REPORT_SIZE,
0x08,
#elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL)
/* LOGICAL_MINIMUM (0) */ /* LOGICAL_MINIMUM (0) */
HID_GI_LOGICAL_MIN(1), HID_GI_LOGICAL_MIN(1),
0x00, 0x00,
@ -155,6 +173,9 @@ static const uint8_t zmk_hid_report_desc[] = {
/* REPORT_SIZE (16) */ /* REPORT_SIZE (16) */
HID_GI_REPORT_SIZE, HID_GI_REPORT_SIZE,
0x10, 0x10,
#else
#error "A proper consumer HID report usage range must be selected"
#endif
/* REPORT_COUNT (CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE) */ /* REPORT_COUNT (CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE) */
HID_GI_REPORT_COUNT, HID_GI_REPORT_COUNT,
CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE, CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE,
@ -187,7 +208,11 @@ struct zmk_hid_keyboard_report {
} __packed; } __packed;
struct zmk_hid_consumer_report_body { struct zmk_hid_consumer_report_body {
#if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC)
uint8_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE];
#elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL)
uint16_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE]; uint16_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE];
#endif
} __packed; } __packed;
struct zmk_hid_consumer_report { struct zmk_hid_consumer_report {

2
app/src/hid.c

@ -117,6 +117,8 @@ static inline int deselect_keyboard_usage(zmk_key_t usage) {
#endif #endif
#define TOGGLE_CONSUMER(match, val) \ #define TOGGLE_CONSUMER(match, val) \
COND_CODE_1(IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC), \
(if (val > 0xFF) { return -ENOTSUP; }), ()) \
for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { \ for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { \
if (consumer_report.body.keys[idx] != match) { \ if (consumer_report.body.keys[idx] != match) { \
continue; \ continue; \

Loading…
Cancel
Save