Skip to content

Commit f89b40e

Browse files
Various cleanups:
- remove HID support (keyboard/Mouse) - fix FskRadio::setSyncWord(); a length check was incorrect - rewrite USB/CDC support - rewrite USB/MSC support - remove USB/Class code - upgrade to the latest USB/Core code for L0 - remove dead code from stm32l0_adc.c / stm32l0_dac.c - move VREFINT locking into stm32l0_system_vrefint_enable() / stm32l0_system_vrefint_disable() to aoid late disable when entering STOP mode - fix UART disable (REACK/TEACK) - add async write for Uart/CDC again ... - add anlogWriteFrequency() - rework all analogRead() / analogWrite() APIs to use shifts intead of hokey scaling - generate/save *.hex files; rename *.dfu back into *.bin to not confuse innocent souls
1 parent c845a3b commit f89b40e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+6391
-8979
lines changed

boards.txt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ Grasshopper-L082CZ.menu.usb.cdc=Serial
4040
Grasshopper-L082CZ.menu.usb.cdc.build.usb_type=USB_TYPE_CDC
4141
Grasshopper-L082CZ.menu.usb.cdc_msc=Serial + Mass Storage
4242
Grasshopper-L082CZ.menu.usb.cdc_msc.build.usb_type=USB_TYPE_CDC_MSC
43-
Grasshopper-L082CZ.menu.usb.cdc_hid=Serial + Keyboard + Mouse
44-
Grasshopper-L082CZ.menu.usb.cdc_hid.build.usb_type=USB_TYPE_CDC_HID
45-
Grasshopper-L082CZ.menu.usb.cdc_msc_hid=Serial + Mass Storage + Keyboard + Mouse
46-
Grasshopper-L082CZ.menu.usb.cdc_msc_hid.build.usb_type=USB_TYPE_CDC_MSC_HID
4743
Grasshopper-L082CZ.menu.usb.none=No USB
4844
Grasshopper-L082CZ.menu.usb.none.build.usb_type=USB_TYPE_NONE
4945

@@ -113,10 +109,6 @@ Cricket-L082CZ.menu.usb.cdc=Serial
113109
Cricket-L082CZ.menu.usb.cdc.build.usb_type=USB_TYPE_CDC
114110
Cricket-L082CZ.menu.usb.cdc_msc=Serial + Mass Storage
115111
Cricket-L082CZ.menu.usb.cdc_msc.build.usb_type=USB_TYPE_CDC_MSC
116-
Cricket-L082CZ.menu.usb.cdc_hid=Serial + Keyboard + Mouse
117-
Cricket-L082CZ.menu.usb.cdc_hid.build.usb_type=USB_TYPE_CDC_HID
118-
Cricket-L082CZ.menu.usb.cdc_msc_hid=Serial + Mass Storage + Keyboard + Mouse
119-
Cricket-L082CZ.menu.usb.cdc_msc_hid.build.usb_type=USB_TYPE_CDC_MSC_HID
120112
Cricket-L082CZ.menu.usb.none=No USB
121113
Cricket-L082CZ.menu.usb.none.build.usb_type=USB_TYPE_NONE
122114

@@ -182,10 +174,6 @@ Cicada-L082CZ.menu.usb.cdc=Serial
182174
Cicada-L082CZ.menu.usb.cdc.build.usb_type=USB_TYPE_CDC
183175
Cicada-L082CZ.menu.usb.cdc_msc=Serial + Mass Storage
184176
Cicada-L082CZ.menu.usb.cdc_msc.build.usb_type=USB_TYPE_CDC_MSC
185-
Cicada-L082CZ.menu.usb.cdc_hid=Serial + Keyboard + Mouse
186-
Cicada-L082CZ.menu.usb.cdc_hid.build.usb_type=USB_TYPE_CDC_HID
187-
Cicada-L082CZ.menu.usb.cdc_msc_hid=Serial + Mass Storage + Keyboard + Mouse
188-
Cicada-L082CZ.menu.usb.cdc_msc_hid.build.usb_type=USB_TYPE_CDC_MSC_HID
189177
Cicada-L082CZ.menu.usb.none=No USB
190178
Cicada-L082CZ.menu.usb.none.build.usb_type=USB_TYPE_NONE
191179

@@ -250,8 +238,6 @@ Gnat-L082CZ.build.variant_system_include="-I{runtime.platform.path}/system/CMSIS
250238

