Skip to content

Commit 595aa2c

Browse files
authored
Merge pull request arduino#115 from hathach/adafruit-tinyusb
minor enhancement for usb cdc
2 parents 212c192 + 217fe38 commit 595aa2c

File tree

8 files changed

+58
-57
lines changed

8 files changed

+58
-57
lines changed

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_TinyUSB_Core.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,17 @@ void Adafruit_TinyUSB_Core_touch1200(void)
130130
initiateReset(250);
131131
}
132132

133+
134+
extern "C"
135+
{
136+
137+
void yield(void)
138+
139+
{
140+
tud_task();
141+
tud_cdc_write_flush();
142+
}
143+
144+
}
145+
133146
#endif // USE_TINYUSB

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,13 @@ void Adafruit_USBD_CDC::end(void)
6464

6565
Adafruit_USBD_CDC::operator bool()
6666
{
67-
return tud_cdc_connected();
67+
bool ret = tud_cdc_connected();
68+
69+
// Add an yield to run usb background in case sketch block wait as follows
70+
// while(!Serial) {}
71+
if ( !ret ) yield();
72+
73+
return ret;
6874
}
6975

7076
int Adafruit_USBD_CDC::available(void)
@@ -82,11 +88,6 @@ int Adafruit_USBD_CDC::read(void)
8288
return (int) tud_cdc_read_char();
8389
}
8490

85-
size_t Adafruit_USBD_CDC::readBytes(char *buffer, size_t length)
86-
{
87-
return tud_cdc_read(buffer, length);
88-
}
89-
9091
void Adafruit_USBD_CDC::flush(void)
9192
{
9293
tud_cdc_write_flush();

cores/arduino/Adafruit_TinyUSB_Core/Adafruit_USBD_CDC.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@ class Adafruit_USBD_CDC : public Stream, Adafruit_USBD_Interface
5151
return write((const uint8_t *)buffer, size);
5252
}
5353
operator bool();
54-
55-
size_t readBytes(char *buffer, size_t length);
56-
size_t readBytes(uint8_t *buffer, size_t length) { return readBytes((char *)buffer, length); }
5754
};
5855

5956
extern Adafruit_USBD_CDC Serial;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ uint32_t tud_cdc_n_available(uint8_t itf)
126126
return tu_fifo_count(&_cdcd_itf[itf].rx_ff);
127127
}
128128

129-
char tud_cdc_n_read_char(uint8_t itf)
129+
signed char tud_cdc_n_read_char(uint8_t itf)
130130
{
131-
char ch;
131+
signed char ch;
132132
return tud_cdc_n_read(itf, &ch, 1) ? ch : (-1);
133133
}
134134

@@ -139,9 +139,9 @@ uint32_t tud_cdc_n_read(uint8_t itf, void* buffer, uint32_t bufsize)
139139
return num_read;
140140
}
141141

142-
char tud_cdc_n_peek(uint8_t itf, int pos)
142+
signed char tud_cdc_n_peek(uint8_t itf, int pos)
143143
{
144-
char ch;
144+
signed char ch;
145145
return tu_fifo_peek_at(&_cdcd_itf[itf].rx_ff, pos, &ch) ? ch : (-1);
146146
}
147147

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

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,40 @@
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-
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-
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+
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);
6969

