diff --git a/cores/arduino/USB/PluggableUSB.cpp b/cores/arduino/USB/PluggableUSB.cpp index 0f2d08c0d8d49efb5b0631e63ce5f2b446b1b6a2..4c52c1fad7434b49beb524f0884ee8d15543598f 100644 --- a/cores/arduino/USB/PluggableUSB.cpp +++ b/cores/arduino/USB/PluggableUSB.cpp @@ -52,6 +52,15 @@ int PluggableUSB_::getDescriptor(USBSetup& setup) return 0; } +void PluggableUSB_::getShortName(char *iSerialNum) +{ + PluggableUSBModule* node; + for (node = rootNode; node; node = node->next) { + iSerialNum += node->getShortName(iSerialNum); + } + *iSerialNum = 0; +} + bool PluggableUSB_::setup(USBSetup& setup) { PluggableUSBModule* node; diff --git a/cores/arduino/USB/PluggableUSB.h b/cores/arduino/USB/PluggableUSB.h index eb18ca2537a030e09186a47b57b6f39e7a6365b5..4e08e5dfcb5a78dd58cf198480d19d0a27e2669f 100644 --- a/cores/arduino/USB/PluggableUSB.h +++ b/cores/arduino/USB/PluggableUSB.h @@ -35,6 +35,7 @@ protected: virtual bool setup(USBSetup& setup) = 0; virtual int getInterface(uint8_t* interfaceCount) = 0; virtual int getDescriptor(USBSetup& setup) = 0; + virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; } uint8_t pluggedInterface; uint8_t pluggedEndpoint; @@ -55,6 +56,7 @@ public: int getInterface(uint8_t* interfaceCount); int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); + void getShortName(char *iSerialNum); private: uint8_t lastIf; diff --git a/cores/arduino/USB/USBCore.cpp b/cores/arduino/USB/USBCore.cpp index a584a638e6e15026fbccea3b8f10ac00be08f4cf..9642c2aadc80b0a2a02b55fe5c7166f88dc7989a 100644 --- a/cores/arduino/USB/USBCore.cpp +++ b/cores/arduino/USB/USBCore.cpp @@ -66,8 +66,8 @@ const uint8_t STRING_MANUFACTURER[] = USB_MANUFACTURER; // DEVICE DESCRIPTOR -const DeviceDescriptor USB_DeviceDescriptorB = D_DEVICE(0xEF, 0x02, 0x01, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, 0, 1); -const DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00, 0x00, 0x00, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, 0, 1); +const DeviceDescriptor USB_DeviceDescriptorB = D_DEVICE(0xEF, 0x02, 0x01, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, ISERIAL, 1); +const DeviceDescriptor USB_DeviceDescriptor = D_DEVICE(0x00, 0x00, 0x00, 64, USB_VID, USB_PID, 0x100, IMANUFACTURER, IPRODUCT, ISERIAL, 1); //================================================================== @@ -208,6 +208,13 @@ bool USBDeviceClass::sendDescriptor(USBSetup &setup) else if (setup.wValueL == IMANUFACTURER) { return sendStringDescriptor(STRING_MANUFACTURER, setup.wLength); } + else if (setup.wValueL == ISERIAL) { +#ifdef PLUGGABLE_USB_ENABLED + char name[ISERIAL_MAX_LEN]; + PluggableUSB().getShortName(name); + return sendStringDescriptor((uint8_t*)name, setup.wLength); +#endif + } else { return false; } diff --git a/cores/arduino/USB/USBDesc.h b/cores/arduino/USB/USBDesc.h index 2282a71820d86f1b3201e36d721dc146a4996d05..e4335aa911655ddf4e15760d155519867d7189ae 100644 --- a/cores/arduino/USB/USBDesc.h +++ b/cores/arduino/USB/USBDesc.h @@ -41,8 +41,11 @@ #define CDC_TX CDC_ENDPOINT_IN #endif +#define ISERIAL_MAX_LEN 20 + // Defined string description #define IMANUFACTURER 1 -#define IPRODUCT 2 +#define IPRODUCT 2 +#define ISERIAL 3 #endif /* __USBDESC_H__ */ diff --git a/libraries/HID/HID.cpp b/libraries/HID/HID.cpp index 94bf9f5985e3743967f68c2150f65a1d3c10e762..34995fe67881168f3bf973df0e378e7924c74ca4 100644 --- a/libraries/HID/HID.cpp +++ b/libraries/HID/HID.cpp @@ -60,6 +60,16 @@ int HID_::getDescriptor(USBSetup& setup) return total; } +uint8_t HID_::getShortName(char *name) +{ + name[0] = 'H'; + name[1] = 'I'; + name[2] = 'D'; + name[3] = 'A' + (descriptorSize & 0x0F); + name[4] = 'A' + ((descriptorSize >> 4) & 0x0F); + return 5; +} + void HID_::AppendDescriptor(HIDSubDescriptor *node) { if (!rootNode) { diff --git a/libraries/HID/HID.h b/libraries/HID/HID.h index e5dfa3395322c330550bf51ecedc4f6b229118d1..9499b726c0b1763317c64b473c6a894c543628fb 100644 --- a/libraries/HID/HID.h +++ b/libraries/HID/HID.h @@ -96,6 +96,7 @@ protected: int getInterface(uint8_t* interfaceCount); int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); + uint8_t getShortName(char* name); private: uint32_t epType[1];