251239
Gnat-L082CZ.menu.usb.cdc=Serial
252240
Gnat-L082CZ.menu.usb.cdc.build.usb_type=USB_TYPE_CDC
253-
Gnat-L082CZ.menu.usb.cdc_hid=Serial + Keyboard + Mouse
254-
Gnat-L082CZ.menu.usb.cdc_hid.build.usb_type=USB_TYPE_CDC_HID
255241
Gnat-L082CZ.menu.usb.none=No USB
256242
Gnat-L082CZ.menu.usb.none.build.usb_type=USB_TYPE_NONE
257243

cores/arduino/CDC.cpp

Lines changed: 133 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232

3333
#if defined(USBCON)
3434

35-
#define CDC_TX_PACKET_SIZE 64
36-
3735
stm32l0_usbd_cdc_t stm32l0_usbd_cdc;
3836

3937
extern int (*stm32l0_stdio_put)(char, FILE*);
@@ -60,6 +58,9 @@ CDC::CDC(struct _stm32l0_usbd_cdc_t *usbd_cdc, void (*serialEventRun)(void))
6058
_tx_count = 0;
6159
_tx_size = 0;
6260

61+
_tx_data2 = NULL;
62+
_tx_size2 = 0;
63+
6364
if (serialEventRun) {
6465
g_serialEventRun = serialEventRun;
6566
}
@@ -119,6 +120,10 @@ int CDC::availableForWrite(void)
119120
return 0;
120121
}
121122

123+
if (_tx_size2 != 0) {
124+
return 0;
125+
}
126+
122127
return CDC_TX_BUFFER_SIZE - _tx_count;
123128
}
124129

@@ -176,6 +181,16 @@ size_t CDC::write(const uint8_t *buffer, size_t size)
176181
return 0;
177182
}
178183

184+
if (_tx_size2 != 0) {
185+
if (_nonblocking || (__get_IPSR() != 0)) {
186+
return 0;
187+
}
188+
189+
while (_tx_size2 != 0) {
190+
__WFE();
191+
}
192+
}
193+
179194
count = 0;
180195

181196
while (count < size) {
@@ -195,7 +210,7 @@ size_t CDC::write(const uint8_t *buffer, size_t size)
195210
if (tx_size > (CDC_TX_BUFFER_SIZE - tx_read)) {
196211
tx_size = (CDC_TX_BUFFER_SIZE - tx_read);
197212
}
198-
213+
199214
if (tx_size > CDC_TX_PACKET_SIZE) {
200215
tx_size = CDC_TX_PACKET_SIZE;
201216
}
@@ -267,6 +282,52 @@ size_t CDC::write(const uint8_t *buffer, size_t size)
267282
return count;
268283
}
269284