7070
//--------------------------------------------------------------------+
7171
// APPLICATION API (Interface0)
7272
//--------------------------------------------------------------------+
73-
static inline bool tud_cdc_connected (void) { return tud_cdc_n_connected(0); }
74-
static inline uint8_t tud_cdc_get_line_state (void) { return tud_cdc_n_get_line_state(0); }
75-
static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding) { return tud_cdc_n_get_line_coding(0, coding);}
76-
static inline void tud_cdc_set_wanted_char (char wanted) { tud_cdc_n_set_wanted_char(0, wanted); }
77-
78-
static inline uint32_t tud_cdc_available (void) { return tud_cdc_n_available(0); }
79-
static inline char tud_cdc_read_char (void) { return tud_cdc_n_read_char(0); }
80-
static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize) { return tud_cdc_n_read(0, buffer, bufsize); }
81-
static inline void tud_cdc_read_flush (void) { tud_cdc_n_read_flush(0); }
82-
static inline char tud_cdc_peek (int pos) { return tud_cdc_n_peek(0, pos); }
83-
84-
static inline uint32_t tud_cdc_write_char (char ch) { return tud_cdc_n_write_char(0, ch); }
85-
static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize) { return tud_cdc_n_write(0, buffer, bufsize); }
86-
static inline uint32_t tud_cdc_write_str (char const* str) { return tud_cdc_n_write_str(0, str); }
87-
static inline bool tud_cdc_write_flush (void) { return tud_cdc_n_write_flush(0); }
73+
static inline bool tud_cdc_connected (void) { return tud_cdc_n_connected(0); }
74+
static inline uint8_t tud_cdc_get_line_state (void) { return tud_cdc_n_get_line_state(0); }
75+
static inline void tud_cdc_get_line_coding (cdc_line_coding_t* coding) { return tud_cdc_n_get_line_coding(0, coding);}
76+
static inline void tud_cdc_set_wanted_char (char wanted) { tud_cdc_n_set_wanted_char(0, wanted); }
77+
78+
static inline uint32_t tud_cdc_available (void) { return tud_cdc_n_available(0); }
79+
static inline signed char tud_cdc_read_char (void) { return tud_cdc_n_read_char(0); }
80+
static inline uint32_t tud_cdc_read (void* buffer, uint32_t bufsize) { return tud_cdc_n_read(0, buffer, bufsize); }
81+
static inline void tud_cdc_read_flush (void) { tud_cdc_n_read_flush(0); }
82+
static inline signed char tud_cdc_peek (int pos) { return tud_cdc_n_peek(0, pos); }
83+
84+
static inline uint32_t tud_cdc_write_char (char ch) { return tud_cdc_n_write_char(0, ch); }
85+
static inline uint32_t tud_cdc_write (void const* buffer, uint32_t bufsize) { return tud_cdc_n_write(0, buffer, bufsize); }
86+
static inline uint32_t tud_cdc_write_str (char const* str) { return tud_cdc_n_write_str(0, str); }
87+
static inline bool tud_cdc_write_flush (void) { return tud_cdc_n_write_flush(0); }
8888

8989
//--------------------------------------------------------------------+
9090
// APPLICATION CALLBACK API (WEAK is optional)

cores/arduino/Stream.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ int Stream::timedRead()
3535
do {
3636
c = read();
3737
if (c >= 0) return c;
38+
yield(); // running TinyUSB task
3839
} while(millis() - _startMillis < _timeout);
3940
return -1; // -1 indicates timeout
4041
}
@@ -47,6 +48,7 @@ int Stream::timedPeek()
4748
do {
4849
c = peek();
4950
if (c >= 0) return c;
51+
yield(); // running TinyUSB task
5052
} while(millis() - _startMillis < _timeout);
5153
return -1; // -1 indicates timeout
5254
}

cores/arduino/hooks.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
static void __empty() {
2929
// Empty
3030
}
31+
3132
void yield(void) __attribute__ ((weak, alias("__empty")));
3233

3334
/**

cores/arduino/main.cpp

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,10 @@ int main( void )
5252
for (;;)
5353
{
5454
loop();
55-
56-
#ifdef USE_TINYUSB
57-
tud_task();
58-
tud_cdc_write_flush();
59-
#endif
55+
yield(); // yield run usb background task
6056

6157
if (serialEventRun) serialEventRun();
6258
}
6359

6460
return 0;
6561
}
66-
67-
#ifdef USE_TINYUSB
68-
void yield(void)
69-
{
70-
tud_task();
71-
tud_cdc_write_flush();
72-
}
73-
#endif
74-

0 commit comments

Comments
 (0)