33
33
34
34
uint8_t const _ascii2keycode[128 ][2 ] = {HID_ASCII_TO_KEYCODE};
35
35
36
+ // TODO multiple instances
36
37
static Adafruit_USBD_HID *_hid_dev = NULL ;
37
38
39
+
40
+ #ifdef ARDUINO_ARCH_ESP32
41
+ static uint16_t hid_load_descriptor (uint8_t * dst, uint8_t * itf)
42
+ {
43
+ // uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB HID");
44
+ uint8_t str_index = 0 ;
45
+
46
+ TU_VERIFY (_hid_dev);
47
+
48
+ uint8_t ep_in = tinyusb_get_free_in_endpoint ();
49
+ TU_VERIFY (ep_in != 0 );
50
+
51
+ uint8_t ep_out = 0 ;
52
+ if (_hid_dev->isOutEndpointEnabled ())
53
+ {
54
+ ep_out = tinyusb_get_free_out_endpoint ();
55
+ TU_VERIFY (ep_out != 0 );
56
+ }
57
+
58
+ uint16_t const desc_len = _hid_dev->makeItfDesc (*itf, 0x80 | ep_in, ep_out, dst, TUD_HID_INOUT_DESC_LEN);
59
+
60
+ *itf+=1 ;
61
+ return desc_len;
62
+ }
63
+ #endif
64
+
38
65
// ------------- IMPLEMENTATION -------------//
39
- Adafruit_USBD_HID::Adafruit_USBD_HID (void ) {
40
- _interval_ms = 10 ;
41
- _protocol = HID_ITF_PROTOCOL_NONE;
42
66
43
- _out_endpoint = false ;
67
+ Adafruit_USBD_HID::Adafruit_USBD_HID (void ) :
68
+ Adafruit_USBD_HID(NULL , 0 , HID_ITF_PROTOCOL_NONE, 4 , false ) {
69
+
70
+ }
71
+
72
+ Adafruit_USBD_HID::Adafruit_USBD_HID (uint8_t const *desc_report, uint16_t len, uint8_t protocol, uint8_t interval_ms, bool has_out_endpoint)
73
+ {
74
+ _interval_ms = interval_ms;
75
+ _protocol = protocol;
76
+
77
+ _out_endpoint = has_out_endpoint;
44
78
_mouse_button = 0 ;
45
79
46
- _desc_report = NULL ;
47
- _desc_report_len = 0 ;
80
+ _desc_report = desc_report ;
81
+ _desc_report_len = len ;
48
82
49
83
_get_report_cb = NULL ;
50
84
_set_report_cb = NULL ;
85
+
86
+ #ifdef ARDUINO_ARCH_ESP32
87
+ // ESP32 requires setup configuration descriptor wihtin constructor
88
+ _hid_dev = this ;
89
+ uint16_t const desc_len = makeItfDesc (0 , EPIN, EPOUT, NULL , 0 );
90
+ tinyusb_enable_interface (USB_INTERFACE_HID, desc_len, hid_load_descriptor);
91
+ #endif
51
92
}
52
93
53
94
void Adafruit_USBD_HID::setPollInterval (uint8_t interval_ms) {
@@ -58,6 +99,10 @@ void Adafruit_USBD_HID::setBootProtocol(uint8_t protocol) {
58
99
_protocol = protocol;
59
100
}
60
101
102
+ bool Adafruit_USBD_HID::isOutEndpointEnabled (void ) {
103
+ return _out_endpoint;
104
+ }
105
+
61
106
void Adafruit_USBD_HID::enableOutEndpoint (bool enable) {
62
107
_out_endpoint = enable;
63
108
}
@@ -74,18 +119,17 @@ void Adafruit_USBD_HID::setReportCallback(get_report_callback_t get_report,
74
119
_set_report_cb = set_report;
75
120
}
76
121
77
- uint16_t Adafruit_USBD_HID::getInterfaceDescriptor (uint8_t itfnum, uint8_t *buf,
78
- uint16_t bufsize) {
122
+ uint16_t Adafruit_USBD_HID::makeItfDesc (uint8_t itfnum, uint8_t ep_in, uint8_t ep_out, uint8_t *buf, uint16_t bufsize)
123
+ {
79
124
if (!_desc_report_len) {
80
125
return 0 ;
81
126
}
82
127
83
- // usb core will automatically update endpoint number
84
128
uint8_t const desc_inout[] = {
85
- TUD_HID_INOUT_DESCRIPTOR (itfnum, 0 , _protocol, _desc_report_len, EPIN ,
86
- EPOUT , CFG_TUD_HID_EP_BUFSIZE, _interval_ms)};
129
+ TUD_HID_INOUT_DESCRIPTOR (itfnum, 0 , _protocol, _desc_report_len, ep_in ,
130
+ ep_out , CFG_TUD_HID_EP_BUFSIZE, _interval_ms)};
87
131
uint8_t const desc_in_only[] = {
88
- TUD_HID_DESCRIPTOR (itfnum, 0 , _protocol, _desc_report_len, EPIN ,
132
+ TUD_HID_DESCRIPTOR (itfnum, 0 , _protocol, _desc_report_len, ep_in ,
89
133
CFG_TUD_HID_EP_BUFSIZE, _interval_ms)};
90
134
91
135
uint8_t const *desc;
@@ -99,18 +143,31 @@ uint16_t Adafruit_USBD_HID::getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
99
143
len = sizeof (desc_in_only);
100
144
}
101
145
102
- if (bufsize < len) {
103
- return 0 ;
146
+ // null buffer is used to get the length of descriptor only
147
+ if (buf) {
148
+ if (bufsize < len) {
149
+ return 0 ;
150
+ }
151
+
152
+ memcpy (buf, desc, len);
104
153
}
105
154
106
- memcpy (buf, desc, len);
107
155
return len;
108
156
}
109
157
158
+ uint16_t Adafruit_USBD_HID::getInterfaceDescriptor (uint8_t itfnum, uint8_t *buf,
159
+ uint16_t bufsize) {
160
+ // usb core will automatically update endpoint number
161
+ return makeItfDesc (itfnum, EPIN, EPOUT, buf, bufsize);
162
+ }
163
+
110
164
bool Adafruit_USBD_HID::begin (void ) {
165
+
166
+ #ifndef ARDUINO_ARCH_ESP32
111
167
if (!TinyUSBDevice.addInterface (*this )) {
112
168
return false ;
113
169
}
170
+ #endif
114
171
115
172
_hid_dev = this ;
116
173
return true ;
0 commit comments