33
33
#include " Adafruit_USBD_CDC.h"
34
34
#include " Adafruit_USBD_Device.h"
35
35
36
- #define EPOUT 0x00 // Starting endpoints; adjusted elsewhere as needed
36
+ // Starting endpoints; adjusted elsewhere as needed
37
+ #define EPOUT 0x00
37
38
#define EPIN 0x80
38
39
40
+ uint8_t _cdc_instance_count = 0 ;
41
+
39
42
Adafruit_USBD_CDC Serial;
40
43
41
- Adafruit_USBD_CDC::Adafruit_USBD_CDC (int instance ) {
44
+ Adafruit_USBD_CDC::Adafruit_USBD_CDC (void ) {
42
45
_begun = false ;
43
- _instance = instance ;
46
+ _itf = 0 ;
44
47
}
45
48
46
49
uint16_t Adafruit_USBD_CDC::getInterfaceDescriptor (uint8_t itfnum, uint8_t *buf,
@@ -66,7 +69,13 @@ void Adafruit_USBD_CDC::begin(uint32_t baud) {
66
69
return ;
67
70
}
68
71
72
+ // too many instances
73
+ if (!(_cdc_instance_count < CFG_TUD_CDC)) {
74
+ return ;
75
+ }
76
+
69
77
_begun = true ;
78
+ _itf = _cdc_instance_count++;
70
79
this ->setStringDescriptor (" TinyUSB Serial" );
71
80
USBDevice.addInterface (*this );
72
81
}
@@ -79,40 +88,41 @@ void Adafruit_USBD_CDC::begin(uint32_t baud, uint8_t config) {
79
88
void Adafruit_USBD_CDC::end (void ) {
80
89
// Resset configuration descriptor without Serial as CDC
81
90
USBDevice.clearConfiguration ();
91
+ _cdc_instance_count = 0 ;
82
92
}
83
93
84
94
uint32_t Adafruit_USBD_CDC::baud (void ) {
85
95
cdc_line_coding_t coding;
86
- tud_cdc_n_get_line_coding (_instance , &coding);
96
+ tud_cdc_n_get_line_coding (_itf , &coding);
87
97
88
98
return coding.bit_rate ;
89
99
}
90
100
91
101
uint8_t Adafruit_USBD_CDC::stopbits (void ) {
92
102
cdc_line_coding_t coding;
93
- tud_cdc_n_get_line_coding (_instance , &coding);
103
+ tud_cdc_n_get_line_coding (_itf , &coding);
94
104
95
105
return coding.stop_bits ;
96
106
}
97
107
98
108
uint8_t Adafruit_USBD_CDC::paritytype (void ) {
99
109
cdc_line_coding_t coding;
100
- tud_cdc_n_get_line_coding (_instance , &coding);
110
+ tud_cdc_n_get_line_coding (_itf , &coding);
101
111
102
112
return coding.parity ;
103
113
}
104
114
105
115
uint8_t Adafruit_USBD_CDC::numbits (void ) {
106
116
cdc_line_coding_t coding;
107
- tud_cdc_n_get_line_coding (_instance , &coding);
117
+ tud_cdc_n_get_line_coding (_itf , &coding);
108
118
109
119
return coding.data_bits ;
110
120
}
111
121
112
- int Adafruit_USBD_CDC::dtr (void ) { return tud_cdc_n_connected (_instance ); }
122
+ int Adafruit_USBD_CDC::dtr (void ) { return tud_cdc_n_connected (_itf ); }
113
123
114
124
Adafruit_USBD_CDC::operator bool () {
115
- bool ret = tud_cdc_n_connected (_instance );
125
+ bool ret = tud_cdc_n_connected (_itf );
116
126
117
127
// Add an yield to run usb background in case sketch block wait as follows
118
128
// while( !Serial ) {}
@@ -123,7 +133,7 @@ Adafruit_USBD_CDC::operator bool() {
123
133
}
124
134
125
135
int Adafruit_USBD_CDC::available (void ) {
126
- uint32_t count = tud_cdc_n_available (_instance );
136
+ uint32_t count = tud_cdc_n_available (_itf );
127
137
128
138
// Add an yield to run usb background in case sketch block wait as follows
129
139
// while( !Serial.available() ) {}
@@ -136,19 +146,19 @@ int Adafruit_USBD_CDC::available(void) {
136
146
137
147
int Adafruit_USBD_CDC::peek (void ) {
138
148
uint8_t ch;
139
- return tud_cdc_n_peek (_instance , &ch) ? (int )ch : -1 ;
149
+ return tud_cdc_n_peek (_itf , &ch) ? (int )ch : -1 ;
140
150
}
141
151
142
- int Adafruit_USBD_CDC::read (void ) { return (int )tud_cdc_n_read_char (_instance ); }
152
+ int Adafruit_USBD_CDC::read (void ) { return (int )tud_cdc_n_read_char (_itf ); }
143
153
144
- void Adafruit_USBD_CDC::flush (void ) { tud_cdc_n_write_flush (_instance ); }
154
+ void Adafruit_USBD_CDC::flush (void ) { tud_cdc_n_write_flush (_itf ); }
145
155
146
156
size_t Adafruit_USBD_CDC::write (uint8_t ch) { return write (&ch, 1 ); }
147
157
148
158
size_t Adafruit_USBD_CDC::write (const uint8_t *buffer, size_t size) {
149
159
size_t remain = size;
150
- while (remain && tud_cdc_n_connected (_instance )) {
151
- size_t wrcount = tud_cdc_n_write (_instance , buffer, remain);
160
+ while (remain && tud_cdc_n_connected (_itf )) {
161
+ size_t wrcount = tud_cdc_n_write (_itf , buffer, remain);
152
162
remain -= wrcount;
153
163
buffer += wrcount;
154
164
@@ -162,14 +172,14 @@ size_t Adafruit_USBD_CDC::write(const uint8_t *buffer, size_t size) {
162
172
}
163
173
164
174
int Adafruit_USBD_CDC::availableForWrite (void ) {
165
- return tud_cdc_n_write_available (_instance );
175
+ return tud_cdc_n_write_available (_itf );
166
176
}
167
177
168
178
extern " C" {
169
179
170
180
// Invoked when cdc when line state changed e.g connected/disconnected
171
181
// Use to reset to DFU when disconnect with 1200 bps
172
- void tud_cdc_line_state_cb (uint8_t instance, bool dtr, bool rts) {
182
+ void tud_cdc_line_state_cb (uint8_t instance, bool dtr, bool rts) {
173
183
(void )rts;
174
184
175
185
// DTR = false is counted as disconnected
0 commit comments