Skip to content

Commit 6ff862e

Browse files
authored
Merge pull request arduino#158 from hathach/tinyusb-webusb
update Tinyusb to support webusb
2 parents 553d3c8 + 96adc67 commit 6ff862e

33 files changed

+929
-533
lines changed

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ int Adafruit_USBD_CDC::available(void)
9191

9292
int Adafruit_USBD_CDC::peek(void)
9393
{
94-
return tud_cdc_peek(0);
94+
uint8_t ch;
95+
return tud_cdc_peek(0, &ch) ? (int) ch : -1;
9596
}
9697

9798
int Adafruit_USBD_CDC::read(void)
@@ -125,6 +126,11 @@ size_t Adafruit_USBD_CDC::write(const uint8_t *buffer, size_t size)
125126
return size - remain;
126127
}
127128

129+
int Adafruit_USBD_CDC::availableForWrite(void)
130+
{
131+
return tud_cdc_write_available();
132+
}
133+
128134
extern "C"
129135
{
130136

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,17 @@ class Adafruit_USBD_CDC : public Stream, Adafruit_USBD_Interface
4141
void begin(uint32_t baud, uint8_t config);
4242
void end(void);
4343

44-
virtual int available(void);
45-
virtual int peek(void);
46-
virtual int read(void);
47-
virtual void flush(void);
44+
virtual int available(void);
45+
virtual int peek(void);
46+
virtual int read(void);
47+
virtual void flush(void);
4848
virtual size_t write(uint8_t);
49+
4950
virtual size_t write(const uint8_t *buffer, size_t size);
5051
size_t write(const char *buffer, size_t size) {
5152
return write((const uint8_t *)buffer, size);
5253
}
54+
virtual int availableForWrite(void);
5355
operator bool();
5456
};
5557

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_Device.cpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Adafruit_USBD_Device USBDevice;
4040

4141
Adafruit_USBD_Device::Adafruit_USBD_Device(void)
4242
{
43-
tusb_desc_device_t desc_dev =
43+
tusb_desc_device_t const desc_dev =
4444
{
4545
.bLength = sizeof(tusb_desc_device_t),
4646
.bDescriptorType = TUSB_DESC_DEVICE,
@@ -57,25 +57,22 @@ Adafruit_USBD_Device::Adafruit_USBD_Device(void)
5757
.idVendor = 0,
5858
.idProduct = 0,
5959
.bcdDevice = 0x0100,
60-
6160
.iManufacturer = 0x01,
6261
.iProduct = 0x02,
6362
.iSerialNumber = 0x03,
64-
6563
.bNumConfigurations = 0x01
6664
};
6765

6866
_desc_device = desc_dev;
6967

70-
tusb_desc_configuration_t dev_cfg =
68+
tusb_desc_configuration_t const dev_cfg =
7169
{
7270
.bLength = sizeof(tusb_desc_configuration_t),
7371
.bDescriptorType = TUSB_DESC_CONFIGURATION,
7472

7573
// Total Length & Interface Number will be updated later
7674
.wTotalLength = 0,
7775
.bNumInterfaces = 0,
78-
7976
.bConfigurationValue = 1,
8077
.iConfiguration = 0x00,
8178
.bmAttributes = TU_BIT(7) | TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP,
@@ -132,6 +129,11 @@ void Adafruit_USBD_Device::setID(uint16_t vid, uint16_t pid)
132129
_desc_device.idProduct = pid;
133130
}
134131

132+
void Adafruit_USBD_Device::setVersion(uint16_t bcd)
133+
{
134+
_desc_device.bcdUSB = bcd;
135+
}
136+
135137
bool Adafruit_USBD_Device::begin(void)
136138
{
137139
return true;
@@ -196,8 +198,8 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index)
196198
default: return NULL;
197199
}
198200

199-
// first byte is len, second byte is string type
200-
_desc_str[0] = TUD_DESC_STR_HEADER(chr_count);
201+
// first byte is length (including header), second byte is string type
202+
_desc_str[0] = (TUSB_DESC_STRING << 8 ) | (2*chr_count + 2);
201203

202204
return _desc_str;
203205
}

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_Device.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ class Adafruit_USBD_Device
5252
bool addInterface(Adafruit_USBD_Interface& itf);
5353

5454
void setID(uint16_t vid, uint16_t pid);
55+
void setVersion(uint16_t bcd);
5556
bool begin(void);
5657

