14
14
#include " esp32-hal.h"
15
15
#include " esp32-hal-tinyusb.h"
16
16
#include " USBHID.h"
17
+ #include " esp_hid_common.h"
17
18
18
19
#if CFG_TUD_HID
19
20
#define USB_HID_DEVICES_MAX 10
@@ -46,16 +47,26 @@ void log_print_buf(const uint8_t *b, size_t len){
46
47
}
47
48
}
48
49
50
+ typedef struct {
51
+ USBHIDDevice * device;
52
+ uint8_t reports_num;
53
+ uint8_t * report_ids;
54
+ } tinyusb_hid_device_t ;
55
+
56
+ static tinyusb_hid_device_t tinyusb_hid_devices[USB_HID_DEVICES_MAX];
57
+
58
+ static uint8_t tinyusb_hid_devices_num = 0 ;
59
+ static bool tinyusb_hid_devices_is_initialized = false ;
60
+ static xSemaphoreHandle tinyusb_hid_device_input_sem = NULL ;
61
+ static xSemaphoreHandle tinyusb_hid_device_input_mutex = NULL ;
49
62
50
63
static bool tinyusb_hid_is_initialized = false ;
51
- static tinyusb_hid_device_descriptor_cb_t tinyusb_loaded_hid_devices_callbacks[USB_HID_DEVICES_MAX];
52
64
static uint8_t tinyusb_loaded_hid_devices_num = 0 ;
53
- static uint8_t tinyusb_loaded_hid_devices_report_id = 1 ;
54
65
static uint16_t tinyusb_hid_device_descriptor_len = 0 ;
55
66
static uint8_t * tinyusb_hid_device_descriptor = NULL ;
56
67
static const char * tinyusb_hid_device_report_types[4 ] = {" INVALID" , " INPUT" , " OUTPUT" , " FEATURE" };
57
68
58
- static bool tinyusb_enable_hid_device (uint16_t descriptor_len, tinyusb_hid_device_descriptor_cb_t cb ){
69
+ static bool tinyusb_enable_hid_device (uint16_t descriptor_len, USBHIDDevice * device ){
59
70
if (tinyusb_hid_is_initialized){
60
71
log_e (" TinyUSB HID has already started! Device not enabled" );
61
72
return false ;
@@ -65,36 +76,118 @@ static bool tinyusb_enable_hid_device(uint16_t descriptor_len, tinyusb_hid_devic
65
76
return false ;
66
77
}
67
78
tinyusb_hid_device_descriptor_len += descriptor_len;
68
- tinyusb_loaded_hid_devices_callbacks[tinyusb_loaded_hid_devices_num++] = cb;
69
- log_d (" Device enabled" );
79
+ tinyusb_hid_devices[tinyusb_loaded_hid_devices_num++].device = device;
80
+
81
+ log_d (" Device[%u] len: %u" , tinyusb_loaded_hid_devices_num-1 , descriptor_len);
70
82
return true ;
71
83
}
72
84
73
- static uint16_t tinyusb_load_hid_descriptor (uint8_t interface, uint8_t * dst, uint8_t report_id)
74
- {
75
- if (interface < USB_HID_DEVICES_MAX && tinyusb_loaded_hid_devices_callbacks[interface] != NULL ){
76
- return tinyusb_loaded_hid_devices_callbacks[interface](dst, report_id);
85
+ USBHIDDevice * tinyusb_get_device_by_report_id (uint8_t report_id){
86
+ for (uint8_t i=0 ; i<tinyusb_loaded_hid_devices_num; i++){
87
+ tinyusb_hid_device_t * device = &tinyusb_hid_devices[i];
88
+ if (device->device && device->reports_num ){
89
+ for (uint8_t r=0 ; r<device->reports_num ; r++){
90
+ if (report_id == device->report_ids [r]){
91
+ return device->device ;
92
+ }
93
+ }
94
+ }
95
+ }
96
+ return NULL ;
97
+ }
98
+
99
+ static uint16_t tinyusb_on_get_feature (uint8_t report_id, uint8_t * buffer, uint16_t reqlen){
100
+ USBHIDDevice * device = tinyusb_get_device_by_report_id (report_id);
101
+ if (device){
102
+ return device->_onGetFeature (report_id, buffer, reqlen);
77
103
}
78
104
return 0 ;
79
105
}
80
106
107
+ static bool tinyusb_on_set_feature (uint8_t report_id, const uint8_t * buffer, uint16_t reqlen){
108
+ USBHIDDevice * device = tinyusb_get_device_by_report_id (report_id);
109
+ if (device){
110
+ device->_onSetFeature (report_id, buffer, reqlen);
111
+ return true ;
112
+ }
113
+ return false ;
114
+ }
115
+
116
+ static bool tinyusb_on_set_output (uint8_t report_id, const uint8_t * buffer, uint16_t reqlen){
117
+ USBHIDDevice * device = tinyusb_get_device_by_report_id (report_id);
118
+ if (device){
119
+ device->_onOutput (report_id, buffer, reqlen);
120
+ return true ;
121
+ }
122
+ return false ;
123
+ }
124
+
125
+ static uint16_t tinyusb_on_add_descriptor (uint8_t device_index, uint8_t * dst){
126
+ uint16_t res = 0 ;
127
+ uint8_t report_id = 0 , reports_num = 0 ;
128
+ tinyusb_hid_device_t * device = &tinyusb_hid_devices[device_index];
129
+ if (device->device ){
130
+ res = device->device ->_onGetDescriptor (dst);
131
+ if (res){
132
+
133
+ esp_hid_report_map_t *hid_report_map = esp_hid_parse_report_map (dst, res);
134
+ if (hid_report_map){
135
+ if (device->report_ids ){
136
+ free (device->report_ids );
137
+ }
138
+ device->reports_num = hid_report_map->reports_len ;
139
+ device->report_ids = (uint8_t *)malloc (device->reports_num );
140
+ memset (device->report_ids , 0 , device->reports_num );
141
+ reports_num = device->reports_num ;
142
+
143
+ for (uint8_t i=0 ; i<device->reports_num ; i++){
144
+ if (hid_report_map->reports [i].protocol_mode == ESP_HID_PROTOCOL_MODE_REPORT){
145
+ report_id = hid_report_map->reports [i].report_id ;
146
+ for (uint8_t r=0 ; r<device->reports_num ; r++){
147
+ if (report_id == device->report_ids [r]){
148
+ // already added
149
+ reports_num--;
150
+ break ;
151
+ } else if (!device->report_ids [r]){
152
+ // empty slot
153
+ device->report_ids [r] = report_id;
154
+ break ;
155
+ }
156
+ }
157
+ } else {
158
+ reports_num--;
159
+ }
160
+ }
161
+ device->reports_num = reports_num;
162
+ esp_hid_free_report_map (hid_report_map);
163
+ }
164
+
165
+ }
166
+ }
167
+ return res;
168
+ }
169
+
170
+
81
171
static bool tinyusb_load_enabled_hid_devices (){
172
+ if (tinyusb_hid_device_descriptor != NULL ){
173
+ return true ;
174
+ }
82
175
tinyusb_hid_device_descriptor = (uint8_t *)malloc (tinyusb_hid_device_descriptor_len);
83
176
if (tinyusb_hid_device_descriptor == NULL ) {
84
177
log_e (" HID Descriptor Malloc Failed" );
85
178
return false ;
86
179
}
87
180
uint8_t * dst = tinyusb_hid_device_descriptor;
88
181
89
- for (uint8_t i=0 ; i<USB_HID_DEVICES_MAX ; i++){
90
- uint16_t len = tinyusb_load_hid_descriptor (i, dst, i+ 1 );
182
+ for (uint8_t i=0 ; i<tinyusb_loaded_hid_devices_num ; i++){
183
+ uint16_t len = tinyusb_on_add_descriptor (i, dst);
91
184
if (!len) {
92
185
break ;
93
186
} else {
94
187
dst += len;
95
188
}
96
189
}
97
- log_d ( " Load Done: reports: %u, descr_len: %u " , tinyusb_loaded_hid_devices_report_id - 1 , tinyusb_hid_device_descriptor_len);
190
+
98
191
return true ;
99
192
}
100
193
@@ -125,12 +218,6 @@ extern "C" uint16_t tusb_hid_load_descriptor(uint8_t * dst, uint8_t * itf)
125
218
126
219
127
220
128
- static USBHIDDevice * tinyusb_hid_devices[USB_HID_DEVICES_MAX+1 ];
129
- static uint8_t tinyusb_hid_devices_num = 0 ;
130
- static bool tinyusb_hid_devices_is_initialized = false ;
131
- static xSemaphoreHandle tinyusb_hid_device_input_sem = NULL ;
132
- static xSemaphoreHandle tinyusb_hid_device_input_mutex = NULL ;
133
-
134
221
135
222
// Invoked when received GET HID REPORT DESCRIPTOR request
136
223
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
@@ -165,38 +252,36 @@ bool tud_hid_set_idle_cb(uint8_t instance, uint8_t idle_rate){
165
252
// Application must fill buffer report's content and return its length.
166
253
// Return zero will cause the stack to STALL request
167
254
uint16_t tud_hid_get_report_cb (uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t * buffer, uint16_t reqlen){
168
- if (report_id < USB_HID_DEVICES_MAX && tinyusb_hid_devices[report_id]){
169
- return tinyusb_hid_devices[report_id]->_onGetFeature (buffer, reqlen);
255
+ uint16_t res = tinyusb_on_get_feature (report_id, buffer, reqlen);
256
+ if (!res){
257
+ log_d (" instance: %u, report_id: %u, report_type: %s, reqlen: %u" , instance, report_id, tinyusb_hid_device_report_types[report_type], reqlen);
170
258
}
171
- log_d (" instance: %u, report_id: %u, report_type: %s, reqlen: %u" , instance, report_id, tinyusb_hid_device_report_types[report_type], reqlen);
172
- return 0 ;
259
+ return res;
173
260
}
174
261
175
262
// Invoked when received SET_REPORT control request or
176
263
// received data on OUT endpoint ( Report ID = 0, Type = 0 )
177
264
void tud_hid_set_report_cb (uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const * buffer, uint16_t bufsize){
178
265
if (!report_id && !report_type){
179
266
report_id = buffer[0 ];
180
- if (report_id < USB_HID_DEVICES_MAX && tinyusb_hid_devices[report_id]){
181
- tinyusb_hid_devices[report_id]->_onOutput (buffer+1 , bufsize-1 );
182
- } else {
267
+ if (!tinyusb_on_set_output (report_id, buffer+1 , bufsize-1 )){
183
268
log_d (" instance: %u, report_id: %u, report_type: %s, bufsize: %u" , instance, *buffer, tinyusb_hid_device_report_types[HID_REPORT_TYPE_OUTPUT], bufsize-1 );
184
- log_print_buf (buffer+1 , bufsize-1 );
269
+ // log_print_buf(buffer+1, bufsize-1);
185
270
}
186
271
} else {
187
- if (report_id < USB_HID_DEVICES_MAX && tinyusb_hid_devices[report_id]){
188
- tinyusb_hid_devices[report_id]->_onSetFeature (buffer, bufsize);
189
- } else {
272
+ if (!tinyusb_on_set_feature (report_id, buffer, bufsize)){
190
273
log_d (" instance: %u, report_id: %u, report_type: %s, bufsize: %u" , instance, report_id, tinyusb_hid_device_report_types[report_type], bufsize);
191
- log_print_buf (buffer, bufsize);
274
+ // log_print_buf(buffer, bufsize);
192
275
}
193
276
}
194
277
}
195
278
196
279
USBHID::USBHID (){
197
280
if (!tinyusb_hid_devices_is_initialized){
198
281
tinyusb_hid_devices_is_initialized = true ;
199
- memset (tinyusb_hid_devices, 0 , sizeof (tinyusb_hid_devices));
282
+ for (uint8_t i=0 ; i<USB_HID_DEVICES_MAX; i++){
283
+ memset (&tinyusb_hid_devices[i], 0 , sizeof (tinyusb_hid_device_t ));
284
+ }
200
285
tinyusb_hid_devices_num = 0 ;
201
286
tinyusb_enable_interface (USB_INTERFACE_HID, TUD_HID_INOUT_DESC_LEN, tusb_hid_load_descriptor);
202
287
}
@@ -259,13 +344,11 @@ bool USBHID::SendReport(uint8_t id, const void* data, size_t len, uint32_t timeo
259
344
return res;
260
345
}
261
346
262
- bool USBHID::addDevice (USBHIDDevice * device, uint16_t descriptor_len, tinyusb_hid_device_descriptor_cb_t cb ){
347
+ bool USBHID::addDevice (USBHIDDevice * device, uint16_t descriptor_len){
263
348
if (device && tinyusb_loaded_hid_devices_num < USB_HID_DEVICES_MAX){
264
- if (!tinyusb_enable_hid_device (descriptor_len, cb )){
349
+ if (!tinyusb_enable_hid_device (descriptor_len, device )){
265
350
return false ;
266
351
}
267
- device->id = tinyusb_loaded_hid_devices_num;
268
- tinyusb_hid_devices[tinyusb_loaded_hid_devices_num] = device;
269
352
return true ;
270
353
}
271
354
return false ;
0 commit comments