mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Separate 6KRO and NKRO report structs (#22267)
This commit is contained in:
		
							parent
							
								
									bf6f13a2b0
								
							
						
					
					
						commit
						0c160e1fba
					
				| @ -31,7 +31,7 @@ static void ap2_ble_swtich_ble_driver(void); | |||||||
| 
 | 
 | ||||||
| /* -------------------- Static Local Variables ------------------------------ */ | /* -------------------- Static Local Variables ------------------------------ */ | ||||||
| static host_driver_t ap2_ble_driver = { | static host_driver_t ap2_ble_driver = { | ||||||
|     ap2_ble_leds, ap2_ble_keyboard, ap2_ble_mouse, ap2_ble_extra |     ap2_ble_leds, ap2_ble_keyboard, NULL, ap2_ble_mouse, ap2_ble_extra | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static uint8_t ble_mcu_wakeup[11] = {0x7b, 0x12, 0x53, 0x00, 0x03, 0x00, 0x01, 0x7d, 0x02, 0x01, 0x02}; | static uint8_t ble_mcu_wakeup[11] = {0x7b, 0x12, 0x53, 0x00, 0x03, 0x00, 0x01, 0x7d, 0x02, 0x01, 0x02}; | ||||||
|  | |||||||
| @ -19,8 +19,7 @@ | |||||||
|             "knight": true, |             "knight": true, | ||||||
|             "christmas": true, |             "christmas": true, | ||||||
|             "static_gradient": true, |             "static_gradient": true, | ||||||
|             "alternating": true, |             "alternating": true | ||||||
|             "twinkle": true |  | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     "ws2812": { |     "ws2812": { | ||||||
|  | |||||||
| @ -38,7 +38,6 @@ | |||||||
|       "knight": true, |       "knight": true, | ||||||
|       "christmas": true, |       "christmas": true, | ||||||
|       "static_gradient": true, |       "static_gradient": true, | ||||||
|       "rgb_test": true, |  | ||||||
|       "alternating": true, |       "alternating": true, | ||||||
|       "twinkle": true |       "twinkle": true | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -925,7 +925,7 @@ __attribute__((weak)) void register_code(uint8_t code) { | |||||||
|         // Force a new key press if the key is already pressed
 |         // Force a new key press if the key is already pressed
 | ||||||
|         // without this, keys with the same keycode, but different
 |         // without this, keys with the same keycode, but different
 | ||||||
|         // modifiers will be reported incorrectly, see issue #1708
 |         // modifiers will be reported incorrectly, see issue #1708
 | ||||||
|         if (is_key_pressed(keyboard_report, code)) { |         if (is_key_pressed(code)) { | ||||||
|             del_key(code); |             del_key(code); | ||||||
|             send_keyboard_report(); |             send_keyboard_report(); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -35,6 +35,9 @@ static uint8_t suppressed_mods    = 0; | |||||||
| // TODO: pointer variable is not needed
 | // TODO: pointer variable is not needed
 | ||||||
| // report_keyboard_t keyboard_report = {};
 | // report_keyboard_t keyboard_report = {};
 | ||||||
| report_keyboard_t *keyboard_report = &(report_keyboard_t){}; | report_keyboard_t *keyboard_report = &(report_keyboard_t){}; | ||||||
|  | #ifdef NKRO_ENABLE | ||||||
|  | report_nkro_t *nkro_report = &(report_nkro_t){}; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| extern inline void add_key(uint8_t key); | extern inline void add_key(uint8_t key); | ||||||
| extern inline void del_key(uint8_t key); | extern inline void del_key(uint8_t key); | ||||||
| @ -252,13 +255,8 @@ bool is_oneshot_enabled(void) { | |||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /** \brief Send keyboard report
 | static uint8_t get_mods_for_report(void) { | ||||||
|  * |     uint8_t mods = real_mods | weak_mods; | ||||||
|  * FIXME: needs doc |  | ||||||
|  */ |  | ||||||
| void send_keyboard_report(void) { |  | ||||||
|     keyboard_report->mods = real_mods; |  | ||||||
|     keyboard_report->mods |= weak_mods; |  | ||||||
| 
 | 
 | ||||||
| #ifndef NO_ACTION_ONESHOT | #ifndef NO_ACTION_ONESHOT | ||||||
|     if (oneshot_mods) { |     if (oneshot_mods) { | ||||||
| @ -268,20 +266,25 @@ void send_keyboard_report(void) { | |||||||
|             clear_oneshot_mods(); |             clear_oneshot_mods(); | ||||||
|         } |         } | ||||||
| #    endif | #    endif | ||||||
|         keyboard_report->mods |= oneshot_mods; |         mods |= oneshot_mods; | ||||||
|         if (has_anykey(keyboard_report)) { |         if (has_anykey()) { | ||||||
|             clear_oneshot_mods(); |             clear_oneshot_mods(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef KEY_OVERRIDE_ENABLE | #ifdef KEY_OVERRIDE_ENABLE | ||||||
|     // These need to be last to be able to properly control key overrides
 |     // These need to be last to be able to properly control key overrides
 | ||||||
|     keyboard_report->mods &= ~suppressed_mods; |     mods &= ~suppressed_mods; | ||||||
|     keyboard_report->mods |= weak_override_mods; |     mods |= weak_override_mods; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |     return mods; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void send_6kro_report(void) { | ||||||
|  |     keyboard_report->mods = get_mods_for_report(); | ||||||
|  | 
 | ||||||
| #ifdef PROTOCOL_VUSB | #ifdef PROTOCOL_VUSB | ||||||
|     host_keyboard_send(keyboard_report); |     host_keyboard_send(keyboard_report); | ||||||
| #else | #else | ||||||
| @ -295,6 +298,36 @@ void send_keyboard_report(void) { | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef NKRO_ENABLE | ||||||
|  | void send_nkro_report(void) { | ||||||
|  |     nkro_report->mods = get_mods_for_report(); | ||||||
|  | 
 | ||||||
|  |     static report_nkro_t last_report; | ||||||
|  | 
 | ||||||
|  |     /* Only send the report if there are changes to propagate to the host. */ | ||||||
|  |     if (memcmp(nkro_report, &last_report, sizeof(report_nkro_t)) != 0) { | ||||||
|  |         memcpy(&last_report, nkro_report, sizeof(report_nkro_t)); | ||||||
|  |         host_nkro_send(nkro_report); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /** \brief Send keyboard report
 | ||||||
|  |  * | ||||||
|  |  * FIXME: needs doc | ||||||
|  |  */ | ||||||
|  | void send_keyboard_report(void) { | ||||||
|  | #ifdef NKRO_ENABLE | ||||||
|  |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|  |         send_nkro_report(); | ||||||
|  |     } else { | ||||||
|  |         send_6kro_report(); | ||||||
|  |     } | ||||||
|  | #else | ||||||
|  |     send_6kro_report(); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** \brief Get mods
 | /** \brief Get mods
 | ||||||
|  * |  * | ||||||
|  * FIXME: needs doc |  * FIXME: needs doc | ||||||
|  | |||||||
| @ -26,20 +26,23 @@ extern "C" { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| extern report_keyboard_t *keyboard_report; | extern report_keyboard_t *keyboard_report; | ||||||
|  | #ifdef NKRO_ENABLE | ||||||
|  | extern report_nkro_t *nkro_report; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| void send_keyboard_report(void); | void send_keyboard_report(void); | ||||||
| 
 | 
 | ||||||
| /* key */ | /* key */ | ||||||
| inline void add_key(uint8_t key) { | inline void add_key(uint8_t key) { | ||||||
|     add_key_to_report(keyboard_report, key); |     add_key_to_report(key); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline void del_key(uint8_t key) { | inline void del_key(uint8_t key) { | ||||||
|     del_key_from_report(keyboard_report, key); |     del_key_from_report(key); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline void clear_keys(void) { | inline void clear_keys(void) { | ||||||
|     clear_keys_from_report(keyboard_report); |     clear_keys_from_report(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* modifier */ | /* modifier */ | ||||||
|  | |||||||
| @ -95,12 +95,12 @@ std::ostream& operator<<(std::ostream& os, const report_keyboard_t& report) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| KeyboardReportMatcher::KeyboardReportMatcher(const std::vector<uint8_t>& keys) { | KeyboardReportMatcher::KeyboardReportMatcher(const std::vector<uint8_t>& keys) { | ||||||
|     memset(m_report.raw, 0, sizeof(m_report.raw)); |     memset(&m_report, 0, sizeof(report_keyboard_t)); | ||||||
|     for (auto k : keys) { |     for (auto k : keys) { | ||||||
|         if (IS_MODIFIER_KEYCODE(k)) { |         if (IS_MODIFIER_KEYCODE(k)) { | ||||||
|             m_report.mods |= MOD_BIT(k); |             m_report.mods |= MOD_BIT(k); | ||||||
|         } else { |         } else { | ||||||
|             add_key_to_report(&m_report, k); |             add_key_byte(&m_report, k); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -31,7 +31,7 @@ uint8_t hex_digit_to_keycode(uint8_t digit) { | |||||||
| } | } | ||||||
| } // namespace
 | } // namespace
 | ||||||
| 
 | 
 | ||||||
| TestDriver::TestDriver() : m_driver{&TestDriver::keyboard_leds, &TestDriver::send_keyboard, &TestDriver::send_mouse, &TestDriver::send_extra} { | TestDriver::TestDriver() : m_driver{&TestDriver::keyboard_leds, &TestDriver::send_keyboard, &TestDriver::send_nkro, &TestDriver::send_mouse, &TestDriver::send_extra} { | ||||||
|     host_set_driver(&m_driver); |     host_set_driver(&m_driver); | ||||||
|     m_this = this; |     m_this = this; | ||||||
| } | } | ||||||
| @ -49,6 +49,10 @@ void TestDriver::send_keyboard(report_keyboard_t* report) { | |||||||
|     m_this->send_keyboard_mock(*report); |     m_this->send_keyboard_mock(*report); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void TestDriver::send_nkro(report_nkro_t* report) { | ||||||
|  |     m_this->send_nkro_mock(*report); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void TestDriver::send_mouse(report_mouse_t* report) { | void TestDriver::send_mouse(report_mouse_t* report) { | ||||||
|     m_this->send_mouse_mock(*report); |     m_this->send_mouse_mock(*report); | ||||||
| } | } | ||||||
|  | |||||||
| @ -32,12 +32,14 @@ class TestDriver { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     MOCK_METHOD1(send_keyboard_mock, void(report_keyboard_t&)); |     MOCK_METHOD1(send_keyboard_mock, void(report_keyboard_t&)); | ||||||
|  |     MOCK_METHOD1(send_nkro_mock, void(report_nkro_t&)); | ||||||
|     MOCK_METHOD1(send_mouse_mock, void(report_mouse_t&)); |     MOCK_METHOD1(send_mouse_mock, void(report_mouse_t&)); | ||||||
|     MOCK_METHOD1(send_extra_mock, void(report_extra_t&)); |     MOCK_METHOD1(send_extra_mock, void(report_extra_t&)); | ||||||
| 
 | 
 | ||||||
|    private: |    private: | ||||||
|     static uint8_t     keyboard_leds(void); |     static uint8_t     keyboard_leds(void); | ||||||
|     static void        send_keyboard(report_keyboard_t* report); |     static void        send_keyboard(report_keyboard_t* report); | ||||||
|  |     static void        send_nkro(report_nkro_t* report); | ||||||
|     static void        send_mouse(report_mouse_t* report); |     static void        send_mouse(report_mouse_t* report); | ||||||
|     static void        send_extra(report_extra_t* report); |     static void        send_extra(report_extra_t* report); | ||||||
|     host_driver_t      m_driver; |     host_driver_t      m_driver; | ||||||
|  | |||||||
| @ -46,9 +46,7 @@ else | |||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| ifeq ($(strip $(NKRO_ENABLE)), yes) | ifeq ($(strip $(NKRO_ENABLE)), yes) | ||||||
|     ifeq ($(PROTOCOL), VUSB) |     ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | ||||||
|         $(info NKRO is not currently supported on V-USB, and has been disabled.) |  | ||||||
|     else ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) |  | ||||||
|         $(info NKRO is not currently supported with Bluetooth, and has been disabled.) |         $(info NKRO is not currently supported with Bluetooth, and has been disabled.) | ||||||
|     else |     else | ||||||
|         OPT_DEFS += -DNKRO_ENABLE |         OPT_DEFS += -DNKRO_ENABLE | ||||||
|  | |||||||
| @ -36,6 +36,7 @@ uint8_t g_usb_state = USB_FSMSTATUS_FSMSTATE_OFF_Val; // Saved USB state from ha | |||||||
| void    main_subtasks(void); | void    main_subtasks(void); | ||||||
| uint8_t keyboard_leds(void); | uint8_t keyboard_leds(void); | ||||||
| void    send_keyboard(report_keyboard_t *report); | void    send_keyboard(report_keyboard_t *report); | ||||||
|  | void    send_nkro(report_nkro_t *report); | ||||||
| void    send_mouse(report_mouse_t *report); | void    send_mouse(report_mouse_t *report); | ||||||
| void    send_extra(report_extra_t *report); | void    send_extra(report_extra_t *report); | ||||||
| 
 | 
 | ||||||
| @ -43,7 +44,7 @@ void    send_extra(report_extra_t *report); | |||||||
| void deferred_exec_task(void); | void deferred_exec_task(void); | ||||||
| #endif // DEFERRED_EXEC_ENABLE
 | #endif // DEFERRED_EXEC_ENABLE
 | ||||||
| 
 | 
 | ||||||
| host_driver_t arm_atsam_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra}; | host_driver_t arm_atsam_driver = {keyboard_leds, send_keyboard, send_nkro, send_mouse, send_extra}; | ||||||
| 
 | 
 | ||||||
| uint8_t led_states; | uint8_t led_states; | ||||||
| 
 | 
 | ||||||
| @ -59,41 +60,41 @@ uint8_t keyboard_leds(void) { | |||||||
| void send_keyboard(report_keyboard_t *report) { | void send_keyboard(report_keyboard_t *report) { | ||||||
|     uint32_t irqflags; |     uint32_t irqflags; | ||||||
| 
 | 
 | ||||||
|  |     while (udi_hid_kbd_b_report_trans_ongoing) { | ||||||
|  |         main_subtasks(); | ||||||
|  |     } // Run other tasks while waiting for USB to be free
 | ||||||
|  | 
 | ||||||
|  |     irqflags = __get_PRIMASK(); | ||||||
|  |     __disable_irq(); | ||||||
|  |     __DMB(); | ||||||
|  | 
 | ||||||
|  |     memcpy(udi_hid_kbd_report, report, UDI_HID_KBD_REPORT_SIZE); | ||||||
|  |     udi_hid_kbd_b_report_valid = 1; | ||||||
|  |     udi_hid_kbd_send_report(); | ||||||
|  | 
 | ||||||
|  |     __DMB(); | ||||||
|  |     __set_PRIMASK(irqflags); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void send_nkro(report_nkro_t *report) { | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (!keymap_config.nkro) { |     uint32_t irqflags; | ||||||
| #endif // NKRO_ENABLE
 |  | ||||||
|         while (udi_hid_kbd_b_report_trans_ongoing) { |  | ||||||
|             main_subtasks(); |  | ||||||
|         } // Run other tasks while waiting for USB to be free
 |  | ||||||
| 
 | 
 | ||||||
|         irqflags = __get_PRIMASK(); |     while (udi_hid_nkro_b_report_trans_ongoing) { | ||||||
|         __disable_irq(); |         main_subtasks(); | ||||||
|         __DMB(); |     } // Run other tasks while waiting for USB to be free
 | ||||||
| 
 | 
 | ||||||
|         memcpy(udi_hid_kbd_report, report->raw, UDI_HID_KBD_REPORT_SIZE); |     irqflags = __get_PRIMASK(); | ||||||
|         udi_hid_kbd_b_report_valid = 1; |     __disable_irq(); | ||||||
|         udi_hid_kbd_send_report(); |     __DMB(); | ||||||
| 
 | 
 | ||||||
|         __DMB(); |     memcpy(udi_hid_nkro_report, report, UDI_HID_NKRO_REPORT_SIZE); | ||||||
|         __set_PRIMASK(irqflags); |     udi_hid_nkro_b_report_valid = 1; | ||||||
| #ifdef NKRO_ENABLE |     udi_hid_nkro_send_report(); | ||||||
|     } else { |  | ||||||
|         while (udi_hid_nkro_b_report_trans_ongoing) { |  | ||||||
|             main_subtasks(); |  | ||||||
|         } // Run other tasks while waiting for USB to be free
 |  | ||||||
| 
 | 
 | ||||||
|         irqflags = __get_PRIMASK(); |     __DMB(); | ||||||
|         __disable_irq(); |     __set_PRIMASK(irqflags); | ||||||
|         __DMB(); | #endif | ||||||
| 
 |  | ||||||
|         memcpy(udi_hid_nkro_report, report->raw, UDI_HID_NKRO_REPORT_SIZE); |  | ||||||
|         udi_hid_nkro_b_report_valid = 1; |  | ||||||
|         udi_hid_nkro_send_report(); |  | ||||||
| 
 |  | ||||||
|         __DMB(); |  | ||||||
|         __set_PRIMASK(irqflags); |  | ||||||
|     } |  | ||||||
| #endif // NKRO_ENABLE
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void send_mouse(report_mouse_t *report) { | void send_mouse(report_mouse_t *report) { | ||||||
|  | |||||||
| @ -59,11 +59,12 @@ | |||||||
| /* declarations */ | /* declarations */ | ||||||
| uint8_t keyboard_leds(void); | uint8_t keyboard_leds(void); | ||||||
| void    send_keyboard(report_keyboard_t *report); | void    send_keyboard(report_keyboard_t *report); | ||||||
|  | void    send_nkro(report_nkro_t *report); | ||||||
| void    send_mouse(report_mouse_t *report); | void    send_mouse(report_mouse_t *report); | ||||||
| void    send_extra(report_extra_t *report); | void    send_extra(report_extra_t *report); | ||||||
| 
 | 
 | ||||||
| /* host struct */ | /* host struct */ | ||||||
| host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra}; | host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_nkro, send_mouse, send_extra}; | ||||||
| 
 | 
 | ||||||
| #ifdef VIRTSER_ENABLE | #ifdef VIRTSER_ENABLE | ||||||
| void virtser_task(void); | void virtser_task(void); | ||||||
|  | |||||||
| @ -71,7 +71,7 @@ static virtual_timer_t keyboard_idle_timer; | |||||||
| 
 | 
 | ||||||
| static void keyboard_idle_timer_cb(struct ch_virtual_timer *, void *arg); | static void keyboard_idle_timer_cb(struct ch_virtual_timer *, void *arg); | ||||||
| 
 | 
 | ||||||
| report_keyboard_t keyboard_report_sent = {{0}}; | report_keyboard_t keyboard_report_sent = {0}; | ||||||
| report_mouse_t    mouse_report_sent    = {0}; | report_mouse_t    mouse_report_sent    = {0}; | ||||||
| 
 | 
 | ||||||
| union { | union { | ||||||
| @ -883,26 +883,22 @@ void send_report(uint8_t endpoint, void *report, size_t size) { | |||||||
| /* prepare and start sending a report IN
 | /* prepare and start sending a report IN
 | ||||||
|  * not callable from ISR or locked state */ |  * not callable from ISR or locked state */ | ||||||
| void send_keyboard(report_keyboard_t *report) { | void send_keyboard(report_keyboard_t *report) { | ||||||
|     uint8_t ep   = KEYBOARD_IN_EPNUM; |  | ||||||
|     size_t  size = KEYBOARD_REPORT_SIZE; |  | ||||||
| 
 |  | ||||||
|     /* If we're in Boot Protocol, don't send any report ID or other funky fields */ |     /* If we're in Boot Protocol, don't send any report ID or other funky fields */ | ||||||
|     if (!keyboard_protocol) { |     if (!keyboard_protocol) { | ||||||
|         send_report(ep, &report->mods, 8); |         send_report(KEYBOARD_IN_EPNUM, &report->mods, 8); | ||||||
|     } else { |     } else { | ||||||
| #ifdef NKRO_ENABLE |         send_report(KEYBOARD_IN_EPNUM, report, KEYBOARD_REPORT_SIZE); | ||||||
|         if (keymap_config.nkro) { |  | ||||||
|             ep   = SHARED_IN_EPNUM; |  | ||||||
|             size = sizeof(struct nkro_report); |  | ||||||
|         } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|         send_report(ep, report, size); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     keyboard_report_sent = *report; |     keyboard_report_sent = *report; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void send_nkro(report_nkro_t *report) { | ||||||
|  | #ifdef NKRO_ENABLE | ||||||
|  |     send_report(SHARED_IN_EPNUM, report, sizeof(report_nkro_t)); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* ---------------------------------------------------------
 | /* ---------------------------------------------------------
 | ||||||
|  *                     Mouse functions |  *                     Mouse functions | ||||||
|  * --------------------------------------------------------- |  * --------------------------------------------------------- | ||||||
|  | |||||||
| @ -81,26 +81,29 @@ void host_keyboard_send(report_keyboard_t *report) { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     if (!driver) return; |     if (!driver) return; | ||||||
| #if defined(NKRO_ENABLE) && defined(NKRO_SHARED_EP) |  | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |  | ||||||
|         /* The callers of this function assume that report->mods is where mods go in.
 |  | ||||||
|          * But report->nkro.mods can be at a different offset if core keyboard does not have a report ID. |  | ||||||
|          */ |  | ||||||
|         report->nkro.mods      = report->mods; |  | ||||||
|         report->nkro.report_id = REPORT_ID_NKRO; |  | ||||||
|     } else |  | ||||||
| #endif |  | ||||||
|     { |  | ||||||
| #ifdef KEYBOARD_SHARED_EP | #ifdef KEYBOARD_SHARED_EP | ||||||
|         report->report_id = REPORT_ID_KEYBOARD; |     report->report_id = REPORT_ID_KEYBOARD; | ||||||
| #endif | #endif | ||||||
|     } |  | ||||||
|     (*driver->send_keyboard)(report); |     (*driver->send_keyboard)(report); | ||||||
| 
 | 
 | ||||||
|     if (debug_keyboard) { |     if (debug_keyboard) { | ||||||
|         dprint("keyboard_report: "); |         dprintf("keyboard_report: %02X | ", report->mods); | ||||||
|         for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { |         for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { | ||||||
|             dprintf("%02X ", report->raw[i]); |             dprintf("%02X ", report->keys[i]); | ||||||
|  |         } | ||||||
|  |         dprint("\n"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void host_nkro_send(report_nkro_t *report) { | ||||||
|  |     if (!driver) return; | ||||||
|  |     report->report_id = REPORT_ID_NKRO; | ||||||
|  |     (*driver->send_nkro)(report); | ||||||
|  | 
 | ||||||
|  |     if (debug_keyboard) { | ||||||
|  |         dprintf("nkro_report: %02X | ", report->mods); | ||||||
|  |         for (uint8_t i = 0; i < NKRO_REPORT_BITS; i++) { | ||||||
|  |             dprintf("%02X ", report->bits[i]); | ||||||
|         } |         } | ||||||
|         dprint("\n"); |         dprint("\n"); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -38,6 +38,7 @@ host_driver_t *host_get_driver(void); | |||||||
| uint8_t host_keyboard_leds(void); | uint8_t host_keyboard_leds(void); | ||||||
| led_t   host_keyboard_led_state(void); | led_t   host_keyboard_led_state(void); | ||||||
| void    host_keyboard_send(report_keyboard_t *report); | void    host_keyboard_send(report_keyboard_t *report); | ||||||
|  | void    host_nkro_send(report_nkro_t *report); | ||||||
| void    host_mouse_send(report_mouse_t *report); | void    host_mouse_send(report_mouse_t *report); | ||||||
| void    host_system_send(uint16_t usage); | void    host_system_send(uint16_t usage); | ||||||
| void    host_consumer_send(uint16_t usage); | void    host_consumer_send(uint16_t usage); | ||||||
|  | |||||||
| @ -26,6 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t (*keyboard_leds)(void); |     uint8_t (*keyboard_leds)(void); | ||||||
|     void (*send_keyboard)(report_keyboard_t *); |     void (*send_keyboard)(report_keyboard_t *); | ||||||
|  |     void (*send_nkro)(report_nkro_t *); | ||||||
|     void (*send_mouse)(report_mouse_t *); |     void (*send_mouse)(report_mouse_t *); | ||||||
|     void (*send_extra)(report_extra_t *); |     void (*send_extra)(report_extra_t *); | ||||||
| } host_driver_t; | } host_driver_t; | ||||||
|  | |||||||
| @ -55,12 +55,6 @@ | |||||||
| #include "usb_device_state.h" | #include "usb_device_state.h" | ||||||
| #include <util/atomic.h> | #include <util/atomic.h> | ||||||
| 
 | 
 | ||||||
| #ifdef NKRO_ENABLE |  | ||||||
| #    include "keycode_config.h" |  | ||||||
| 
 |  | ||||||
| extern keymap_config_t keymap_config; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #ifdef VIRTSER_ENABLE | #ifdef VIRTSER_ENABLE | ||||||
| #    include "virtser.h" | #    include "virtser.h" | ||||||
| #endif | #endif | ||||||
| @ -83,9 +77,10 @@ static report_keyboard_t keyboard_report_sent; | |||||||
| /* Host driver */ | /* Host driver */ | ||||||
| static uint8_t keyboard_leds(void); | static uint8_t keyboard_leds(void); | ||||||
| static void    send_keyboard(report_keyboard_t *report); | static void    send_keyboard(report_keyboard_t *report); | ||||||
|  | static void    send_nkro(report_nkro_t *report); | ||||||
| static void    send_mouse(report_mouse_t *report); | static void    send_mouse(report_mouse_t *report); | ||||||
| static void    send_extra(report_extra_t *report); | static void    send_extra(report_extra_t *report); | ||||||
| host_driver_t  lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_extra}; | host_driver_t  lufa_driver = {keyboard_leds, send_keyboard, send_nkro, send_mouse, send_extra}; | ||||||
| 
 | 
 | ||||||
| void send_report(uint8_t endpoint, void *report, size_t size) { | void send_report(uint8_t endpoint, void *report, size_t size) { | ||||||
|     uint8_t timeout = 255; |     uint8_t timeout = 255; | ||||||
| @ -559,27 +554,26 @@ static uint8_t keyboard_leds(void) { | |||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| static void send_keyboard(report_keyboard_t *report) { | static void send_keyboard(report_keyboard_t *report) { | ||||||
|     /* Select the Keyboard Report Endpoint */ |  | ||||||
|     uint8_t ep   = KEYBOARD_IN_EPNUM; |  | ||||||
|     uint8_t size = KEYBOARD_REPORT_SIZE; |  | ||||||
| 
 |  | ||||||
|     /* If we're in Boot Protocol, don't send any report ID or other funky fields */ |     /* If we're in Boot Protocol, don't send any report ID or other funky fields */ | ||||||
|     if (!keyboard_protocol) { |     if (!keyboard_protocol) { | ||||||
|         send_report(ep, &report->mods, 8); |         send_report(KEYBOARD_IN_EPNUM, &report->mods, 8); | ||||||
|     } else { |     } else { | ||||||
| #ifdef NKRO_ENABLE |         send_report(KEYBOARD_IN_EPNUM, report, KEYBOARD_REPORT_SIZE); | ||||||
|         if (keymap_config.nkro) { |  | ||||||
|             ep   = SHARED_IN_EPNUM; |  | ||||||
|             size = sizeof(struct nkro_report); |  | ||||||
|         } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|         send_report(ep, report, size); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     keyboard_report_sent = *report; |     keyboard_report_sent = *report; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** \brief Send NKRO
 | ||||||
|  |  * | ||||||
|  |  * FIXME: Needs doc | ||||||
|  |  */ | ||||||
|  | static void send_nkro(report_nkro_t *report) { | ||||||
|  | #ifdef NKRO_ENABLE | ||||||
|  |     send_report(SHARED_IN_EPNUM, report, sizeof(report_nkro_t)); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** \brief Send Mouse
 | /** \brief Send Mouse
 | ||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  | |||||||
| @ -15,6 +15,7 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "report.h" | #include "report.h" | ||||||
|  | #include "action_util.h" | ||||||
| #include "host.h" | #include "host.h" | ||||||
| #include "keycode_config.h" | #include "keycode_config.h" | ||||||
| #include "debug.h" | #include "debug.h" | ||||||
| @ -35,14 +36,14 @@ static int8_t cb_count = 0; | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| uint8_t has_anykey(report_keyboard_t* keyboard_report) { | uint8_t has_anykey(void) { | ||||||
|     uint8_t  cnt = 0; |     uint8_t  cnt = 0; | ||||||
|     uint8_t* p   = keyboard_report->keys; |     uint8_t* p   = keyboard_report->keys; | ||||||
|     uint8_t  lp  = sizeof(keyboard_report->keys); |     uint8_t  lp  = sizeof(keyboard_report->keys); | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|         p  = keyboard_report->nkro.bits; |         p  = nkro_report->bits; | ||||||
|         lp = sizeof(keyboard_report->nkro.bits); |         lp = sizeof(nkro_report->bits); | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|     while (lp--) { |     while (lp--) { | ||||||
| @ -55,13 +56,13 @@ uint8_t has_anykey(report_keyboard_t* keyboard_report) { | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| uint8_t get_first_key(report_keyboard_t* keyboard_report) { | uint8_t get_first_key(void) { | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|         uint8_t i = 0; |         uint8_t i = 0; | ||||||
|         for (; i < NKRO_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++) |         for (; i < NKRO_REPORT_BITS && !nkro_report->bits[i]; i++) | ||||||
|             ; |             ; | ||||||
|         return i << 3 | biton(keyboard_report->nkro.bits[i]); |         return i << 3 | biton(nkro_report->bits[i]); | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| #ifdef RING_BUFFERED_6KRO_REPORT_ENABLE | #ifdef RING_BUFFERED_6KRO_REPORT_ENABLE | ||||||
| @ -83,14 +84,14 @@ uint8_t get_first_key(report_keyboard_t* keyboard_report) { | |||||||
|  * Returns true if the keyboard_report reports that the key is pressed, otherwise false |  * Returns true if the keyboard_report reports that the key is pressed, otherwise false | ||||||
|  * Note: The function doesn't support modifers currently, and it returns false for KC_NO |  * Note: The function doesn't support modifers currently, and it returns false for KC_NO | ||||||
|  */ |  */ | ||||||
| bool is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key) { | bool is_key_pressed(uint8_t key) { | ||||||
|     if (key == KC_NO) { |     if (key == KC_NO) { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|         if ((key >> 3) < NKRO_REPORT_BITS) { |         if ((key >> 3) < NKRO_REPORT_BITS) { | ||||||
|             return keyboard_report->nkro.bits[key >> 3] & 1 << (key & 7); |             return nkro_report->bits[key >> 3] & 1 << (key & 7); | ||||||
|         } else { |         } else { | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| @ -215,9 +216,9 @@ void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code) { | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code) { | void add_key_bit(report_nkro_t* nkro_report, uint8_t code) { | ||||||
|     if ((code >> 3) < NKRO_REPORT_BITS) { |     if ((code >> 3) < NKRO_REPORT_BITS) { | ||||||
|         keyboard_report->nkro.bits[code >> 3] |= 1 << (code & 7); |         nkro_report->bits[code >> 3] |= 1 << (code & 7); | ||||||
|     } else { |     } else { | ||||||
|         dprintf("add_key_bit: can't add: %02X\n", code); |         dprintf("add_key_bit: can't add: %02X\n", code); | ||||||
|     } |     } | ||||||
| @ -227,9 +228,9 @@ void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code) { | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code) { | void del_key_bit(report_nkro_t* nkro_report, uint8_t code) { | ||||||
|     if ((code >> 3) < NKRO_REPORT_BITS) { |     if ((code >> 3) < NKRO_REPORT_BITS) { | ||||||
|         keyboard_report->nkro.bits[code >> 3] &= ~(1 << (code & 7)); |         nkro_report->bits[code >> 3] &= ~(1 << (code & 7)); | ||||||
|     } else { |     } else { | ||||||
|         dprintf("del_key_bit: can't del: %02X\n", code); |         dprintf("del_key_bit: can't del: %02X\n", code); | ||||||
|     } |     } | ||||||
| @ -240,10 +241,10 @@ void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code) { | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| void add_key_to_report(report_keyboard_t* keyboard_report, uint8_t key) { | void add_key_to_report(uint8_t key) { | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|         add_key_bit(keyboard_report, key); |         add_key_bit(nkro_report, key); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| @ -254,10 +255,10 @@ void add_key_to_report(report_keyboard_t* keyboard_report, uint8_t key) { | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key) { | void del_key_from_report(uint8_t key) { | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|         del_key_bit(keyboard_report, key); |         del_key_bit(nkro_report, key); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| @ -268,11 +269,11 @@ void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key) { | |||||||
|  * |  * | ||||||
|  * FIXME: Needs doc |  * FIXME: Needs doc | ||||||
|  */ |  */ | ||||||
| void clear_keys_from_report(report_keyboard_t* keyboard_report) { | void clear_keys_from_report(void) { | ||||||
|     // not clear mods
 |     // not clear mods
 | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
|     if (keyboard_protocol && keymap_config.nkro) { |     if (keyboard_protocol && keymap_config.nkro) { | ||||||
|         memset(keyboard_report->nkro.bits, 0, sizeof(keyboard_report->nkro.bits)); |         memset(nkro_report->bits, 0, sizeof(nkro_report->bits)); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -125,21 +125,7 @@ enum desktop_usages { | |||||||
| 
 | 
 | ||||||
| // clang-format on
 | // clang-format on
 | ||||||
| 
 | 
 | ||||||
| #define NKRO_SHARED_EP | #define NKRO_REPORT_BITS 30 | ||||||
| /* key report size(NKRO or boot mode) */ |  | ||||||
| #if defined(NKRO_ENABLE) |  | ||||||
| #    if defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) |  | ||||||
| #        include "protocol/usb_descriptor.h" |  | ||||||
| #        define NKRO_REPORT_BITS (SHARED_EPSIZE - 2) |  | ||||||
| #    elif defined(PROTOCOL_ARM_ATSAM) |  | ||||||
| #        include "protocol/arm_atsam/usb/udi_device_epsize.h" |  | ||||||
| #        define NKRO_REPORT_BITS (NKRO_EPSIZE - 1) |  | ||||||
| #        undef NKRO_SHARED_EP |  | ||||||
| #        undef MOUSE_SHARED_EP |  | ||||||
| #    else |  | ||||||
| #        error "NKRO not supported with this protocol" |  | ||||||
| #    endif |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| #ifdef KEYBOARD_SHARED_EP | #ifdef KEYBOARD_SHARED_EP | ||||||
| #    define KEYBOARD_REPORT_SIZE 9 | #    define KEYBOARD_REPORT_SIZE 9 | ||||||
| @ -173,27 +159,21 @@ extern "C" { | |||||||
|  * desc |Lcontrol|Lshift  |Lalt    |Lgui    |Rcontrol|Rshift  |Ralt    |Rgui |  * desc |Lcontrol|Lshift  |Lalt    |Lgui    |Rcontrol|Rshift  |Ralt    |Rgui | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| typedef union { | typedef struct { | ||||||
|     uint8_t raw[KEYBOARD_REPORT_SIZE]; |  | ||||||
|     struct { |  | ||||||
| #ifdef KEYBOARD_SHARED_EP | #ifdef KEYBOARD_SHARED_EP | ||||||
|         uint8_t report_id; |     uint8_t report_id; | ||||||
| #endif |  | ||||||
|         uint8_t mods; |  | ||||||
|         uint8_t reserved; |  | ||||||
|         uint8_t keys[KEYBOARD_REPORT_KEYS]; |  | ||||||
|     }; |  | ||||||
| #ifdef NKRO_ENABLE |  | ||||||
|     struct nkro_report { |  | ||||||
| #    ifdef NKRO_SHARED_EP |  | ||||||
|         uint8_t report_id; |  | ||||||
| #    endif |  | ||||||
|         uint8_t mods; |  | ||||||
|         uint8_t bits[NKRO_REPORT_BITS]; |  | ||||||
|     } nkro; |  | ||||||
| #endif | #endif | ||||||
|  |     uint8_t mods; | ||||||
|  |     uint8_t reserved; | ||||||
|  |     uint8_t keys[KEYBOARD_REPORT_KEYS]; | ||||||
| } PACKED report_keyboard_t; | } PACKED report_keyboard_t; | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint8_t report_id; | ||||||
|  |     uint8_t mods; | ||||||
|  |     uint8_t bits[NKRO_REPORT_BITS]; | ||||||
|  | } PACKED report_nkro_t; | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     uint8_t  report_id; |     uint8_t  report_id; | ||||||
|     uint16_t usage; |     uint16_t usage; | ||||||
| @ -330,20 +310,20 @@ static inline uint16_t KEYCODE2CONSUMER(uint8_t key) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint8_t has_anykey(report_keyboard_t* keyboard_report); | uint8_t has_anykey(void); | ||||||
| uint8_t get_first_key(report_keyboard_t* keyboard_report); | uint8_t get_first_key(void); | ||||||
| bool    is_key_pressed(report_keyboard_t* keyboard_report, uint8_t key); | bool    is_key_pressed(uint8_t key); | ||||||
| 
 | 
 | ||||||
| void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code); | void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code); | ||||||
| void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code); | void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code); | ||||||
| #ifdef NKRO_ENABLE | #ifdef NKRO_ENABLE | ||||||
| void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code); | void add_key_bit(report_nkro_t* nkro_report, uint8_t code); | ||||||
| void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code); | void del_key_bit(report_nkro_t* nkro_report, uint8_t code); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| void add_key_to_report(report_keyboard_t* keyboard_report, uint8_t key); | void add_key_to_report(uint8_t key); | ||||||
| void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key); | void del_key_from_report(uint8_t key); | ||||||
| void clear_keys_from_report(report_keyboard_t* keyboard_report); | void clear_keys_from_report(void); | ||||||
| 
 | 
 | ||||||
| #ifdef MOUSE_ENABLE | #ifdef MOUSE_ENABLE | ||||||
| bool has_mouse_report_changed(report_mouse_t* new_report, report_mouse_t* old_report); | bool has_mouse_report_changed(report_mouse_t* new_report, report_mouse_t* old_report); | ||||||
|  | |||||||
| @ -91,6 +91,7 @@ enum usb_interfaces { | |||||||
| 
 | 
 | ||||||
| static uint8_t keyboard_led_state = 0; | static uint8_t keyboard_led_state = 0; | ||||||
| static uint8_t vusb_idle_rate     = 0; | static uint8_t vusb_idle_rate     = 0; | ||||||
|  | uint8_t        keyboard_protocol  = 1; | ||||||
| 
 | 
 | ||||||
| /* Keyboard report send buffer */ | /* Keyboard report send buffer */ | ||||||
| #define KBUF_SIZE 16 | #define KBUF_SIZE 16 | ||||||
| @ -231,10 +232,11 @@ void console_task(void) { | |||||||
|  *------------------------------------------------------------------*/ |  *------------------------------------------------------------------*/ | ||||||
| static uint8_t keyboard_leds(void); | static uint8_t keyboard_leds(void); | ||||||
| static void    send_keyboard(report_keyboard_t *report); | static void    send_keyboard(report_keyboard_t *report); | ||||||
|  | static void    send_nkro(report_nkro_t *report); | ||||||
| static void    send_mouse(report_mouse_t *report); | static void    send_mouse(report_mouse_t *report); | ||||||
| static void    send_extra(report_extra_t *report); | static void    send_extra(report_extra_t *report); | ||||||
| 
 | 
 | ||||||
| static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_extra}; | static host_driver_t driver = {keyboard_leds, send_keyboard, send_nkro, send_mouse, send_extra}; | ||||||
| 
 | 
 | ||||||
| host_driver_t *vusb_driver(void) { | host_driver_t *vusb_driver(void) { | ||||||
|     return &driver; |     return &driver; | ||||||
| @ -259,6 +261,10 @@ static void send_keyboard(report_keyboard_t *report) { | |||||||
|     keyboard_report_sent = *report; |     keyboard_report_sent = *report; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void send_nkro(report_nkro_t *report) { | ||||||
|  |     // TODO: Implement NKRO
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #ifndef KEYBOARD_SHARED_EP | #ifndef KEYBOARD_SHARED_EP | ||||||
| #    define usbInterruptIsReadyShared usbInterruptIsReady3 | #    define usbInterruptIsReadyShared usbInterruptIsReady3 | ||||||
| #    define usbSetInterruptShared usbSetInterrupt3 | #    define usbSetInterruptShared usbSetInterrupt3 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ryan
						Ryan