57-
bool mounted(void) { return tud_mounted(); }
58-
bool suspended(void) { return tud_suspended(); }
59-
bool ready(void) { return tud_ready(); }
60-
bool remoteWakeup(void) { return tud_remote_wakeup(); }
58+
bool mounted (void) { return tud_mounted(); }
59+
bool suspended (void) { return tud_suspended(); }
60+
bool ready (void) { return tud_ready(); }
61+
bool remoteWakeup (void) { return tud_remote_wakeup(); }
6162

6263
friend uint8_t const * tud_descriptor_device_cb(void);
6364
friend uint8_t const * tud_descriptor_configuration_cb(uint8_t index);

cores/arduino/Adafruit_TinyUSB_Core/tinyusb/src/class/cdc/cdc_device.c

+15-26
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,16 @@ uint32_t tud_cdc_n_available(uint8_t itf)
121121
return tu_fifo_count(&_cdcd_itf[itf].rx_ff);
122122
}
123123

124-
signed char tud_cdc_n_read_char(uint8_t itf)
125-
{
126-
signed char ch;
127-
return tud_cdc_n_read(itf, &ch, 1) ? ch : (-1);
128-
}
129-
130124
uint32_t tud_cdc_n_read(uint8_t itf, void* buffer, uint32_t bufsize)
131125
{
132126
uint32_t num_read = tu_fifo_read_n(&_cdcd_itf[itf].rx_ff, buffer, bufsize);
133127
_prep_out_transaction(itf);
134128
return num_read;
135129
}
136130

137-
signed char tud_cdc_n_peek(uint8_t itf, int pos)
131+
bool tud_cdc_n_peek(uint8_t itf, int pos, uint8_t* chr)
138132
{
139-
signed char ch;
140-
return tu_fifo_peek_at(&_cdcd_itf[itf].rx_ff, pos, &ch) ? ch : (-1);
133+
return tu_fifo_peek_at(&_cdcd_itf[itf].rx_ff, pos, chr);
141134
}
142135

143136
void tud_cdc_n_read_flush (uint8_t itf)
@@ -149,17 +142,6 @@ void tud_cdc_n_read_flush (uint8_t itf)
149142
//--------------------------------------------------------------------+
150143
// WRITE API
151144
//--------------------------------------------------------------------+
152-
153-
uint32_t tud_cdc_n_write_char(uint8_t itf, char ch)
154-
{
155-
return tud_cdc_n_write(itf, &ch, 1);
156-
}
157-
158-
uint32_t tud_cdc_n_write_str (uint8_t itf, char const* str)
159-
{
160-
return tud_cdc_n_write(itf, str, strlen(str));
161-
}
162-
163145
uint32_t tud_cdc_n_write(uint8_t itf, void const* buffer, uint32_t bufsize)
164146
{
165147
uint16_t ret = tu_fifo_write_n(&_cdcd_itf[itf].tx_ff, buffer, bufsize);
@@ -190,6 +172,11 @@ bool tud_cdc_n_write_flush (uint8_t itf)
190172
return true;
191173
}
192174

175+
uint32_t tud_cdc_n_write_available (uint8_t itf)
176+
{
177+
return tu_fifo_remaining(&_cdcd_itf[itf].tx_ff);
178+
}
179+
193180

194181
//--------------------------------------------------------------------+
195182
// USBD Driver API
@@ -300,7 +287,7 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t
300287

