From 4673fef7fd4e8bbfe147dfaf38f32c71ffc16a38 Mon Sep 17 00:00:00 2001 From: Karolis Stasaitis Date: Sun, 22 Dec 2024 14:57:00 +0100 Subject: [PATCH 1/4] extra keys (consumer and system) for usb --- src/kb/kb.h | 2 + src/keyboards/nuphy-air60/kb.c | 5 + .../nuphy-air60/layouts/default/layout.c | 30 +++- src/platform/sh68f90a/usb.c | 52 ++++-- src/platform/sh68f90a/usb.h | 8 + src/smk/host.c | 28 +++ src/smk/host.h | 2 + src/smk/matrix.c | 15 ++ src/smk/report.h | 159 ++++++++++++++++++ 9 files changed, 278 insertions(+), 23 deletions(-) diff --git a/src/kb/kb.h b/src/kb/kb.h index 099c028..7003995 100644 --- a/src/kb/kb.h +++ b/src/kb/kb.h @@ -6,6 +6,8 @@ void kb_init(); void kb_send_report(report_keyboard_t *report); +void kb_send_extra(report_extra_t *report); + bool kb_process_record(uint16_t keycode, bool key_pressed); void kb_update_switches(); void kb_update(); diff --git a/src/keyboards/nuphy-air60/kb.c b/src/keyboards/nuphy-air60/kb.c index 0910522..9c90231 100644 --- a/src/keyboards/nuphy-air60/kb.c +++ b/src/keyboards/nuphy-air60/kb.c @@ -90,6 +90,11 @@ void kb_send_report(report_keyboard_t *report) } } +void kb_send_extra(report_extra_t *report) +{ + usb_send_extra(report); +} + uint16_t ticks = 0; void kb_update() diff --git a/src/keyboards/nuphy-air60/layouts/default/layout.c b/src/keyboards/nuphy-air60/layouts/default/layout.c index 0d98fae..50e6baf 100644 --- a/src/keyboards/nuphy-air60/layouts/default/layout.c +++ b/src/keyboards/nuphy-air60/layouts/default/layout.c @@ -24,15 +24,17 @@ // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _BL 0 -#define _FL 1 +#define _MAC_BL 0 +#define _WIN_BL 1 +#define _MAC_FL 2 +#define _WIN_FL 3 enum custom_keycodes { SFT_ESC = KB_SAFE_RANGE, }; const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap _BL: (Base Layer) Default Layer + /* Keymap _WIN_BL: (Base Layer) Default Layer * ,------------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backsp| * |------------------------------------------------------------| @@ -45,12 +47,28 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Ctrl|Alt |Gui | Space |Gui|Fn |Lef|Dow|Rig| * `------------------------------------------------------------' */ - [_BL] = LAYOUT_60( + [_MAC_BL] = LAYOUT_60( SFT_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_LGUI, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, MO(_MAC_FL), KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_WIN_BL] = LAYOUT_60( + SFT_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_LGUI, MO(_WIN_FL), KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_MAC_FL] = LAYOUT_60( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_ASST, BL_DOWN, BL_UP, KC_MRWD, KC_MPLY, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, + _______, LNK_BT1, LNK_BT2, LNK_BT3, LNK_24G, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Keymap _FL: (Base Layer) Function Layer @@ -66,7 +84,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `------------------------------------------------------------' */ - [_FL] = LAYOUT_60( + [_WIN_FL] = LAYOUT_60( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______, LNK_BT1, LNK_BT2, LNK_BT3, LNK_24G, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/src/platform/sh68f90a/usb.c b/src/platform/sh68f90a/usb.c index 40ded65..4a7dd31 100644 --- a/src/platform/sh68f90a/usb.c +++ b/src/platform/sh68f90a/usb.c @@ -28,13 +28,6 @@ enum usb_string_index { USB_STRING_SERIAL_NUMBER = 3, }; -enum report_id { - REPORT_ID_ACPI = 1, - REPORT_ID_CONSUMER = 2, - REPORT_ID_ISP = 5, - REPORT_ID_NKRO = 6, -}; - typedef enum { USB_EP0_STATE_DEFAULT = 0x00, USB_EP0_STATE_IN_DATA = 0x01, @@ -96,35 +89,35 @@ const uint8_t hid_report_desc_extra[] = { HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop HID_RI_USAGE(8, 0x80), // System Control HID_RI_COLLECTION(8, 0x01), // Application - HID_RI_REPORT_ID(8, REPORT_ID_ACPI), // ACPI + HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), HID_RI_USAGE_MINIMUM(8, 0x81), HID_RI_USAGE_MAXIMUM(8, 0x83), HID_RI_LOGICAL_MINIMUM(8, 0x00), HID_RI_LOGICAL_MAXIMUM(8, 0x01), HID_RI_REPORT_SIZE(8, 1), HID_RI_REPORT_COUNT(8, 3), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), HID_RI_REPORT_COUNT(8, 5), - HID_RI_INPUT(8, HID_IOF_CONSTANT), + HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), HID_RI_USAGE_PAGE(8, 0x0C), // Consumer HID_RI_USAGE(8, 0x01), // Consumer Control HID_RI_COLLECTION(8, 0x01), // Application HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER), - HID_RI_USAGE_MINIMUM(8, 0x00), - HID_RI_USAGE_MAXIMUM(16, 0x023c), - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(16, 0x023c), + HID_RI_USAGE_MINIMUM(8, 0x00), // TODO: revise ranges + HID_RI_USAGE_MAXIMUM(16, 0x023c), // TODO: revise ranges + HID_RI_LOGICAL_MINIMUM(8, 0x00), // TODO: revise ranges + HID_RI_LOGICAL_MAXIMUM(16, 0x023c), // TODO: revise ranges HID_RI_REPORT_SIZE(8, 16), HID_RI_REPORT_COUNT(8, 1), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), HID_RI_USAGE_PAGE(16, 0xff00), // Vendor HID_RI_USAGE(8, 0x01), // Vendor HID_RI_COLLECTION(8, 0x01), // Application - HID_RI_REPORT_ID(8, REPORT_ID_ISP), // ISP + HID_RI_REPORT_ID(8, REPORT_ID_ISP), HID_RI_USAGE_MINIMUM(8, 0x01), HID_RI_USAGE_MAXIMUM(8, 0x02), HID_RI_LOGICAL_MINIMUM(8, 0x00), @@ -287,6 +280,8 @@ static void set_ep0_in_buffer(uint8_t *src, uint8_t len); static void get_ep0_out_buffer(uint8_t *dest); static void set_ep1_in_buffer(uint8_t *src, uint8_t len); static void get_ep1_out_buffer(uint8_t *dest); +static void set_ep2_in_buffer(uint8_t *src, uint8_t len); +static void get_ep2_out_buffer(uint8_t *dest); // request handlers static void usb_clear_remote_wakeup_handler(__xdata struct usb_req_setup *req); @@ -353,13 +348,21 @@ void usb_send_report(report_keyboard_t *report) { set_ep1_in_buffer(report->raw, KEYBOARD_REPORT_SIZE); - SET_EP1_CNT(8); + SET_EP1_CNT(KEYBOARD_REPORT_SIZE); SET_EP1_IN_RDY; // TODO: this function should be blocking until transaction is finished, instead of a delay delay_ms(10); } +void usb_send_extra(report_extra_t *report) +{ + set_ep2_in_buffer((uint8_t *)report, sizeof(report_extra_t)); + + SET_EP2_CNT(sizeof(report_extra_t)); + SET_EP2_IN_RDY; +} + static void usb_setup_irq() { usb_req_setup_x req; @@ -1099,3 +1102,18 @@ static void get_ep1_out_buffer(uint8_t *dest) { memcpy(dest, EP1_OUT_BUF, EP1_BUF_SIZE); } + +static void set_ep2_in_buffer(uint8_t *src, uint8_t len) +{ + if (len > EP2_BUF_SIZE) { + dprintf("%s buffer too long: %d", __func__, len); + return; + } + + memcpy(EP2_IN_BUF, src, len); +} + +static void get_ep2_out_buffer(uint8_t *dest) +{ + memcpy(dest, EP2_OUT_BUF, EP2_BUF_SIZE); +} diff --git a/src/platform/sh68f90a/usb.h b/src/platform/sh68f90a/usb.h index 249fef9..9f79264 100644 --- a/src/platform/sh68f90a/usb.h +++ b/src/platform/sh68f90a/usb.h @@ -4,7 +4,15 @@ #include "report.h" #include +enum usb_report_id { + REPORT_ID_SYSTEM = 1, + REPORT_ID_CONSUMER = 2, + REPORT_ID_ISP = 5, + REPORT_ID_NKRO = 6, +}; + void usb_init(); void usb_send_report(report_keyboard_t *report); +void usb_send_extra(report_extra_t *report); void usb_interrupt_handler() __interrupt(_INT_USB); diff --git a/src/smk/host.c b/src/smk/host.c index 2d89452..e17ead3 100644 --- a/src/smk/host.c +++ b/src/smk/host.c @@ -1,8 +1,36 @@ #include "host.h" #include "debug.h" #include "kb.h" +#include "usb.h" + +static __xdata uint16_t last_system_usage = 0; +static __xdata uint16_t last_consumer_usage = 0; void host_keyboard_send(report_keyboard_t *report) { kb_send_report(report); } + +void host_system_send(uint16_t usage) +{ + if (usage == last_system_usage) return; + last_system_usage = usage; + + __xdata report_extra_t report = { + .report_id = REPORT_ID_SYSTEM, + .usage = usage, + }; + kb_send_extra(&report); +} + +void host_consumer_send(uint16_t usage) +{ + if (usage == last_consumer_usage) return; + last_consumer_usage = usage; + + __xdata report_extra_t report = { + .report_id = REPORT_ID_CONSUMER, + .usage = usage, + }; + kb_send_extra(&report); +} diff --git a/src/smk/host.h b/src/smk/host.h index be45319..1187dfe 100644 --- a/src/smk/host.h +++ b/src/smk/host.h @@ -4,3 +4,5 @@ #include "report.h" void host_keyboard_send(report_keyboard_t *report); +void host_system_send(uint16_t usage); +void host_consumer_send(uint16_t usage); diff --git a/src/smk/matrix.c b/src/smk/matrix.c index 18e165f..b1d81c1 100644 --- a/src/smk/matrix.c +++ b/src/smk/matrix.c @@ -7,6 +7,7 @@ #include "indicators.h" #include "user_matrix.h" #include "kbdef.h" +#include "host.h" #include #include @@ -100,6 +101,20 @@ void process_key_state(uint8_t row, uint8_t col, bool pressed) send_keyboard_report(); return; + } else if (IS_SYSTEM_KEYCODE(qcode)) { + if (pressed) { + host_system_send(KEYCODE2SYSTEM(qcode)); + } else { + host_system_send(0); + } + return; + } else if (IS_CONSUMER_KEYCODE(qcode)) { + if (pressed) { + host_consumer_send(KEYCODE2CONSUMER(qcode)); + } else { + host_consumer_send(0); + } + return; } dprintf("UNRECOGNIZED KEY: 0x%04x\r\n", qcode); diff --git a/src/smk/report.h b/src/smk/report.h index 6a00abc..eccade7 100644 --- a/src/smk/report.h +++ b/src/smk/report.h @@ -2,6 +2,7 @@ #include #include +#include "keycodes.h" #define KEYBOARD_REPORT_SIZE 8 #define KEYBOARD_REPORT_KEYS 6 @@ -61,3 +62,161 @@ void add_mods(uint8_t mods); void del_mods(uint8_t mods); void set_mods(uint8_t mods); void clear_mods(void); + +typedef struct { + uint8_t report_id; + uint16_t usage; +} report_extra_t; + +/* Consumer Page (0x0C) + * + * See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=75 + */ +enum consumer_usages { + // 15.5 Display Controls + SNAPSHOT = 0x065, + BRIGHTNESS_UP = 0x06F, // https://www.usb.org/sites/default/files/hutrr41_0.pdf + 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, + AC_NEXT_KEYBOARD_LAYOUT_SELECT = 0x29D, + AC_DESKTOP_SHOW_ALL_WINDOWS = 0x29F, + AC_SOFT_KEY_LEFT = 0x2A0 +}; + +/* Generic Desktop Page (0x01) + * + * See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=26 + */ +enum desktop_usages { + // 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 +}; + +/* keycode to system usage */ +static inline uint16_t KEYCODE2SYSTEM(uint8_t key) +{ + switch (key) { + case KC_SYSTEM_POWER: + return SYSTEM_POWER_DOWN; + case KC_SYSTEM_SLEEP: + return SYSTEM_SLEEP; + case KC_SYSTEM_WAKE: + return SYSTEM_WAKE_UP; + default: + return 0; + } +} + +/* keycode to consumer usage */ +static inline uint16_t KEYCODE2CONSUMER(uint8_t key) +{ + switch (key) { + case KC_AUDIO_MUTE: + return AUDIO_MUTE; + case KC_AUDIO_VOL_UP: + return AUDIO_VOL_UP; + case KC_AUDIO_VOL_DOWN: + return AUDIO_VOL_DOWN; + case KC_MEDIA_NEXT_TRACK: + return TRANSPORT_NEXT_TRACK; + case KC_MEDIA_PREV_TRACK: + return TRANSPORT_PREV_TRACK; + case KC_MEDIA_FAST_FORWARD: + return TRANSPORT_FAST_FORWARD; + case KC_MEDIA_REWIND: + return TRANSPORT_REWIND; + case KC_MEDIA_STOP: + return TRANSPORT_STOP; + case KC_MEDIA_EJECT: + return TRANSPORT_STOP_EJECT; + case KC_MEDIA_PLAY_PAUSE: + return TRANSPORT_PLAY_PAUSE; + case KC_MEDIA_SELECT: + return AL_CC_CONFIG; + case KC_MAIL: + return AL_EMAIL; + case KC_CALCULATOR: + return AL_CALCULATOR; + case KC_MY_COMPUTER: + return AL_LOCAL_BROWSER; + case KC_CONTROL_PANEL: + return AL_CONTROL_PANEL; + case KC_ASSISTANT: + return AL_ASSISTANT; + case KC_WWW_SEARCH: + return AC_SEARCH; + case KC_WWW_HOME: + return AC_HOME; + case KC_WWW_BACK: + return AC_BACK; + case KC_WWW_FORWARD: + return AC_FORWARD; + case KC_WWW_STOP: + return AC_STOP; + case KC_WWW_REFRESH: + return AC_REFRESH; + case KC_BRIGHTNESS_UP: + return BRIGHTNESS_UP; + case KC_BRIGHTNESS_DOWN: + return BRIGHTNESS_DOWN; + case KC_WWW_FAVORITES: + return AC_BOOKMARKS; + case KC_MISSION_CONTROL: + return AC_DESKTOP_SHOW_ALL_WINDOWS; + case KC_LAUNCHPAD: + return AC_SOFT_KEY_LEFT; + default: + return 0; + } +} From 8345ee9cdbd1c1087865fbdc6a85def1df87aea2 Mon Sep 17 00:00:00 2001 From: Karolis Stasaitis Date: Sun, 22 Dec 2024 15:24:25 +0100 Subject: [PATCH 2/4] consumer keys on rf --- src/keyboards/nuphy-air60/kb.c | 11 ++- src/platform/bk3632/rf_controller.c | 106 +++++++++++++++++----------- src/platform/bk3632/rf_controller.h | 1 + src/platform/sh68f90a/usb.h | 7 -- src/smk/report.h | 7 ++ 5 files changed, 81 insertions(+), 51 deletions(-) diff --git a/src/keyboards/nuphy-air60/kb.c b/src/keyboards/nuphy-air60/kb.c index 9c90231..59abcf8 100644 --- a/src/keyboards/nuphy-air60/kb.c +++ b/src/keyboards/nuphy-air60/kb.c @@ -92,7 +92,16 @@ void kb_send_report(report_keyboard_t *report) void kb_send_extra(report_extra_t *report) { - usb_send_extra(report); + switch (user_keyboard_state.conn_mode) { + case KEYBOARD_CONN_MODE_USB: + usb_send_extra(report); + break; +#ifdef RF_ENABLED + case KEYBOARD_CONN_MODE_RF: + rf_send_extra(report); + break; +#endif + } } uint16_t ticks = 0; diff --git a/src/platform/bk3632/rf_controller.c b/src/platform/bk3632/rf_controller.c index 0867734..bb2a09a 100644 --- a/src/platform/bk3632/rf_controller.c +++ b/src/platform/bk3632/rf_controller.c @@ -35,7 +35,7 @@ void rf_cmd_01(uint8_t mode, uint8_t pairing); void rf_cmd_02(uint8_t *buffer); void rf_cmd_03(uint8_t param); void rf_cmd_04(); -void rf_cmd_05(); +void rf_cmd_05(uint16_t data); void rf_cmd_06(uint8_t param); void rf_cmd_08(uint8_t type, char *name); void rf_cmd_0a(); @@ -63,7 +63,7 @@ void rf_init() delay_ms(20); rf_cmd_01(RF_MODE_2_4G, RF_PAIRING_OFF); delay_ms(15); - rf_cmd_05(); + rf_cmd_05(0); delay_ms(30); rf_send_blank_report(); } @@ -107,6 +107,18 @@ void rf_send_report(report_keyboard_t *report) } } +void rf_send_extra(report_extra_t *report) +{ + switch (report->report_id) { + case REPORT_ID_SYSTEM: + // TODO: implement + break; + case REPORT_ID_CONSUMER: + rf_cmd_05(report->usage); + break; + } +} + void rf_update_keyboard_state(keyboard_state_t *keyboard) { __xdata uint8_t status_bytes[2]; @@ -177,11 +189,12 @@ void rf_cmd_01(uint8_t mode, uint8_t pairing) { const uint8_t len = 6; - rf_tx_buf[0] = MAGIC_BYTE; - rf_tx_buf[1] = len - 3; - rf_tx_buf[2] = 0x01; - rf_tx_buf[3] = mode; - rf_tx_buf[4] = pairing; + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x01; + rf_tx_buf[3] = mode; + rf_tx_buf[4] = pairing; + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, 6); @@ -203,7 +216,7 @@ void rf_cmd_02(uint8_t *buffer) // FIXME: last keyboard report key is lost rf_tx_buf[9] = 0x00; // 0x00 or 0x01 - for (int i = 10; i < 31; i++) { // FIXME: NKRO / Media Keys bytes are blanked out until they are implemented + for (int i = 10; i < 31; i++) { // FIXME: NKRO / Extra Keys bytes are blanked out until they are implemented rf_tx_buf[i] = 0x00; } @@ -216,11 +229,12 @@ void rf_cmd_03(uint8_t param) // ?? or 0x02 { const uint8_t len = 6; - rf_tx_buf[0] = MAGIC_BYTE; - rf_tx_buf[1] = len - 3; - rf_tx_buf[2] = 0x03; - rf_tx_buf[3] = param; - rf_tx_buf[4] = 0x00; + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x03; + rf_tx_buf[3] = param; + rf_tx_buf[4] = 0x00; + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, 6); @@ -233,28 +247,30 @@ void rf_cmd_04() rf_tx_buf[0] = MAGIC_BYTE; rf_tx_buf[1] = len - 3; rf_tx_buf[2] = 0x04; - rf_tx_buf[3] = checksum(rf_tx_buf, 3); + + rf_tx_buf[len - 1] = checksum(rf_tx_buf, 3); bb_spi_xfer(rf_tx_buf, 4); } -void rf_cmd_05() +void rf_cmd_05(uint16_t data) // Consumer Keys { const uint8_t len = 14; - rf_tx_buf[0] = MAGIC_BYTE; - rf_tx_buf[1] = len - 3; - rf_tx_buf[2] = 0x05; - rf_tx_buf[3] = 0x00; - rf_tx_buf[4] = 0x00; - rf_tx_buf[5] = 0x00; - rf_tx_buf[6] = 0x00; - rf_tx_buf[7] = 0x00; - rf_tx_buf[8] = 0x00; - rf_tx_buf[9] = 0x00; - rf_tx_buf[10] = 0x00; - rf_tx_buf[11] = 0x00; - rf_tx_buf[12] = 0x00; + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x05; + rf_tx_buf[3] = 0x00; + rf_tx_buf[4] = 0x00; + rf_tx_buf[5] = 0x00; + rf_tx_buf[6] = 0x00; + rf_tx_buf[7] = 0x00; + rf_tx_buf[8] = 0x00; + rf_tx_buf[9] = data & 0xff; + rf_tx_buf[10] = data >> 8; + rf_tx_buf[11] = 0x00; + rf_tx_buf[12] = 0x00; + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, len); @@ -264,11 +280,12 @@ void rf_cmd_06(uint8_t param) // 0x00 or 0x01 { const uint8_t len = 6; - rf_tx_buf[0] = MAGIC_BYTE; - rf_tx_buf[1] = len - 3; - rf_tx_buf[2] = 0x06; - rf_tx_buf[3] = param; - rf_tx_buf[4] = 0x00; + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x06; + rf_tx_buf[3] = param; + rf_tx_buf[4] = 0x00; + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, len); @@ -291,6 +308,7 @@ void rf_cmd_08(uint8_t type, char *name) for (int j = i; j < (len - 1); j++) { rf_tx_buf[j] = 0x00; } + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, len); @@ -300,11 +318,12 @@ void rf_cmd_0a() { const uint8_t len = 6; - rf_tx_buf[0] = MAGIC_BYTE; - rf_tx_buf[1] = len - 3; - rf_tx_buf[2] = 0x0a; - rf_tx_buf[3] = 0x00; - rf_tx_buf[4] = 0x00; + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x0a; + rf_tx_buf[3] = 0x00; + rf_tx_buf[4] = 0x00; + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, len); @@ -314,11 +333,12 @@ void rf_cmd_0c() { const uint8_t len = 6; - rf_tx_buf[0] = MAGIC_BYTE; - rf_tx_buf[1] = len - 3; - rf_tx_buf[2] = 0x0c; - rf_tx_buf[3] = 0x00; - rf_tx_buf[4] = 0x00; + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x0c; + rf_tx_buf[3] = 0x00; + rf_tx_buf[4] = 0x00; + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); bb_spi_xfer(rf_tx_buf, len); diff --git a/src/platform/bk3632/rf_controller.h b/src/platform/bk3632/rf_controller.h index ee4255d..27ed52a 100644 --- a/src/platform/bk3632/rf_controller.h +++ b/src/platform/bk3632/rf_controller.h @@ -5,4 +5,5 @@ void rf_init(); void rf_send_report(report_keyboard_t *report); +void rf_send_extra(report_extra_t *report); void rf_update_keyboard_state(keyboard_state_t *keyboard); diff --git a/src/platform/sh68f90a/usb.h b/src/platform/sh68f90a/usb.h index 9f79264..385ea7f 100644 --- a/src/platform/sh68f90a/usb.h +++ b/src/platform/sh68f90a/usb.h @@ -4,13 +4,6 @@ #include "report.h" #include -enum usb_report_id { - REPORT_ID_SYSTEM = 1, - REPORT_ID_CONSUMER = 2, - REPORT_ID_ISP = 5, - REPORT_ID_NKRO = 6, -}; - void usb_init(); void usb_send_report(report_keyboard_t *report); void usb_send_extra(report_extra_t *report); diff --git a/src/smk/report.h b/src/smk/report.h index eccade7..86815bb 100644 --- a/src/smk/report.h +++ b/src/smk/report.h @@ -7,6 +7,13 @@ #define KEYBOARD_REPORT_SIZE 8 #define KEYBOARD_REPORT_KEYS 6 +enum report_id { + REPORT_ID_SYSTEM = 1, + REPORT_ID_CONSUMER = 2, + REPORT_ID_ISP = 5, + REPORT_ID_NKRO = 6, +}; + /* * keyboard report is 8-byte array retains state of 8 modifiers and 6 keys. * From 4a5246ec900e589a617baf47fb43d3456b907308 Mon Sep 17 00:00:00 2001 From: Karolis Stasaitis Date: Sun, 22 Dec 2024 18:02:30 +0100 Subject: [PATCH 3/4] system keys rf and usb fix --- src/platform/bk3632/rf_controller.c | 52 +++++++++++++++++++++++------ src/platform/sh68f90a/usb.c | 2 +- src/smk/report.h | 9 ++--- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/platform/bk3632/rf_controller.c b/src/platform/bk3632/rf_controller.c index bb2a09a..86b2d1f 100644 --- a/src/platform/bk3632/rf_controller.c +++ b/src/platform/bk3632/rf_controller.c @@ -35,10 +35,12 @@ void rf_cmd_01(uint8_t mode, uint8_t pairing); void rf_cmd_02(uint8_t *buffer); void rf_cmd_03(uint8_t param); void rf_cmd_04(); -void rf_cmd_05(uint16_t data); +void rf_cmd_05(uint16_t consumer, uint16_t system); void rf_cmd_06(uint8_t param); +void rf_cmd_07(uint8_t param); void rf_cmd_08(uint8_t type, char *name); void rf_cmd_0a(); +void rf_cmd_0b(); void rf_cmd_0c(); void rf_fetch_4(); uint8_t checksum(uint8_t *data, int len); @@ -63,7 +65,7 @@ void rf_init() delay_ms(20); rf_cmd_01(RF_MODE_2_4G, RF_PAIRING_OFF); delay_ms(15); - rf_cmd_05(0); + rf_cmd_05(0, 0); delay_ms(30); rf_send_blank_report(); } @@ -111,10 +113,10 @@ void rf_send_extra(report_extra_t *report) { switch (report->report_id) { case REPORT_ID_SYSTEM: - // TODO: implement + rf_cmd_05(0, report->usage); break; case REPORT_ID_CONSUMER: - rf_cmd_05(report->usage); + rf_cmd_05(report->usage, 0); break; } } @@ -216,7 +218,7 @@ void rf_cmd_02(uint8_t *buffer) // FIXME: last keyboard report key is lost rf_tx_buf[9] = 0x00; // 0x00 or 0x01 - for (int i = 10; i < 31; i++) { // FIXME: NKRO / Extra Keys bytes are blanked out until they are implemented + for (int i = 10; i < 31; i++) { // FIXME: NKRO bytes are blanked out until they are implemented rf_tx_buf[i] = 0x00; } @@ -253,7 +255,7 @@ void rf_cmd_04() bb_spi_xfer(rf_tx_buf, 4); } -void rf_cmd_05(uint16_t data) // Consumer Keys +void rf_cmd_05(uint16_t consumer, uint16_t system) { const uint8_t len = 14; @@ -266,10 +268,10 @@ void rf_cmd_05(uint16_t data) // Consumer Keys rf_tx_buf[6] = 0x00; rf_tx_buf[7] = 0x00; rf_tx_buf[8] = 0x00; - rf_tx_buf[9] = data & 0xff; - rf_tx_buf[10] = data >> 8; - rf_tx_buf[11] = 0x00; - rf_tx_buf[12] = 0x00; + rf_tx_buf[9] = consumer & 0xff; + rf_tx_buf[10] = consumer >> 8; + rf_tx_buf[11] = system & 0xff; + rf_tx_buf[12] = system >> 8; rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); @@ -291,6 +293,21 @@ void rf_cmd_06(uint8_t param) // 0x00 or 0x01 bb_spi_xfer(rf_tx_buf, len); } +void rf_cmd_07(uint8_t param) +{ + const uint8_t len = 6; + + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x07; + rf_tx_buf[3] = param; + rf_tx_buf[4] = 0x00; + + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); + + bb_spi_xfer(rf_tx_buf, len); +} + void rf_cmd_08(uint8_t type, char *name) { const uint8_t len = 32; @@ -329,6 +346,21 @@ void rf_cmd_0a() bb_spi_xfer(rf_tx_buf, len); } +void rf_cmd_0b() +{ + const uint8_t len = 6; + + rf_tx_buf[0] = MAGIC_BYTE; + rf_tx_buf[1] = len - 3; + rf_tx_buf[2] = 0x0b; + rf_tx_buf[3] = 0x00; + rf_tx_buf[4] = 0x00; + + rf_tx_buf[len - 1] = checksum(rf_tx_buf, len - 1); + + bb_spi_xfer(rf_tx_buf, len); +} + void rf_cmd_0c() { const uint8_t len = 6; diff --git a/src/platform/sh68f90a/usb.c b/src/platform/sh68f90a/usb.c index 4a7dd31..9749d88 100644 --- a/src/platform/sh68f90a/usb.c +++ b/src/platform/sh68f90a/usb.c @@ -101,7 +101,7 @@ const uint8_t hid_report_desc_extra[] = { HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), - HID_RI_USAGE_PAGE(8, 0x0C), // Consumer + HID_RI_USAGE_PAGE(8, 0x0c), // Consumer HID_RI_USAGE(8, 0x01), // Consumer Control HID_RI_COLLECTION(8, 0x01), // Application HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER), diff --git a/src/smk/report.h b/src/smk/report.h index 86815bb..bbf2eca 100644 --- a/src/smk/report.h +++ b/src/smk/report.h @@ -142,12 +142,9 @@ enum consumer_usages { */ enum desktop_usages { // 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 + SYSTEM_POWER_DOWN = 1 << 0, + SYSTEM_SLEEP = 1 << 1, + SYSTEM_WAKE_UP = 1 << 2, }; /* keycode to system usage */ From eb7744965ea2b923e56c9762f248bb3d412da8fc Mon Sep 17 00:00:00 2001 From: Karolis Stasaitis Date: Sun, 22 Dec 2024 21:12:12 +0100 Subject: [PATCH 4/4] extra keys for other examples --- src/keyboards/example/kb.c | 5 +++++ src/keyboards/eyooso-z11/kb.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/keyboards/example/kb.c b/src/keyboards/example/kb.c index ecedcc6..89666be 100644 --- a/src/keyboards/example/kb.c +++ b/src/keyboards/example/kb.c @@ -5,3 +5,8 @@ void kb_send_report(report_keyboard_t *report) { usb_send_report(report); } + +void kb_send_extra(report_extra_t *report) +{ + usb_send_extra(report); +} diff --git a/src/keyboards/eyooso-z11/kb.c b/src/keyboards/eyooso-z11/kb.c index ecedcc6..89666be 100644 --- a/src/keyboards/eyooso-z11/kb.c +++ b/src/keyboards/eyooso-z11/kb.c @@ -5,3 +5,8 @@ void kb_send_report(report_keyboard_t *report) { usb_send_report(report); } + +void kb_send_extra(report_extra_t *report) +{ + usb_send_extra(report); +}