diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp index 4ff6b9b42..a91a11db2 100644 --- a/cores/arduino/CDC.cpp +++ b/cores/arduino/CDC.cpp @@ -215,7 +215,17 @@ void Serial_::flush(void) size_t Serial_::write(uint8_t c) { - return write(&c, 1); + if (_usbLineInfo.lineState > 0) { + int r = USB_Send(CDC_TX,&c,1); + if (r > 0) { + return r; + } else { + setWriteError(); + return 0; + } + } + setWriteError(); + return 0; } size_t Serial_::write(const uint8_t *buffer, size_t size) @@ -257,7 +267,7 @@ Serial_::operator bool() { return result; } -unsigned long Serial_::baud() { +uint32_t Serial_::baud() { // Disable interrupts while reading a multi-byte value uint32_t baudrate; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index dc6bc387e..a2895f641 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -34,6 +34,7 @@ volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ extern const u16 STRING_LANGUAGE[] PROGMEM; extern const u8 STRING_PRODUCT[] PROGMEM; extern const u8 STRING_MANUFACTURER[] PROGMEM; +extern const u8 STRING_SERIAL[] PROGMEM; extern const DeviceDescriptor USB_DeviceDescriptorIAD PROGMEM; const u16 STRING_LANGUAGE[2] = { @@ -47,6 +48,8 @@ const u16 STRING_LANGUAGE[2] = { #endif const u8 STRING_PRODUCT[] PROGMEM = USB_PRODUCT; +u8 STRING_PRODUCT_LEN = strlen(USB_PRODUCT); +u8 const * STRING_PRODUCT_PTR = STRING_PRODUCT; #if USB_VID == 0x2341 # if defined(USB_MANUFACTURER) @@ -64,6 +67,14 @@ const u8 STRING_PRODUCT[] PROGMEM = USB_PRODUCT; #endif const u8 STRING_MANUFACTURER[] PROGMEM = USB_MANUFACTURER; +u8 STRING_MANUFACTURER_LEN = strlen(USB_MANUFACTURER); +u8 const * STRING_MANUFACTURER_PTR = STRING_MANUFACTURER; + +#define USB_SERIAL "" + +const u8 STRING_SERIAL[] PROGMEM = USB_SERIAL; +u8 STRING_SERIAL_LEN = strlen(USB_SERIAL); +u8 const * STRING_SERIAL_PTR = STRING_SERIAL; #define DEVICE_CLASS 0x02 @@ -336,9 +347,10 @@ u8 _initEndpoints[USB_ENDPOINTS] = // Following endpoints are automatically initialized to 0 }; +#define EP_SINGLE_16 0x12 #define EP_SINGLE_64 0x32 // EP0 #define EP_DOUBLE_64 0x36 // Other endpoints -#define EP_SINGLE_16 0x12 +#define EP_DOUBLE_128 0x46 // Other endpoints static void InitEP(u8 index, u8 type, u8 size) @@ -361,6 +373,8 @@ void InitEndpoints() UECFG1X = EP_SINGLE_16; #elif USB_EP_SIZE == 64 UECFG1X = EP_DOUBLE_64; +#elif USB_EP_SIZE == 128 + UECFG1X = EP_DOUBLE_128; #else #error Unsupported value for USB_EP_SIZE #endif @@ -519,15 +533,21 @@ bool SendDescriptor(USBSetup& setup) desc_addr = (const u8*)&STRING_LANGUAGE; } else if (setup.wValueL == IPRODUCT) { - return USB_SendStringDescriptor(STRING_PRODUCT, strlen(USB_PRODUCT), TRANSFER_PGM); + return USB_SendStringDescriptor(STRING_PRODUCT_PTR, STRING_PRODUCT_LEN, TRANSFER_PGM); } else if (setup.wValueL == IMANUFACTURER) { - return USB_SendStringDescriptor(STRING_MANUFACTURER, strlen(USB_MANUFACTURER), TRANSFER_PGM); + return USB_SendStringDescriptor(STRING_MANUFACTURER_PTR, STRING_MANUFACTURER_LEN, TRANSFER_PGM); } else if (setup.wValueL == ISERIAL) { #ifdef PLUGGABLE_USB_ENABLED char name[ISERIAL_MAX_LEN]; PluggableUSB().getShortName(name); + u8 strLen=strlen(name); + if(strLen==0){ +#endif + return USB_SendStringDescriptor(STRING_SERIAL_PTR, STRING_SERIAL_LEN, TRANSFER_PGM); +#ifdef PLUGGABLE_USB_ENABLED + } return USB_SendStringDescriptor((uint8_t*)name, strlen(name), 0); #endif } diff --git a/cores/arduino/USBCore.h b/cores/arduino/USBCore.h index 0c63c2b1f..566f395a7 100644 --- a/cores/arduino/USBCore.h +++ b/cores/arduino/USBCore.h @@ -18,6 +18,15 @@ #ifndef __USBCORE_H__ #define __USBCORE_H__ +extern u8 const * STRING_PRODUCT_PTR; +extern u8 STRING_PRODUCT_LEN; + +extern u8 const * STRING_MANUFACTURER_PTR; +extern u8 STRING_MANUFACTURER_LEN; + +extern u8 const * STRING_SERIAL_PTR; +extern u8 STRING_SERIAL_LEN; + #include "USBAPI.h" // Standard requests diff --git a/package.json b/package.json new file mode 100644 index 000000000..d88eddc24 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "framework-arduino-avr", + "version": "9005.1.0", + "description": "The official Arduino Wiring-based Framework for Microchip AVR microcontrollers", + "keywords": [ + "framework", + "arduino", + "microchip", + "avr" + ], + "homepage": "https://www.arduino.cc/reference/en", + "license": "LGPL-2.1-or-later", + "repository": { + "type": "git", + "url": "https://github.com/Technus/ArduinoCore-avr" + } +} diff --git a/variants/micro/pins_arduino.h b/variants/micro/pins_arduino.h index f83ef1f85..ff4bb4866 100644 --- a/variants/micro/pins_arduino.h +++ b/variants/micro/pins_arduino.h @@ -28,8 +28,8 @@ #undef RXLED1 #undef TX_RX_LED_INIT -#define TXLED0 PORTD &= ~(1<<5) -#define TXLED1 PORTD |= (1<<5) -#define RXLED0 PORTB &= ~(1<<0) -#define RXLED1 PORTB |= (1<<0) -#define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0), TXLED0, RXLED0 +#define TXLED0 PORTF &= ~(1<<1) +#define TXLED1 PORTF |= (1<<1) +#define RXLED0 PORTF &= ~(1<<0) +#define RXLED1 PORTF |= (1<<0) +#define TX_RX_LED_INIT DDRF |= (1<<0), DDRF |= (1<<1), TXLED0, RXLED0