Skip to content

Commit 730b86e

Browse files
committed
Improve CDC tunability
1 parent 87d7568 commit 730b86e

File tree

10 files changed

+119
-8
lines changed

10 files changed

+119
-8
lines changed

cores/arduino/CDC.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,74 @@
22

33
#ifdef SERIAL_CDC
44
USBSerial arduino::internal::_serial(false, BOARD_VENDORID, BOARD_PRODUCTID);
5+
6+
const uint8_t *USBCDC::device_desc()
7+
{
8+
uint8_t ep0_size = endpoint_max_packet_size(0x00);
9+
uint8_t device_descriptor_temp[] = {
10+
18, // bLength
11+
1, // bDescriptorType
12+
0x00, 0x02, // bcdUSB
13+
2, // bDeviceClass
14+
0, // bDeviceSubClass
15+
0, // bDeviceProtocol
16+
ep0_size, // bMaxPacketSize0
17+
(uint8_t)(LSB(vendor_id)), (uint8_t)(MSB(vendor_id)), // idVendor
18+
(uint8_t)(LSB(product_id)), (uint8_t)(MSB(product_id)),// idProduct
19+
0x00, 0x01, // bcdDevice
20+
1, // iManufacturer
21+
2, // iProduct
22+
3, // iSerialNumber
23+
1 // bNumConfigurations
24+
};
25+
MBED_ASSERT(sizeof(device_descriptor_temp) == sizeof(device_descriptor));
26+
memcpy(device_descriptor, device_descriptor_temp, sizeof(device_descriptor));
27+
return device_descriptor;
28+
}
29+
30+
const uint8_t *USBCDC::string_iinterface_desc()
31+
{
32+
static const uint8_t stringIinterfaceDescriptor[] = {
33+
0x08,
34+
STRING_DESCRIPTOR,
35+
'C', 0, 'D', 0, 'C', 0,
36+
};
37+
return stringIinterfaceDescriptor;
38+
}
39+
40+
const uint8_t *USBCDC::string_iproduct_desc()
41+
{
42+
static const uint8_t stringIproductDescriptor[] = {
43+
0x18,
44+
STRING_DESCRIPTOR,
45+
'N', 0, 'A', 0, 'N', 0, 'O', 0, ' ', 0, '3', 0, '3', 0, ' ', 0, 'B', 0, 'L', 0, 'E', 0
46+
};
47+
return stringIproductDescriptor;
48+
}
49+
50+
const uint8_t *USBDevice::string_imanufacturer_desc()
51+
{
52+
static const uint8_t string_imanufacturer_descriptor[] = {
53+
0x10, /*bLength*/
54+
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
55+
'A', 0, 'r', 0, 'd', 0, 'u', 0, 'i', 0, 'n', 0, 'o', 0, /*bString iManufacturer - Arduino*/
56+
};
57+
return string_imanufacturer_descriptor;
58+
}
59+
60+
#ifdef HAS_UNIQUE_ISERIAL_DESCRIPTOR
61+
62+
static uint8_t _internal_string_iserial_descriptor[34] = {
63+
0x2, /*bLength*/
64+
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/
65+
/*bString iSerial - memcpy at runtime*/
66+
};
67+
uint8_t *USBDevice::string_iserial_desc()
68+
{
69+
_internal_string_iserial_descriptor[0] += getUniqueSerialNumber(&_internal_string_iserial_descriptor[2]);
70+
71+
return _internal_string_iserial_descriptor;
72+
}
73+
#endif
74+
575
#endif

cores/arduino/CDC.h

+20-4
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,34 @@ class CDC : public HardwareSerial {
2626
void begin(unsigned long) {
2727
internal::_serial.connect();
2828
internal::_serial.attach(usbPortChanged);
29+
internal::_serial.attach(mbed::callback(this, &CDC::onInterrupt));
2930
}
3031
void begin(unsigned long baudrate, uint16_t config) {
3132
begin(baudrate);
3233
}
33-
void end() {}
34+
void end() {
35+
internal::_serial.deinit();
36+
}
3437
int available(void) {
35-
return internal::_serial.available();
38+
return rx_buffer.available();
3639
}
3740
int peek(void) {
38-
return 0;
41+
return rx_buffer.peek();
3942
}
4043
int read(void) {
41-
return internal::_serial._getc();
44+
return rx_buffer.read_char();
4245
}
4346
void flush(void) {}
4447
size_t write(uint8_t c) {
48+
if (!(internal::_serial.connected())) {
49+
return 0;
50+
}
4551
return internal::_serial._putc(c);
4652
}
4753
size_t write(const uint8_t* buf, size_t size) {
54+
if (!(internal::_serial.connected())) {
55+
return 0;
56+
}
4857
return internal::_serial.send((uint8_t*)buf, size);
4958
}
5059
using Print::write; // pull in write(str) and write(buf, size) from Print
@@ -54,6 +63,13 @@ class CDC : public HardwareSerial {
5463
USBSerial& mbed() {
5564
return internal::_serial;
5665
}
66+
private:
67+
RingBufferN<256> rx_buffer;
68+
void onInterrupt() {
69+
while (rx_buffer.availableForStore() && internal::_serial.available()) {
70+
rx_buffer.store_char(internal::_serial._getc());
71+
}
72+
}
5773
};
5874
}
5975

