Skip to content

Commit a748e8c

Browse files
committed
support 2 hid instances
1 parent 67ed749 commit a748e8c

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

src/arduino/hid/Adafruit_USBD_HID.cpp

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@
3434
uint8_t const _ascii2keycode[128][2] = {HID_ASCII_TO_KEYCODE};
3535

3636
// TODO multiple instances
37-
static Adafruit_USBD_HID *_hid_dev = NULL;
37+
// static Adafruit_USBD_HID *_hid_dev = NULL;
38+
39+
// support 2 instances
40+
static uint8_t _instance_count = 0;
41+
static Adafruit_USBD_HID *_hid_devs[2] = {NULL, NULL};
3842

3943
#ifdef ARDUINO_ARCH_ESP32
4044
static uint16_t hid_load_descriptor(uint8_t *dst, uint8_t *itf) {
@@ -162,27 +166,29 @@ bool Adafruit_USBD_HID::begin(void) {
162166
return false;
163167
}
164168

165-
_hid_dev = this;
169+
_instance = _instance_count++;
170+
_hid_devs[_instance] = this;
171+
166172
return true;
167173
}
168174

169175
bool Adafruit_USBD_HID::ready(void) { return tud_hid_ready(); }
170176

171177
bool Adafruit_USBD_HID::sendReport(uint8_t report_id, void const *report,
172178
uint8_t len) {
173-
return tud_hid_report(report_id, report, len);
179+
return tud_hid_n_report(_instance, report_id, report, len);
174180
}
175181

176182
bool Adafruit_USBD_HID::sendReport8(uint8_t report_id, uint8_t num) {
177-
return tud_hid_report(report_id, &num, sizeof(num));
183+
return tud_hid_n_report(_instance, report_id, &num, sizeof(num));
178184
}
179185

180186
bool Adafruit_USBD_HID::sendReport16(uint8_t report_id, uint16_t num) {
181-
return tud_hid_report(report_id, &num, sizeof(num));
187+
return tud_hid_n_report(_instance, report_id, &num, sizeof(num));
182188
}
183189

184190
bool Adafruit_USBD_HID::sendReport32(uint8_t report_id, uint32_t num) {
185-
return tud_hid_report(report_id, &num, sizeof(num));
191+
return tud_hid_n_report(_instance, report_id, &num, sizeof(num));
186192
}
187193

