Merge branch 'master' into feat/zigbee-hue-sat-support · espressif/arduino-esp32@b3ad99f (original) (raw)
`@@ -25,8 +25,7 @@ ESP_EVENT_DEFINE_BASE(ARDUINO_USB_CDC_EVENTS);
`
25
25
`esp_err_t arduino_usb_event_post(esp_event_base_t event_base, int32_t event_id, void *event_data, size_t event_data_size, TickType_t ticks_to_wait);
`
26
26
`esp_err_t arduino_usb_event_handler_register_with(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg);
`
27
27
``
28
``
`-
#define MAX_USB_CDC_DEVICES 2
`
29
``
`-
USBCDC *devices[MAX_USB_CDC_DEVICES] = {NULL, NULL};
`
``
28
`+
USBCDC *devices[CFG_TUD_CDC];
`
30
29
``
31
30
`static uint16_t load_cdc_descriptor(uint8_t *dst, uint8_t *itf) {
`
32
31
`uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB CDC");
`
`@@ -38,23 +37,43 @@ static uint16_t load_cdc_descriptor(uint8_t *dst, uint8_t *itf) {
`
38
37
`return TUD_CDC_DESC_LEN;
`
39
38
`}
`
40
39
``
``
40
`+
static uint16_t load_cdc_descriptor2(uint8_t *dst, uint8_t *itf) {
`
``
41
`+
uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB CDC2");
`
``
42
`+
uint8_t ep_ntfy = tinyusb_get_free_in_endpoint();
`
``
43
`+
TU_VERIFY(ep_ntfy != 0);
`
``
44
`+
uint8_t ep_in = tinyusb_get_free_in_endpoint();
`
``
45
`+
TU_VERIFY(ep_in != 0);
`
``
46
`+
uint8_t ep_out = tinyusb_get_free_out_endpoint();
`
``
47
`+
TU_VERIFY(ep_out != 0);
`
``
48
`+
uint8_t descriptor[TUD_CDC_DESC_LEN] = {
`
``
49
`+
// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
`
``
50
`+
TUD_CDC_DESCRIPTOR(*itf, str_index, (uint8_t)(0x80 | ep_ntfy), CFG_TUD_ENDOINT_SIZE, ep_out, (uint8_t)(0x80 | ep_in), CFG_TUD_ENDOINT_SIZE)
`
``
51
`+
};
`
``
52
`+
*itf += 2;
`
``
53
`+
memcpy(dst, descriptor, TUD_CDC_DESC_LEN);
`
``
54
`+
return TUD_CDC_DESC_LEN;
`
``
55
`+
}
`
``
56
+
41
57
`// Invoked when line state DTR & RTS are changed via SET_CONTROL_LINE_STATE
`
42
58
`void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {
`
43
``
`-
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
`
``
59
`+
//log_v("ITF: %u, DTR: %u, RTS: %u", itf, dtr, rts);
`
``
60
`+
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
`
44
61
` devices[itf]->_onLineState(dtr, rts);
`
45
62
` }
`
46
63
`}
`
47
64
``
48
65
`// Invoked when line coding is change via SET_LINE_CODING
`
49
66
`void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const *p_line_coding) {
`
50
``
`-
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
`
``
67
`+
//log_v("ITF: %u, BITRATE: %lu, STOP_BITS: %u, PARITY: %u, DATA_BITS: %u", itf, p_line_coding->bit_rate, p_line_coding->stop_bits, p_line_coding->parity, p_line_coding->data_bits);
`
``
68
`+
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
`
51
69
` devices[itf]->_onLineCoding(p_line_coding->bit_rate, p_line_coding->stop_bits, p_line_coding->parity, p_line_coding->data_bits);
`
52
70
` }
`
53
71
`}
`
54
72
``
55
73
`// Invoked when received new data
`
56
74
`void tud_cdc_rx_cb(uint8_t itf) {
`
57
``
`-
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
`
``
75
`+
//log_v("ITF: %u", itf);
`
``
76
`+
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
`
58
77
` devices[itf]->_onRX();
`
59
78
` }
`
60
79
`}
`
`@@ -66,13 +85,13 @@ void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms) {
`
66
85
``
67
86
`// Invoked when space becomes available in TX buffer
`
68
87
`void tud_cdc_tx_complete_cb(uint8_t itf) {
`
69
``
`-
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
`
``
88
`+
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
`
70
89
` devices[itf]->_onTX();
`
71
90
` }
`
72
91
`}
`
73
92
``
74
93
`static void ARDUINO_ISR_ATTR cdc0_write_char(char c) {
`
75
``
`-
if (devices[0] != NULL) {
`
``
94
`+
if (CFG_TUD_CDC && devices[0] != NULL) {
`
76
95
`tud_cdc_n_write_char(0, c);
`
77
96
` }
`
78
97
`}
`
`@@ -84,9 +103,15 @@ static void usb_unplugged_cb(void *arg, esp_event_base_t event_base, int32_t eve
`
84
103
`USBCDC::USBCDC(uint8_t itfn)
`
85
104
` : itf(itfn), bit_rate(0), stop_bits(0), parity(0), data_bits(0), dtr(false), rts(false), connected(false), reboot_enable(true), rx_queue(NULL), tx_lock(NULL),
`
86
105
` tx_timeout_ms(250) {
`
87
``
`-
tinyusb_enable_interface(USB_INTERFACE_CDC, TUD_CDC_DESC_LEN, load_cdc_descriptor);
`
88
``
`-
if (itf < MAX_USB_CDC_DEVICES) {
`
``
106
`+
if (itf < CFG_TUD_CDC) {
`
``
107
`+
if (itf == 0) {
`
``
108
`+
tinyusb_enable_interface(USB_INTERFACE_CDC, TUD_CDC_DESC_LEN, load_cdc_descriptor);
`
``
109
`+
} else {
`
``
110
`+
tinyusb_enable_interface(USB_INTERFACE_CDC2, TUD_CDC_DESC_LEN, load_cdc_descriptor2);
`
``
111
`+
}
`
89
112
`arduino_usb_event_handler_register_with(ARDUINO_USB_EVENTS, ARDUINO_USB_STOPPED_EVENT, usb_unplugged_cb, this);
`
``
113
`+
} else {
`
``
114
`+
log_e("Maximum of %u CDC devices are supported", CFG_TUD_CDC);
`
90
115
` }
`
91
116
`}
`
92
117
``
`@@ -142,6 +167,9 @@ size_t USBCDC::setRxBufferSize(size_t rx_queue_len) {
`
142
167
`}
`
143
168
``
144
169
`void USBCDC::begin(unsigned long baud) {
`
``
170
`+
if (itf >= CFG_TUD_CDC) {
`
``
171
`+
return;
`
``
172
`+
}
`
145
173
`if (tx_lock == NULL) {
`
146
174
` tx_lock = xSemaphoreCreateMutex();
`
147
175
` }
`
`@@ -153,6 +181,9 @@ void USBCDC::begin(unsigned long baud) {
`
153
181
`}
`
154
182
``
155
183
`void USBCDC::end() {
`
``
184
`+
if (itf >= CFG_TUD_CDC) {
`
``
185
`+
return;
`
``
186
`+
}
`
156
187
` connected = false;
`
157
188
` devices[itf] = NULL;
`
158
189
`setRxBufferSize(0);
`
`@@ -298,14 +329,14 @@ bool USBCDC::rebootEnabled(void) {
`
298
329
`}
`
299
330
``
300
331
`int USBCDC::available(void) {
`
301
``
`-
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
`
``
332
`+
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
`
302
333
`return -1;
`
303
334
` }
`
304
335
`return uxQueueMessagesWaiting(rx_queue);
`
305
336
`}
`
306
337
``
307
338
`int USBCDC::peek(void) {
`
308
``
`-
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
`
``
339
`+
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
`
309
340
`return -1;
`
310
341
` }
`
311
342
`uint8_t c;
`
`@@ -316,7 +347,7 @@ int USBCDC::peek(void) {
`
316
347
`}
`
317
348
``
318
349
`int USBCDC::read(void) {
`
319
``
`-
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
`
``
350
`+
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
`
320
351
`return -1;
`
321
352
` }
`
322
353
`uint8_t c = 0;
`
`@@ -327,7 +358,7 @@ int USBCDC::read(void) {
`
327
358
`}
`
328
359
``
329
360
`size_t USBCDC::read(uint8_t *buffer, size_t size) {
`
330
``
`-
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
`
``
361
`+
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
`
331
362
`return -1;
`
332
363
` }
`
333
364
`uint8_t c = 0;
`
`@@ -339,7 +370,7 @@ size_t USBCDC::read(uint8_t *buffer, size_t size) {
`
339
370
`}
`
340
371
``
341
372
`void USBCDC::flush(void) {
`
342
``
`-
if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
`
``
373
`+
if (itf >= CFG_TUD_CDC || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
`
343
374
`return;
`
344
375
` }
`
345
376
`if (xSemaphoreTake(tx_lock, tx_timeout_ms / portTICK_PERIOD_MS) != pdPASS) {
`
`@@ -350,7 +381,7 @@ void USBCDC::flush(void) {
`
350
381
`}
`
351
382
``
352
383
`int USBCDC::availableForWrite(void) {
`
353
``
`-
if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
`
``
384
`+
if (itf >= CFG_TUD_CDC || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
`
354
385
`return 0;
`
355
386
` }
`
356
387
`if (xSemaphoreTake(tx_lock, tx_timeout_ms / portTICK_PERIOD_MS) != pdPASS) {
`
`@@ -362,7 +393,7 @@ int USBCDC::availableForWrite(void) {
`
362
393
`}
`
363
394
``
364
395
`size_t USBCDC::write(const uint8_t *buffer, size_t size) {
`
365
``
`-
if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || buffer == NULL || size == 0 || !tud_cdc_n_connected(itf)) {
`
``
396
`+
if (itf >= CFG_TUD_CDC || tx_lock == NULL || buffer == NULL || size == 0 || !tud_cdc_n_connected(itf)) {
`
366
397
`return 0;
`
367
398
` }
`
368
399
`if (xPortInIsrContext()) {
`
`@@ -415,6 +446,9 @@ uint32_t USBCDC::baudRate() {
`
415
446
`}
`
416
447
``
417
448
`void USBCDC::setDebugOutput(bool en) {
`
``
449
`+
if (itf) {
`
``
450
`+
return;
`
``
451
`+
}
`
418
452
`if (en) {
`
419
453
`uartSetDebug(NULL);
`
420
454
`ets_install_putc2((void (*)(char)) & cdc0_write_char);
`
`@@ -424,7 +458,7 @@ void USBCDC::setDebugOutput(bool en) {
`
424
458
`}
`
425
459
``
426
460
`USBCDC::operator bool() const {
`
427
``
`-
if (itf >= MAX_USB_CDC_DEVICES) {
`
``
461
`+
if (itf >= CFG_TUD_CDC) {
`
428
462
`return false;
`
429
463
` }
`
430
464
`return connected;
`