variants/ARDUINO_NANO33BLE/cflags.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
-fno-exceptions
1616
-fomit-frame-pointer
1717
-funsigned-char
18-
-g1
18+
-g
1919
-mcpu=cortex-m4
2020
-mfloat-abi=softfp
2121
-mfpu=fpv4-sp-d16

variants/ARDUINO_NANO33BLE/cxxflags.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
-fno-exceptions
1818
-fomit-frame-pointer
1919
-funsigned-char
20-
-g1
20+
-g
2121
-mcpu=cortex-m4
2222
-mfloat-abi=softfp
2323
-mfpu=fpv4-sp-d16

variants/ARDUINO_NANO33BLE/includes.txt

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
-iwithprefixbefore/mbed/rtos/TARGET_CORTEX
6767
-iwithprefixbefore/mbed/rtos
6868
-iwithprefixbefore/mbed/platform/internal
69+
-iwithprefixbefore/mbed/platform/cxxsupport
6970
-iwithprefixbefore/mbed/platform/TARGET_CORTEX_M
7071
-iwithprefixbefore/mbed/platform
7172
-iwithprefixbefore/mbed/hal/storage_abstraction
39.9 MB
Binary file not shown.

variants/ARDUINO_NANO33BLE/linker_script.ld

-2
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,11 @@ SECTIONS
6161
.ARM.extab :
6262
{
6363
*(.ARM.extab* .gnu.linkonce.armextab.*)
64-
. = ALIGN(8);
6564
} > FLASH
6665
__exidx_start = .;
6766
.ARM.exidx :
6867
{
6968
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
70-
. = ALIGN(8);
7169
} > FLASH
7270
__exidx_end = .;
7371
__etext = .;

variants/ARDUINO_NANO33BLE/mbed_config.h

+1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@
226226
#define MBED_CONF_QUECTEL_M26_PROVIDE_DEFAULT 0 // set by library:QUECTEL_M26
227227
#define MBED_CONF_QUECTEL_UG96_BAUDRATE 115200 // set by library:QUECTEL_UG96
228228
#define MBED_CONF_QUECTEL_UG96_PROVIDE_DEFAULT 0 // set by library:QUECTEL_UG96
229+
#define MBED_CONF_RTOS_API_PRESENT 1 // set by library:rtos-api
229230
#define MBED_CONF_RTOS_IDLE_THREAD_STACK_SIZE 512 // set by library:rtos
230231
#define MBED_CONF_RTOS_IDLE_THREAD_STACK_SIZE_DEBUG_EXTRA 0 // set by library:rtos
231232
#define MBED_CONF_RTOS_IDLE_THREAD_STACK_SIZE_TICKLESS_EXTRA 256 // set by library:rtos

variants/ARDUINO_NANO33BLE/pins_arduino.h

+2
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ static const uint8_t SCK = PIN_SPI_SCK;
116116
#define SERIAL1_RX (digitalPinToPinName(PIN_SERIAL_RX))
117117

118118
#define SERIAL_CDC 1
119+
#define HAS_UNIQUE_ISERIAL_DESCRIPTOR
119120
#define BOARD_VENDORID 0x2341
120121
#define BOARD_PRODUCTID 0x805a
121122

@@ -132,6 +133,7 @@ static const uint8_t SCK = PIN_SPI_SCK;
132133

133134
#define digitalPinToPort(P) (digitalPinToPinName(P)/32)
134135

136+
uint8_t getUniqueSerialNumber(uint8_t* name);
135137
void _ontouch1200bps_();
136138

137139
#endif //__PINS_ARDUINO__

variants/ARDUINO_NANO33BLE/variant.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,29 @@ void initVariant() {
8080
#include "CDC.h"
8181
CDC SerialUSB;
8282

83+
static void utox8(uint32_t val, uint8_t* s) {
84+
for (int i = 0; i < 16; i=i+2) {
85+
int d = val & 0XF;
86+
val = (val >> 4);
87+
88+
s[15 - i -1] = d > 9 ? 'A' + d - 10 : '0' + d;
89+
s[15 - i] = '\0';
90+
}
91+
}
92+
93+
uint8_t getUniqueSerialNumber(uint8_t* name) {
94+
#define SERIAL_NUMBER_WORD_0 NRF_FICR->DEVICEADDR[1]
95+
#define SERIAL_NUMBER_WORD_1 NRF_FICR->DEVICEADDR[0]
96+
97+
utox8(SERIAL_NUMBER_WORD_0, &name[0]);
98+
utox8(SERIAL_NUMBER_WORD_1, &name[16]);
99+
100+
name[30] = '\0';
101+
name[31] = '\0';
102+
103+
return 32;
104+
}
105+
83106
void _ontouch1200bps_() {
84107
__disable_irq();
85108
NRF_POWER->GPREGRET = DFU_MAGIC_SERIAL_ONLY_RESET;

0 commit comments

Comments
 (0)