@@ -133,34 +133,38 @@ int CDC::read()
133
133
134
134
size_t CDC::read (uint8_t *buffer, size_t size)
135
135
{
136
- unsigned int rx_read, rx_count;
137
- size_t count;
136
+ unsigned int rx_read, rx_count;
137
+ size_t count;
138
138
139
- count = 0 ;
139
+ count = 0 ;
140
140
141
- while (count < size) {
141
+ while (count < size) {
142
142
143
- rx_count = _rx_count;
143
+ rx_count = _rx_count;
144
144
145
- if (rx_count == 0 ) {
146
- break ;
147
- }
145
+ if (rx_count == 0 ) {
146
+ break ;
147
+ }
148
148
149
- rx_read = _rx_read;
149
+ rx_read = _rx_read;
150
150
151
- if (rx_count > (UART_RX_BUFFER_SIZE - rx_read)) {
152
- rx_count = (UART_RX_BUFFER_SIZE - rx_read);
153
- }
151
+ if (rx_count > (CDC_RX_BUFFER_SIZE - rx_read)) {
152
+ rx_count = (CDC_RX_BUFFER_SIZE - rx_read);
153
+ }
154
154
155
- memcpy (&buffer[count], &_rx_data[rx_read], rx_count);
156
- count += rx_count;
155
+ if (rx_count > (size - count)) {
156
+ rx_count = (size - count);
157
+ }
158
+
159
+ memcpy (&buffer[count], &_rx_data[rx_read], rx_count);
160
+ count += rx_count;
157
161
158
- _rx_read = (rx_read + rx_count) & (CDC_RX_BUFFER_SIZE -1 );
162
+ _rx_read = (rx_read + rx_count) & (CDC_RX_BUFFER_SIZE -1 );
159
163
160
- armv7m_atomic_sub (&_rx_count, rx_count);
161
- }
164
+ armv7m_atomic_sub (&_rx_count, rx_count);
165
+ }
162
166
163
- return count;
167
+ return count;
164
168
}
165
169
166
170
void CDC::flush ()
@@ -286,7 +290,7 @@ size_t CDC::write(const uint8_t *buffer, size_t size)
286
290
return count;
287
291
}
288
292
289
- void CDC::onReceive (void (*callback)(int ))
293
+ void CDC::onReceive (void (*callback)(void ))
290
294
{
291
295
_receiveCallback = callback;
292
296
}
@@ -308,42 +312,36 @@ void CDC::EventCallback(uint32_t events)
308
312
bool empty;
309
313
310
314
if (events & USBD_CDC_EVENT_RECEIVE) {
311
- while (_rx_count != CDC_RX_BUFFER_SIZE) {
312
- empty = (_rx_count == 0 );
313
-
314
- count = 0 ;
315
-
316
- do {
317
- rx_size = 0 ;
318
- rx_count = CDC_RX_BUFFER_SIZE - _rx_count;
315
+ empty = (_rx_count == 0 );
319
316
320
- if (rx_count == 0 ) {
321
- break ;
322
- }
323
-
324
- rx_write = _rx_write;
317
+ count = 0 ;
325
318
326
- if (rx_count > (CDC_RX_BUFFER_SIZE - rx_write)) {
327
- rx_count = (CDC_RX_BUFFER_SIZE - rx_write);
328
- }
329
-
330
- rx_size = stm32l4_usbd_cdc_receive (_usbd_cdc, &_rx_data[rx_write], rx_count);
331
-
332
- _rx_write = (rx_write + rx_size) & (CDC_RX_BUFFER_SIZE -1 );
333
-
334
- armv7m_atomic_add (&_rx_count, rx_size);
335
-
336
- count += rx_size;
337
-
338
- } while (rx_size);
339
-
340
- if (empty && _receiveCallback) {
341
- (*_receiveCallback)(count);
342
- }
343
-
344
- if (!rx_size) {
319
+ do {
320
+ rx_size = 0 ;
321
+ rx_count = CDC_RX_BUFFER_SIZE - _rx_count;
322
+
323
+ if (rx_count == 0 ) {
345
324
break ;
346
325
}
326
+
327
+ rx_write = _rx_write;
328
+
329
+ if (rx_count > (CDC_RX_BUFFER_SIZE - rx_write)) {
330
+ rx_count = (CDC_RX_BUFFER_SIZE - rx_write);
331
+ }
332
+
333
+ rx_size = stm32l4_usbd_cdc_receive (_usbd_cdc, &_rx_data[rx_write], rx_count);
334
+
335
+ _rx_write = (rx_write + rx_size) & (CDC_RX_BUFFER_SIZE -1 );
336
+
337
+ armv7m_atomic_add (&_rx_count, rx_size);
338
+
339
+ count += rx_size;
340
+
341
+ } while (rx_size);
342
+
343
+ if (empty && count && _receiveCallback) {
344
+ armv7m_pendsv_enqueue ((armv7m_pendsv_routine_t )_receiveCallback, NULL , 0 );
347
345
}
348
346
}
349
347
0 commit comments