Skip to content

Commit

Permalink
fix(hid): Eliminate data race in USB pathway causing dropped keys
Browse files Browse the repository at this point in the history
  • Loading branch information
khoek committed Apr 10, 2024
1 parent 5bfa057 commit 3ba7028
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion app/src/usb_hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
* SPDX-License-Identifier: MIT
*/

#include <zephyr/sys/util.h>

#include <zephyr/device.h>
#include <zephyr/init.h>

Expand All @@ -18,11 +20,28 @@
#endif // IS_ENABLED(CONFIG_ZMK_HID_INDICATORS)
#include <zmk/event_manager.h>

#if IS_ENABLED(CONFIG_ZMK_USB_BOOT)
#define HID_BOOT_REPORT_SIZE sizeof(zmk_hid_boot_report_t)
#else
#define HID_BOOT_REPORT_SIZE 0
#endif

#if IS_ENABLED(CONFIG_ZMK_MOUSE)
#define HID_MOUSE_REPORT_SIZE sizeof(struct zmk_hid_mouse_report)
#else
#define HID_MOUSE_REPORT_SIZE 0
#endif

#define HID_EP_WRITE_BUF_SIZE \
MAX(MAX(HID_BOOT_REPORT_SIZE, sizeof(struct zmk_hid_keyboard_report)), \
MAX(sizeof(struct zmk_hid_consumer_report), HID_MOUSE_REPORT_SIZE))

LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);

static const struct device *hid_dev;

static K_SEM_DEFINE(hid_sem, 1, 1);
static uint8_t hid_ep_write_buf[HID_EP_WRITE_BUF_SIZE];

static void in_ready_cb(const struct device *dev) { k_sem_give(&hid_sem); }

Expand Down Expand Up @@ -137,7 +156,8 @@ static int zmk_usb_hid_send_report(const uint8_t *report, size_t len) {
return -ENODEV;
default:
k_sem_take(&hid_sem, K_MSEC(30));
int err = hid_int_ep_write(hid_dev, report, len, NULL);
memcpy(hid_ep_write_buf, report, len);
int err = hid_int_ep_write(hid_dev, hid_ep_write_buf, len, NULL);

if (err) {
k_sem_give(&hid_sem);
Expand Down

0 comments on commit 3ba7028

Please sign in to comment.