Skip to content

Commit f67f7b7

Browse files
authored
Merge pull request #313 from adafruit/develop
update tinyusb stack to support device vendor class + webusb
2 parents 393c83e + ebd624c commit f67f7b7

27 files changed

+827
-443
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,3 @@ The following libraries are used:
115115
- [tinyusb](https://github.com/hathach/tinyusb) as usb stack
116116
- [nrfx](https://github.com/NordicSemiconductor/nrfx) for peripherals driver
117117
- [littlefs](https://github.com/ARMmbed/littlefs) for internal file system
118-
- [fatfs by elm-chan](http://elm-chan.org/fsw/ff/00index_e.html) for external file system

cores/nRF5/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp

Lines changed: 2 additions & 1 deletion
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)

cores/nRF5/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +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
}
53-
size_t availableForWrite(void);
54+
size_t availableForWrite(void);
5455
operator bool();
5556
};
5657

cores/nRF5/Adafruit_TinyUSB_Core/Adafruit_USBD_Device.cpp

Lines changed: 7 additions & 5 deletions
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;

cores/nRF5/Adafruit_TinyUSB_Core/Adafruit_USBD_Device.h

Lines changed: 5 additions & 4 deletions
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/nRF5/Adafruit_TinyUSB_Core/tinyusb/src/class/cdc/cdc_device.c

Lines changed: 10 additions & 26 deletions
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-
int32_t tud_cdc_n_read_char(uint8_t itf)
125-
{
126-
unsigned 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-
int32_t 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-
unsigned 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);
@@ -305,7 +287,7 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t
305287

306288
// Invoked when class request DATA stage is finished.
307289
// return false to stall control endpoint (e.g Host send non-sense DATA)
308-
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)
309291
{
310292
(void) rhport;
311293

@@ -339,11 +321,11 @@ bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request
339321
switch ( request->bRequest )
340322
{
341323
case CDC_REQUEST_SET_LINE_CODING:
342-
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));
343325
break;
344326

345327
case CDC_REQUEST_GET_LINE_CODING:
346-
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));
347329
break;
348330

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

357-
usbd_control_status(rhport, request);
339+
tud_control_status(rhport, request);
358340

359341
// Invoke callback
360342
if ( tud_cdc_line_state_cb) tud_cdc_line_state_cb(itf, tu_bit_test(request->wValue, 0), tu_bit_test(request->wValue, 1));
@@ -375,7 +357,7 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
375357
uint8_t const itf = 0;
376358
cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
377359

378-
// receive new data
360+
// Received new data
379361
if ( ep_addr == p_cdc->ep_out )
380362
{
381363
for(uint32_t i=0; i<xferred_bytes; i++)
@@ -396,7 +378,9 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
396378
_prep_out_transaction(itf);
397379
}
398380

399-
// 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 !!!
400384
// if ( ep_addr == p_cdc->ep_in )
401385
// {
402386
//

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

Lines changed: 56 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -51,42 +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-
int32_t 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-
int32_t 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);
69-
uint32_t tud_cdc_n_write_available (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);
7070

7171
//--------------------------------------------------------------------+
7272
// Application API (Interface0)
7373
//--------------------------------------------------------------------+
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 int32_t tud_cdc_peek (int pos);
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);
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);
9090

9191
//--------------------------------------------------------------------+
9292
// Application Callback API (weak is optional)
@@ -107,6 +107,22 @@ TU_ATTR_WEAK void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p
107107
//--------------------------------------------------------------------+
108108
// Inline Functions
109109
//--------------------------------------------------------------------+
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+
110126
static inline bool tud_cdc_connected (void)
111127
{
112128
return tud_cdc_n_connected(0);
@@ -147,9 +163,9 @@ static inline void tud_cdc_read_flush (void)
147163
tud_cdc_n_read_flush(0);
148164
}
149165

150-
static inline int32_t tud_cdc_peek (int pos)
166+
static inline bool tud_cdc_peek (int pos, uint8_t* u8)
151167
{
152-
return tud_cdc_n_peek(0, pos);
168+
return tud_cdc_n_peek(0, pos, u8);
153169
}
154170

155171
static inline uint32_t tud_cdc_write_char (char ch)
@@ -183,12 +199,12 @@ static inline uint32_t tud_cdc_write_available(void)
183199
//--------------------------------------------------------------------+
184200
// INTERNAL USBD-CLASS DRIVER API
185201
//--------------------------------------------------------------------+
186-
void cdcd_init (void);
187-
bool cdcd_open (uint8_t rhport, tusb_desc_interface_t const * p_interface_desc, uint16_t *p_length);
188-
bool cdcd_control_request (uint8_t rhport, tusb_control_request_t const * p_request);
189-
bool cdcd_control_request_complete (uint8_t rhport, tusb_control_request_t const * p_request);
190-
bool cdcd_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
191-
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);
192208

193209
#ifdef __cplusplus
194210
}

0 commit comments

Comments
 (0)