@@ -133,34 +133,38 @@ int CDC::read()
133133
134134size_t CDC::read (uint8_t *buffer, size_t size)
135135{
136- unsigned int rx_read, rx_count;
137- size_t count;
136+ unsigned int rx_read, rx_count;
137+ size_t count;
138138
139- count = 0 ;
139+ count = 0 ;
140140
141- while (count < size) {
141+ while (count < size) {
142142
143- rx_count = _rx_count;
143+ rx_count = _rx_count;
144144
145- if (rx_count == 0 ) {
146- break ;
147- }
145+ if (rx_count == 0 ) {
146+ break ;
147+ }
148148
149- rx_read = _rx_read;
149+ rx_read = _rx_read;
150150
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+ }
154154
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;
157161
158- _rx_read = (rx_read + rx_count) & (CDC_RX_BUFFER_SIZE -1 );
162+ _rx_read = (rx_read + rx_count) & (CDC_RX_BUFFER_SIZE -1 );
159163
160- armv7m_atomic_sub (&_rx_count, rx_count);
161- }
164+ armv7m_atomic_sub (&_rx_count, rx_count);
165+ }
162166
163- return count;
167+ return count;
164168}
165169
166170void CDC::flush ()
@@ -286,7 +290,7 @@ size_t CDC::write(const uint8_t *buffer, size_t size)
286290 return count;
287291}
288292
289- void CDC::onReceive (void (*callback)(int ))
293+ void CDC::onReceive (void (*callback)(void ))
290294{
291295 _receiveCallback = callback;
292296}
@@ -308,42 +312,36 @@ void CDC::EventCallback(uint32_t events)
308312 bool empty;
309313
310314 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 );
319316
320- if (rx_count == 0 ) {
321- break ;
322- }
323-
324- rx_write = _rx_write;
317+ count = 0 ;
325318
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 ) {
345324 break ;
346325 }
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 );
347345 }
348346 }
349347
0 commit comments