285+
bool CDC::write(const uint8_t *buffer, size_t size, void(*callback)(void))
286+
{
287+
return write(buffer, size, Callback(callback));
288+
}
289+
290+
bool CDC::write(const uint8_t *buffer, size_t size, Callback callback)
291+
{
292+
if (!_enabled) {
293+
return false;
294+
}
295+
296+
if (size == 0) {
297+
return false;
298+
}
299+
300+
if (_tx_size2 != 0) {
301+
return false;
302+
}
303+
304+
_completionCallback = callback;
305+
306+
_tx_data2 = buffer;
307+
_tx_size2 = size;
308+
309+
if (!_tx_busy) {
310+
311+
_tx_busy = true;
312+
313+
if (!stm32l0_usbd_cdc_transmit(_usbd_cdc, _tx_data2, _tx_size2, (stm32l0_usbd_cdc_done_callback_t)CDC::_doneCallback, (void*)this)) {
314+
_tx_busy = false;
315+
316+
_tx_size2 = 0;
317+
_tx_data2 = NULL;
318+
319+
return false;
320+
}
321+
}
322+
323+
return true;
324+
}
325+
326+
bool CDC::done()
327+
{
328+
return (_tx_size2 == 0);
329+
}
330+
270331
void CDC::setNonBlocking(bool enabled)
271332
{
272333
_nonblocking = enabled;
@@ -294,37 +355,73 @@ void CDC::disableWakeup()
294355

295356
CDC::operator bool()
296357
{
297-
return (_enabled && (stm32l0_usbd_cdc_info.lineState & 1));
358+
return (_enabled && (stm32l0_usbd_cdc_line_state(_usbd_cdc) & USB_CDC_LINE_STATE_DTR));
298359
}
299360

300361
unsigned long CDC::baud()
301362
{
302-
return stm32l0_usbd_cdc_info.dwDTERate;
363+
stm32l0_usbd_cdc_line_coding_t line_coding;
364+
365+
if (_enabled)
366+
{
367+
stm32l0_usbd_cdc_line_coding(_usbd_cdc, &line_coding);
368+
369+
return line_coding.dwDTERate;
370+
}
371+
372+
return STM32L0_USBD_CDC_LINE_CODING_DTE_RATE;
303373
}
304374

305375
uint8_t CDC::stopbits()
306376
{
307-
return stm32l0_usbd_cdc_info.bCharFormat;
377+
stm32l0_usbd_cdc_line_coding_t line_coding;
378+
379+
if (_enabled)
380+
{
381+
stm32l0_usbd_cdc_line_coding(_usbd_cdc, &line_coding);
382+
383+
return line_coding.bCharFormat;
384+
}
385+
386+
return STM32L0_USBD_CDC_LINE_CODING_CHAR_FORMAT;
308387
}
309388

310389
uint8_t CDC::paritytype()
311390
{
312-
return stm32l0_usbd_cdc_info.bParityType;
391+
stm32l0_usbd_cdc_line_coding_t line_coding;
392+
393+
if (_enabled)
394+
{
395+
stm32l0_usbd_cdc_line_coding(_usbd_cdc, &line_coding);
396+
397+
return line_coding.bParityType;
398+
}
399+
400+
return STM32L0_USBD_CDC_LINE_CODING_PARITY_TYPE;
313401
}
314402

315403
uint8_t CDC::numbits()
316404
{
317-
return stm32l0_usbd_cdc_info.bDataBits;
405+
stm32l0_usbd_cdc_line_coding_t line_coding;
406+
407+
if (_enabled)
408+
{
409+
stm32l0_usbd_cdc_line_coding(_usbd_cdc, &line_coding);
410+
411+
return line_coding.bDataBits;
412+
}
413+
414+
return STM32L0_USBD_CDC_LINE_CODING_DATA_BITS;
318415
}
319416

320417
bool CDC::dtr()
321418
{
322-
return stm32l0_usbd_cdc_info.lineState & 1;
419+
return (_enabled && (stm32l0_usbd_cdc_line_state(_usbd_cdc) & USB_CDC_LINE_STATE_DTR));
323420
}
324421

325422
bool CDC::rts()
326423
{
327-
return stm32l0_usbd_cdc_info.lineState & 2;
424+
return (_enabled && (stm32l0_usbd_cdc_line_state(_usbd_cdc) & USB_CDC_LINE_STATE_RTS));
328425
}
329426

330427
void CDC::_eventCallback(class CDC *self, uint32_t events)
@@ -360,7 +457,7 @@ void CDC::_doneCallback(class CDC *self)
360457
if (tx_size > CDC_TX_PACKET_SIZE) {
361458
tx_size = CDC_TX_PACKET_SIZE;
362459
}
363-
460+
364461
self->_tx_size = tx_size;
365462
self->_tx_busy = true;
366463

@@ -370,8 +467,33 @@ void CDC::_doneCallback(class CDC *self)
370467
self->_tx_size = 0;
371468
self->_tx_count = 0;
372469
self->_tx_read = self->_tx_write;
470+
471+
if (self->_tx_size2 != 0) {
472+
self->_tx_size2 = 0;
473+
self->_tx_data2 = NULL;
474+
475+
self->_completionCallback.queue(self->_wakeup);
476+
}
477+
}
478+
} else {
479+
if (self->_tx_size2 != 0) {
480+
self->_tx_busy = true;
481+
482+
if (!stm32l0_usbd_cdc_transmit(self->_usbd_cdc, self->_tx_data2, self->_tx_size2, (stm32l0_usbd_cdc_done_callback_t)CDC::_doneCallback, (void*)self)) {
483+
self->_tx_busy = false;
484+
485+
self->_tx_size2 = 0;
486+
self->_tx_data2 = NULL;
487+
488+
self->_completionCallback.queue(self->_wakeup);
489+
}
373490
}
374491
}
492+
} else {
493+
self->_tx_size2 = 0;
494+
self->_tx_data2 = NULL;
495+
496+
self->_completionCallback.queue(self->_wakeup);
375497
}
376498
}
377499

0 commit comments

Comments
 (0)