301288
// Invoked when class request DATA stage is finished.
302289
// return false to stall control endpoint (e.g Host send non-sense DATA)
303-
bool cdcd_control_request_complete(uint8_t rhport, tusb_control_request_t const * request)
290+
bool cdcd_control_complete(uint8_t rhport, tusb_control_request_t const * request)
304291
{
305292
(void) rhport;
306293

@@ -334,11 +321,11 @@ bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request
334321
switch ( request->bRequest )
335322
{
336323
case CDC_REQUEST_SET_LINE_CODING:
337-
usbd_control_xfer(rhport, request, &p_cdc->line_coding, sizeof(cdc_line_coding_t));
324+
tud_control_xfer(rhport, request, &p_cdc->line_coding, sizeof(cdc_line_coding_t));
338325
break;
339326

340327
case CDC_REQUEST_GET_LINE_CODING:
341-
usbd_control_xfer(rhport, request, &p_cdc->line_coding, sizeof(cdc_line_coding_t));
328+
tud_control_xfer(rhport, request, &p_cdc->line_coding, sizeof(cdc_line_coding_t));
342329
break;
343330

344331
case CDC_REQUEST_SET_CONTROL_LINE_STATE:
@@ -349,7 +336,7 @@ bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request
349336
// This signal corresponds to V.24 signal 105 and RS-232 signal RTS (Request to Send)
350337
p_cdc->line_state = (uint8_t) request->wValue;
351338

352-
usbd_control_status(rhport, request);
339+
tud_control_status(rhport, request);
353340

354341
// Invoke callback
355342
if ( tud_cdc_line_state_cb) tud_cdc_line_state_cb(itf, tu_bit_test(request->wValue, 0), tu_bit_test(request->wValue, 1));
@@ -370,7 +357,7 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
370357
uint8_t const itf = 0;
371358
cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
372359

373-
// receive new data
360+
// Received new data
374361
if ( ep_addr == p_cdc->ep_out )
375362
{
376363
for(uint32_t i=0; i<xferred_bytes; i++)
@@ -391,7 +378,9 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
391378
_prep_out_transaction(itf);
392379
}
393380

394-
// sent data
381+
// Data sent to host, we could continue to fetch data tx fifo to send.
382+
// But it will cause incorrect baudrate set in line coding.
383+
// Though maybe the baudrate is not really important !!!
395384
// if ( ep_addr == p_cdc->ep_in )
396385
// {
397386
//

cores/arduino/Adafruit_TinyUSB_Core/tinyusb/src/class/cdc/cdc_device.h

+62-39
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,42 @@
5151
// Application API (Multiple Interfaces)
5252
// CFG_TUD_CDC > 1
5353
//--------------------------------------------------------------------+
54-
bool tud_cdc_n_connected (uint8_t itf);
55-
uint8_t tud_cdc_n_get_line_state (uint8_t itf);
56-
void tud_cdc_n_get_line_coding (uint8_t itf, cdc_line_coding_t* coding);
57-
void tud_cdc_n_set_wanted_char (uint8_t itf, char wanted);
58-
59-
uint32_t tud_cdc_n_available (uint8_t itf);
60-
signed char tud_cdc_n_read_char (uint8_t itf);
61-
uint32_t tud_cdc_n_read (uint8_t itf, void* buffer, uint32_t bufsize);
62-
void tud_cdc_n_read_flush (uint8_t itf);
63-
signed char tud_cdc_n_peek (uint8_t itf, int pos);
64-
65-
uint32_t tud_cdc_n_write_char (uint8_t itf, char ch);
66-
uint32_t tud_cdc_n_write (uint8_t itf, void const* buffer, uint32_t bufsize);
67-
uint32_t tud_cdc_n_write_str (uint8_t itf, char const* str);
68-
bool tud_cdc_n_write_flush (uint8_t itf);
54+
bool tud_cdc_n_connected (uint8_t itf);
55+
uint8_t tud_cdc_n_get_line_state (uint8_t itf);
56+
void tud_cdc_n_get_line_coding (uint8_t itf, cdc_line_coding_t* coding);
57+
void tud_cdc_n_set_wanted_char (uint8_t itf, char wanted);
58+
59+
uint32_t tud_cdc_n_available (uint8_t itf);
60+
uint32_t tud_cdc_n_read (uint8_t itf, void* buffer, uint32_t bufsize);
61+
void tud_cdc_n_read_flush (uint8_t itf);
62+
bool tud_cdc_n_peek (uint8_t itf, int pos, uint8_t* u8);
63+
static inline int32_t tud_cdc_n_read_char (uint8_t itf);
64+
65+
uint32_t tud_cdc_n_write (uint8_t itf, void const* buffer, uint32_t bufsize);
66+
bool tud_cdc_n_write_flush (uint8_t itf);
67+
uint32_t tud_cdc_n_write_available (uint8_t itf);
68+
static inline uint32_t tud_cdc_n_write_char (uint8_t itf, char ch);
69+
static inline uint32_t tud_cdc_n_write_str (uint8_t itf, char const* str);
6970

7071
//--------------------------------------------------------------------+
7172
// Application API (Interface0)
7273
//--------------------------------------------------------------------+
73-
static inline bool tud_cdc_connected (void);
74-
static inline uint8_t tud_cdc_get_line_state (void);
75-
static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding);
76-
static inline void tud_cdc_set_wanted_char (char wanted);
77-
78-
static inline uint32_t tud_cdc_available (void);
79-
static inline signed char tud_cdc_read_char (void);
80-
static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize);
81-
static inline void tud_cdc_read_flush (void);
82-
static inline signed char tud_cdc_peek (int pos);
83-
84-
static inline uint32_t tud_cdc_write_char (char ch);
85-
static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize);
86-
static inline uint32_t tud_cdc_write_str (char const* str);
87-
static inline bool tud_cdc_write_flush (void);
74+
static inline bool tud_cdc_connected (void);
75+
static inline uint8_t tud_cdc_get_line_state (void);
76+
static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding);
77+
static inline void tud_cdc_set_wanted_char (char wanted);
78+
79+
static inline uint32_t tud_cdc_available (void);
80+
static inline int32_t tud_cdc_read_char (void);
81+
static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize);
82+
static inline void tud_cdc_read_flush (void);
83+
static inline bool tud_cdc_peek (int pos, uint8_t* u8);
84+
85+
static inline uint32_t tud_cdc_write_char (char ch);
86+
static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize);
87+
static inline uint32_t tud_cdc_write_str (char const* str);
88+
static inline bool tud_cdc_write_flush (void);
89+
static inline uint32_t tud_cdc_write_available (void);
8890