188194
//------------- TinyUSB callbacks -------------//
@@ -191,8 +197,8 @@ extern "C" {
191197
// Invoked when received GET HID REPORT DESCRIPTOR
192198
// Application return pointer to descriptor, whose contents must exist long
193199
// enough for transfer to complete
194-
uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf) {
195-
(void)itf;
200+
uint8_t const *tud_hid_descriptor_report_cb(uint8_t instance) {
201+
Adafruit_USBD_HID *_hid_dev = _hid_devs[instance];
196202

197203
if (!_hid_dev) {
198204
return NULL;
@@ -204,10 +210,10 @@ uint8_t const *tud_hid_descriptor_report_cb(uint8_t itf) {
204210
// Invoked when received GET_REPORT control request
205211
// Application must fill buffer report's content and return its length.
206212
// Return zero will cause the stack to STALL request
207-
uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id,
213+
uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id,
208214
hid_report_type_t report_type, uint8_t *buffer,
209215
uint16_t reqlen) {
210-
(void)itf;
216+
Adafruit_USBD_HID *_hid_dev = _hid_devs[instance];
211217

212218
if (!(_hid_dev && _hid_dev->_get_report_cb)) {
213219
return 0;
@@ -218,10 +224,10 @@ uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id,
218224

219225
// Invoked when received SET_REPORT control request or
220226
// received data on OUT endpoint ( Report ID = 0, Type = 0 )
221-
void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id,
227+
void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id,
222228
hid_report_type_t report_type, uint8_t const *buffer,
223229
uint16_t bufsize) {
224-
(void)itf;
230+
Adafruit_USBD_HID *_hid_dev = _hid_devs[instance];
225231

226232
if (!(_hid_dev && _hid_dev->_set_report_cb)) {
227233
return;
@@ -238,7 +244,7 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id,
238244

239245
bool Adafruit_USBD_HID::keyboardReport(uint8_t report_id, uint8_t modifier,
240246
uint8_t keycode[6]) {
241-
return tud_hid_keyboard_report(report_id, modifier, keycode);
247+
return tud_hid_n_keyboard_report(_instance, report_id, modifier, keycode);
242248
}
243249

244250
bool Adafruit_USBD_HID::keyboardPress(uint8_t report_id, char ch) {
@@ -251,11 +257,11 @@ bool Adafruit_USBD_HID::keyboardPress(uint8_t report_id, char ch) {
251257
}
252258
keycode[0] = _ascii2keycode[uch][1];
253259

254-
return tud_hid_keyboard_report(report_id, modifier, keycode);
260+
return tud_hid_n_keyboard_report(_instance, report_id, modifier, keycode);
255261
}
256262

257263
bool Adafruit_USBD_HID::keyboardRelease(uint8_t report_id) {
258-
return tud_hid_keyboard_report(report_id, 0, NULL);
264+
return tud_hid_n_keyboard_report(_instance, report_id, 0, NULL);
259265
}
260266

261267
//--------------------------------------------------------------------+
@@ -268,24 +274,27 @@ bool Adafruit_USBD_HID::mouseReport(uint8_t report_id, uint8_t buttons,
268274
// cache mouse button for other API such as move, scroll
269275
_mouse_button = buttons;
270276

271-
return tud_hid_mouse_report(report_id, buttons, x, y, vertical, horizontal);
277+
return tud_hid_n_mouse_report(_instance, report_id, buttons, x, y, vertical,
278+
horizontal);
272279
}
273280

274281
bool Adafruit_USBD_HID::mouseMove(uint8_t report_id, int8_t x, int8_t y) {
275-
return tud_hid_mouse_report(report_id, _mouse_button, x, y, 0, 0);
282+
return tud_hid_n_mouse_report(_instance, report_id, _mouse_button, x, y, 0,
283+
0);
276284
}
277285

278286
bool Adafruit_USBD_HID::mouseScroll(uint8_t report_id, int8_t scroll,
279287
int8_t pan) {
280-
return tud_hid_mouse_report(report_id, _mouse_button, 0, 0, scroll, pan);
288+
return tud_hid_n_mouse_report(_instance, report_id, _mouse_button, 0, 0,
289+
scroll, pan);
281290
}
282291

283292
bool Adafruit_USBD_HID::mouseButtonPress(uint8_t report_id, uint8_t buttons) {
284-
return tud_hid_mouse_report(report_id, buttons, 0, 0, 0, 0);
293+
return tud_hid_n_mouse_report(_instance, report_id, buttons, 0, 0, 0, 0);
285294
}
286295

287296
bool Adafruit_USBD_HID::mouseButtonRelease(uint8_t report_id) {
288-
return tud_hid_mouse_report(report_id, 0, 0, 0, 0, 0);
297+
return tud_hid_n_mouse_report(_instance, report_id, 0, 0, 0, 0, 0);
289298
}
290299

291300
#endif // TUSB_OPT_DEVICE_ENABLED

src/arduino/hid/Adafruit_USBD_HID.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ class Adafruit_USBD_HID : public Adafruit_USBD_Interface {
9595
get_report_callback_t _get_report_cb;
9696
set_report_callback_t _set_report_cb;
9797

98+
uint8_t _instance;
99+
98100
friend uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id,
99101
hid_report_type_t report_type,
100102
uint8_t *buffer, uint16_t reqlen);

src/arduino/ports/rp2040/tusb_config_rp2040.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ extern int serial1_printf(const char *__restrict __format, ...);
6868

6969
#define CFG_TUD_CDC 1
7070
#define CFG_TUD_MSC 1
71-
#define CFG_TUD_HID 1
71+
#define CFG_TUD_HID 2
7272
#define CFG_TUD_MIDI 1
7373
#define CFG_TUD_VENDOR 1
7474

@@ -104,7 +104,7 @@ extern int serial1_printf(const char *__restrict __format, ...);
104104
#define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports
105105

106106
// Enable tuh_edpt_xfer() API
107-
//#define CFG_TUH_API_EDPT_XFER 1
107+
// #define CFG_TUH_API_EDPT_XFER 1
108108

109109
// Number of mass storage
110110
#define CFG_TUH_MSC 1

0 commit comments

Comments
 (0)