qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

usb_report_handling.h (4209B)


      1 // Copyright 2023 Stefan Kerkmann (@KarlK90)
      2 // SPDX-License-Identifier: GPL-3.0-or-later
      3 
      4 #pragma once
      5 
      6 #include <ch.h>
      7 #include <hal.h>
      8 #include <stdint.h>
      9 
     10 #include "timer.h"
     11 
     12 typedef struct {
     13     time_msecs_t idle_rate;
     14     systime_t    last_report;
     15     uint8_t      data[64];
     16     size_t       length;
     17 } usb_fs_report_t;
     18 
     19 typedef struct {
     20     usb_fs_report_t **reports;
     21     const void (*get_report)(usb_fs_report_t **, uint8_t, usb_fs_report_t *);
     22     const void (*set_report)(usb_fs_report_t **, const uint8_t *, size_t);
     23     const void (*reset_report)(usb_fs_report_t **);
     24     const void (*set_idle)(usb_fs_report_t **, uint8_t, uint8_t);
     25     const uint8_t (*get_idle)(usb_fs_report_t **, uint8_t);
     26     const bool (*idle_timer_elasped)(usb_fs_report_t **, uint8_t);
     27 } usb_report_storage_t;
     28 
     29 #define QMK_USB_REPORT_STROAGE_ENTRY(_report_id, _report_size) [_report_id] = &((usb_fs_report_t){.data = {[0] = _report_id}, .length = _report_size})
     30 
     31 #define QMK_USB_REPORT_STORAGE(_get_report, _set_report, _reset_report, _get_idle, _set_idle, _idle_timer_elasped, _report_count, _reports...) \
     32     &((usb_report_storage_t){                                                                                                                  \
     33         .reports            = (_Alignas(4) usb_fs_report_t *[_report_count]){_reports},                                                        \
     34         .get_report         = _get_report,                                                                                                     \
     35         .set_report         = _set_report,                                                                                                     \
     36         .reset_report       = _reset_report,                                                                                                   \
     37         .get_idle           = _get_idle,                                                                                                       \
     38         .set_idle           = _set_idle,                                                                                                       \
     39         .idle_timer_elasped = _idle_timer_elasped,                                                                                             \
     40     })
     41 
     42 #define QMK_USB_REPORT_STORAGE_DEFAULT(_report_length)                        \
     43     QMK_USB_REPORT_STORAGE(&usb_get_report,         /* _get_report */         \
     44                            &usb_set_report,         /* _set_report */         \
     45                            &usb_reset_report,       /* _reset_report */       \
     46                            &usb_get_idle_rate,      /* _get_idle */           \
     47                            &usb_set_idle_rate,      /* _set_idle */           \
     48                            &usb_idle_timer_elapsed, /* _idle_timer_elasped */ \
     49                            1,                       /* _report_count */       \
     50                            QMK_USB_REPORT_STROAGE_ENTRY(0, _report_length))
     51 
     52 // USB HID SET_REPORT and GET_REPORT  handling functions
     53 void usb_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length);
     54 void usb_shared_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length);
     55 
     56 void usb_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report);
     57 void usb_shared_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report);
     58 
     59 void usb_reset_report(usb_fs_report_t **reports);
     60 void usb_shared_reset_report(usb_fs_report_t **reports);
     61 
     62 bool usb_get_report_cb(USBDriver *driver);
     63 
     64 // USB HID SET_IDLE and GET_IDLE handling functions
     65 void usb_idle_task(void);
     66 
     67 void usb_set_idle_rate(usb_fs_report_t **timers, uint8_t report_id, uint8_t idle_rate);
     68 void usb_shared_set_idle_rate(usb_fs_report_t **timers, uint8_t report_id, uint8_t idle_rate);
     69 
     70 uint8_t usb_get_idle_rate(usb_fs_report_t **timers, uint8_t report_id);
     71 uint8_t usb_shared_get_idle_rate(usb_fs_report_t **timers, uint8_t report_id);
     72 
     73 bool usb_idle_timer_elapsed(usb_fs_report_t **timers, uint8_t report_id);
     74 bool usb_shared_idle_timer_elapsed(usb_fs_report_t **timers, uint8_t report_id);
     75 
     76 bool usb_get_idle_cb(USBDriver *driver);
     77 bool usb_set_idle_cb(USBDriver *driver);