8991
//--------------------------------------------------------------------+
9092
// Application Callback API (weak is optional)
@@ -105,6 +107,22 @@ TU_ATTR_WEAK void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p
105107
//--------------------------------------------------------------------+
106108
// Inline Functions
107109
//--------------------------------------------------------------------+
110+
static inline int32_t tud_cdc_n_read_char (uint8_t itf)
111+
{
112+
uint8_t ch;
113+
return tud_cdc_n_read(itf, &ch, 1) ? (int32_t) ch : -1;
114+
}
115+
116+
static inline uint32_t tud_cdc_n_write_char(uint8_t itf, char ch)
117+
{
118+
return tud_cdc_n_write(itf, &ch, 1);
119+
}
120+
121+
static inline uint32_t tud_cdc_n_write_str (uint8_t itf, char const* str)
122+
{
123+
return tud_cdc_n_write(itf, str, strlen(str));
124+
}
125+
108126
static inline bool tud_cdc_connected (void)
109127
{
110128
return tud_cdc_n_connected(0);
@@ -130,7 +148,7 @@ static inline uint32_t tud_cdc_available (void)
130148
return tud_cdc_n_available(0);
131149
}
132150

133-
static inline signed char tud_cdc_read_char (void)
151+
static inline int32_t tud_cdc_read_char (void)
134152
{
135153
return tud_cdc_n_read_char(0);
136154
}
@@ -145,9 +163,9 @@ static inline void tud_cdc_read_flush (void)
145163
tud_cdc_n_read_flush(0);
146164
}
147165

148-
static inline signed char tud_cdc_peek (int pos)
166+
static inline bool tud_cdc_peek (int pos, uint8_t* u8)
149167
{
150-
return tud_cdc_n_peek(0, pos);
168+
return tud_cdc_n_peek(0, pos, u8);
151169
}
152170

153171
static inline uint32_t tud_cdc_write_char (char ch)
@@ -170,18 +188,23 @@ static inline bool tud_cdc_write_flush (void)
170188
return tud_cdc_n_write_flush(0);
171189
}
172190

191+
static inline uint32_t tud_cdc_write_available(void)
192+
{
193+
return tud_cdc_n_write_available(0);
194+
}
195+
173196
/** @} */
174197
/** @} */
175198

176199
//--------------------------------------------------------------------+
177200
// INTERNAL USBD-CLASS DRIVER API
178201
//--------------------------------------------------------------------+
179-
void cdcd_init (void);
180-
bool cdcd_open (uint8_t rhport, tusb_desc_interface_t const * p_interface_desc, uint16_t *p_length);
181-
bool cdcd_control_request (uint8_t rhport, tusb_control_request_t const * p_request);
182-
bool cdcd_control_request_complete (uint8_t rhport, tusb_control_request_t const * p_request);
183-
bool cdcd_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
184-
void cdcd_reset (uint8_t rhport);
202+
void cdcd_init (void);
203+
void cdcd_reset (uint8_t rhport);
204+
bool cdcd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t *p_length);
205+
bool cdcd_control_request (uint8_t rhport, tusb_control_request_t const * request);
206+
bool cdcd_control_complete (uint8_t rhport, tusb_control_request_t const * request);
207+
bool cdcd_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
185208

186209
#ifdef __cplusplus
187210
}

0 commit comments

Comments
 (0)