From a312db66433e08e07d6a717c011f6d43cb0b8bff Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Wed, 24 Apr 2013 17:29:58 +1000 Subject: [PATCH 1/3] boards.txt: Allow specification of build.usb_product & build.usb_manufacturer strings --- hardware/arduino/avr/boards.txt | 13 +++-- .../arduino/avr/cores/arduino/USBCore.cpp | 53 ++++++++++++------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/hardware/arduino/avr/boards.txt b/hardware/arduino/avr/boards.txt index 7d740bd2698..1e9a89a5aee 100644 --- a/hardware/arduino/avr/boards.txt +++ b/hardware/arduino/avr/boards.txt @@ -188,10 +188,11 @@ leonardo.build.mcu=atmega32u4 leonardo.build.f_cpu=16000000L leonardo.build.vid=0x2341 leonardo.build.pid=0x8036 +leonardo.build.usb_product='A','r','d','u','i','n','o',32,'L','e','o','n','a','r','d','o' leonardo.build.board=AVR_LEONARDO leonardo.build.core=arduino leonardo.build.variant=leonardo -leonardo.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} +leonardo.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} ############################################################## @@ -217,10 +218,11 @@ micro.build.mcu=atmega32u4 micro.build.f_cpu=16000000L micro.build.vid=0x2341 micro.build.pid=0x8037 +micro.build.usb_product='A','r','d','u','i','n','o',32,'M','i','c','r','o' micro.build.board=AVR_MICRO micro.build.core=arduino micro.build.variant=micro -micro.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} +micro.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} ############################################################## @@ -246,10 +248,11 @@ esplora.build.mcu=atmega32u4 esplora.build.f_cpu=16000000L esplora.build.vid=0x2341 esplora.build.pid=0x803c +esplora.build.usb_product='A','r','d','u','i','n','o',32,'E','s','p','l','o','r','a' esplora.build.board=AVR_ESPLORA esplora.build.core=arduino esplora.build.variant=leonardo -esplora.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} +esplora.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} ############################################################## @@ -407,15 +410,15 @@ LilyPadUSB.bootloader.extended_fuses=0xce LilyPadUSB.bootloader.file=caterina-LilyPadUSB/Caterina-LilyPadUSB.hex LilyPadUSB.bootloader.unlock_bits=0x3F LilyPadUSB.bootloader.lock_bits=0x2F - LilyPadUSB.build.mcu=atmega32u4 LilyPadUSB.build.f_cpu=8000000L LilyPadUSB.build.vid=0x1B4F LilyPadUSB.build.pid=0x9208 +LilyPadUSB.build.usb_product='L','i','l','y','P','a','d','U','S','B' LilyPadUSB.build.board=AVR_LILYPAD_USB LilyPadUSB.build.core=arduino LilyPadUSB.build.variant=leonardo -LilyPadUSB.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} +LilyPadUSB.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} ############################################################## diff --git a/hardware/arduino/avr/cores/arduino/USBCore.cpp b/hardware/arduino/avr/cores/arduino/USBCore.cpp index d3e01706567..721dc39efb0 100644 --- a/hardware/arduino/avr/cores/arduino/USBCore.cpp +++ b/hardware/arduino/avr/cores/arduino/USBCore.cpp @@ -49,31 +49,50 @@ const u16 STRING_LANGUAGE[2] = { 0x0409 // English }; -const u16 STRING_IPRODUCT[17] = { - (3<<8) | (2+2*16), -#if USB_PID == 0x8036 - 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' +/* + * Some gotchas when setting USB_MANUFACTURER & USB_PRODUCT from boards.txt: + * + * - Must be specified in the character format shown + * - Must not contain spaces, or spaces must be escaped as numeric 32 + * + * See provided boards.txt for examples. + */ + +#ifndef USB_PRODUCT +// Use a hardcoded product name +#if USB_PID == 0x8036 +#define USB_PRODUCT 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' #elif USB_PID == 0x8037 - 'A','r','d','u','i','n','o',' ','M','i','c','r','o',' ',' ',' ' +#define USB_PRODUCT 'A','r','d','u','i','n','o',' ','M','i','c','r','o' #elif USB_PID == 0x803C - 'A','r','d','u','i','n','o',' ','E','s','p','l','o','r','a',' ' +#define USB_PRODUCT 'A','r','d','u','i','n','o',' ','E','s','p','l','o','r','a' #elif USB_PID == 0x9208 - 'L','i','l','y','P','a','d','U','S','B',' ',' ',' ',' ',' ',' ' +#define USB_PRODUCT 'L','i','l','y','P','a','d','U','S','B' #else - 'U','S','B',' ','I','O',' ','B','o','a','r','d',' ',' ',' ',' ' +#define USB_PRODUCT 'U','S','B',' ','I','O',' ','B','o','a','r','d' #endif -}; +#endif + +static const u8 _IPRODUCT[] = { USB_PRODUCT }; +static const u8 _IPRODUCT_LEN = 2 + sizeof(_IPRODUCT)*2; +// Product name descriptor payload +const u16 STRING_IPRODUCT[_IPRODUCT_LEN] = { (3<<8) | _IPRODUCT_LEN, USB_PRODUCT }; -const u16 STRING_IMANUFACTURER[12] = { - (3<<8) | (2+2*11), #if USB_VID == 0x2341 - 'A','r','d','u','i','n','o',' ','L','L','C' +#define USB_MANUFACTURER 'A','r','d','u','i','n','o',' ','L','L','C' #elif USB_VID == 0x1b4f - 'S','p','a','r','k','F','u','n',' ',' ',' ' +#define USB_IMANUFACTUTER 'S','p','a','r','k','F','u','n' #else - 'U','n','k','n','o','w','n',' ',' ',' ',' ' +#ifndef USB_MANUFACTURER +// Fall through to unknown if no manufacturer name was provided in a macro +#define USB_MANUFACTURER 'U','n','k','n','o','w','n' #endif -}; +#endif + +static const u8 _IMANUFACTURER[] = { USB_MANUFACTURER }; +static const u8 _IMANUFACTURER_LEN = 2 + sizeof(_IMANUFACTURER)*2; +// Manufacturer name descriptor payload +const u16 STRING_IMANUFACTURER[_IMANUFACTURER_LEN] = { (3<<8) | _IMANUFACTURER_LEN, USB_MANUFACTURER }; #ifdef CDC_ENABLED #define DEVICE_CLASS 0x02 @@ -476,7 +495,6 @@ bool SendDescriptor(Setup& setup) return HID_GetDescriptor(t); #endif - u8 desc_length = 0; const u8* desc_addr = 0; if (USB_DEVICE_DESCRIPTOR_TYPE == t) { @@ -498,8 +516,7 @@ bool SendDescriptor(Setup& setup) if (desc_addr == 0) return false; - if (desc_length == 0) - desc_length = pgm_read_byte(desc_addr); + u8 desc_length = pgm_read_byte(desc_addr); USB_SendControl(TRANSFER_PGM,desc_addr,desc_length); return true; From 11f020e179854add35a0de854f70163a63012bdb Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Wed, 24 Apr 2013 17:31:05 +1000 Subject: [PATCH 2/3] USBCore: Remove redundant hardcoded product names (keep manufacturers) --- hardware/arduino/avr/cores/arduino/USBCore.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/hardware/arduino/avr/cores/arduino/USBCore.cpp b/hardware/arduino/avr/cores/arduino/USBCore.cpp index 721dc39efb0..c170ae82513 100644 --- a/hardware/arduino/avr/cores/arduino/USBCore.cpp +++ b/hardware/arduino/avr/cores/arduino/USBCore.cpp @@ -59,19 +59,8 @@ const u16 STRING_LANGUAGE[2] = { */ #ifndef USB_PRODUCT -// Use a hardcoded product name -#if USB_PID == 0x8036 -#define USB_PRODUCT 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' -#elif USB_PID == 0x8037 -#define USB_PRODUCT 'A','r','d','u','i','n','o',' ','M','i','c','r','o' -#elif USB_PID == 0x803C -#define USB_PRODUCT 'A','r','d','u','i','n','o',' ','E','s','p','l','o','r','a' -#elif USB_PID == 0x9208 -#define USB_PRODUCT 'L','i','l','y','P','a','d','U','S','B' -#else #define USB_PRODUCT 'U','S','B',' ','I','O',' ','B','o','a','r','d' #endif -#endif static const u8 _IPRODUCT[] = { USB_PRODUCT }; static const u8 _IPRODUCT_LEN = 2 + sizeof(_IPRODUCT)*2; From 5661089f1270f484e6611ea1e979d15fd56b0664 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Wed, 24 Apr 2013 17:49:24 +1000 Subject: [PATCH 3/3] boards.txt: Refactor the default usb build flags into a generic property in platform.txt --- hardware/arduino/avr/boards.txt | 8 ++++---- hardware/arduino/avr/platform.txt | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/hardware/arduino/avr/boards.txt b/hardware/arduino/avr/boards.txt index 1e9a89a5aee..2f0b4c8d7cc 100644 --- a/hardware/arduino/avr/boards.txt +++ b/hardware/arduino/avr/boards.txt @@ -192,7 +192,7 @@ leonardo.build.usb_product='A','r','d','u','i','n','o',32,'L','e','o','n','a','r leonardo.build.board=AVR_LEONARDO leonardo.build.core=arduino leonardo.build.variant=leonardo -leonardo.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} +leonardo.build.extra_flags={build.usb_flags} ############################################################## @@ -222,7 +222,7 @@ micro.build.usb_product='A','r','d','u','i','n','o',32,'M','i','c','r','o' micro.build.board=AVR_MICRO micro.build.core=arduino micro.build.variant=micro -micro.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} +micro.build.extra_flags={build.usb_flags} ############################################################## @@ -252,7 +252,7 @@ esplora.build.usb_product='A','r','d','u','i','n','o',32,'E','s','p','l','o','r' esplora.build.board=AVR_ESPLORA esplora.build.core=arduino esplora.build.variant=leonardo -esplora.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} +esplora.build.extra_flags={build.usb_flags} ############################################################## @@ -418,7 +418,7 @@ LilyPadUSB.build.usb_product='L','i','l','y','P','a','d','U','S','B' LilyPadUSB.build.board=AVR_LILYPAD_USB LilyPadUSB.build.core=arduino LilyPadUSB.build.variant=leonardo -LilyPadUSB.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product} +LilyPadUSB.build.extra_flags={build.usb_flags} ############################################################## diff --git a/hardware/arduino/avr/platform.txt b/hardware/arduino/avr/platform.txt index 6bbe078ab52..4957c7de516 100644 --- a/hardware/arduino/avr/platform.txt +++ b/hardware/arduino/avr/platform.txt @@ -83,3 +83,9 @@ tools.avrdude.bootloader.params.verbose=-v -v -v -v tools.avrdude.bootloader.params.quiet=-q -q tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.ide.path}/hardware/arduino/avr/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m + +# USB Default Flags +# Default blank usb manufacturer will be filled it at compile time +# - from numeric vendor ID, set to Unknown otherwise +build.usb_manufacturer= +build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} -DUSB_MANUFACTURER={build.usb_manufacturer} -DUSB_PRODUCT={build.usb_product}