Skip to content

Commit 775c82b

Browse files
committed
SAM: add iSerial USB field
1 parent b945df9 commit 775c82b

File tree

6 files changed

+34
-2
lines changed

6 files changed

+34
-2
lines changed

hardware/arduino/sam/cores/arduino/USB/PluggableUSB.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ int PluggableUSB_::getDescriptor(USBSetup& setup)
5252
return 0;
5353
}
5454

55+
void PluggableUSB_::getShortName(char *iSerialNum)
56+
{
57+
PluggableUSBModule* node;
58+
for (node = rootNode; node; node = node->next) {
59+
iSerialNum += node->getShortName(iSerialNum);
60+
}
61+
*iSerialNum = 0;
62+
}
63+
5564
bool PluggableUSB_::setup(USBSetup& setup)
5665
{
5766
PluggableUSBModule* node;

hardware/arduino/sam/cores/arduino/USB/PluggableUSB.h

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class PluggableUSBModule {
3535
virtual bool setup(USBSetup& setup) = 0;
3636
virtual int getInterface(uint8_t* interfaceCount) = 0;
3737
virtual int getDescriptor(USBSetup& setup) = 0;
38+
virtual uint8_t getShortName(char *name) { name[0] = 'A'+pluggedInterface; return 1; }
3839

3940
uint8_t pluggedInterface;
4041
uint8_t pluggedEndpoint;
@@ -55,6 +56,7 @@ class PluggableUSB_ {
5556
int getInterface(uint8_t* interfaceCount);
5657
int getDescriptor(USBSetup& setup);
5758
bool setup(USBSetup& setup);
59+
void getShortName(char *iSerialNum);
5860

5961
private:
6062
uint8_t lastIf;

hardware/arduino/sam/cores/arduino/USB/USBCore.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ const uint8_t STRING_MANUFACTURER[12] = USB_MANUFACTURER;
9696

9797
// DEVICE DESCRIPTOR
9898
const DeviceDescriptor USB_DeviceDescriptor =
99-
D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
99+
D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,ISERIAL,1);
100100

101101
const DeviceDescriptor USB_DeviceDescriptorA =
102-
D_DEVICE(0xEF,0x02,0x01,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1);
102+
D_DEVICE(0xEF,0x02,0x01,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,ISERIAL,1);
103103

104104
const QualifierDescriptor USB_DeviceQualifier =
105105
D_QUALIFIER(0x00,0x00,0x00,64,1);
@@ -429,6 +429,13 @@ static bool USBD_SendDescriptor(USBSetup& setup)
429429
else if (setup.wValueL == IMANUFACTURER) {
430430
return USB_SendStringDescriptor(STRING_MANUFACTURER, setup.wLength);
431431
}
432+
else if (setup.wValueL == ISERIAL) {
433+
#ifdef PLUGGABLE_USB_ENABLED
434+
char name[ISERIAL_MAX_LEN];
435+
PluggableUSB().getShortName(name);
436+
return USB_SendStringDescriptor((uint8_t*)name, setup.wLength);
437+
#endif
438+
}
432439
else {
433440
return false;
434441
}

hardware/arduino/sam/cores/arduino/USB/USBDesc.h

+3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@
4242
#define CDC_TX CDC_ENDPOINT_IN
4343
#endif
4444

45+
#define ISERIAL_MAX_LEN 20
46+
4547
#define IMANUFACTURER 1
4648
#define IPRODUCT 2
49+
#define ISERIAL 3
4750

4851
#endif /* __USBDESC_H__ */

hardware/arduino/sam/libraries/HID/HID.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ int HID_::getDescriptor(USBSetup& setup)
5757
return total;
5858
}
5959

60+
uint8_t HID_::getShortName(char *name)
61+
{
62+
name[0] = 'H';
63+
name[1] = 'I';
64+
name[2] = 'D';
65+
name[3] = 'A' + (descriptorSize & 0x0F);
66+
name[4] = 'A' + ((descriptorSize >> 4) & 0x0F);
67+
return 5;
68+
}
69+
6070
void HID_::AppendDescriptor(HIDSubDescriptor *node)
6171
{
6272
if (!rootNode) {

hardware/arduino/sam/libraries/HID/HID.h

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class HID_ : public PluggableUSBModule
9696
int getInterface(uint8_t* interfaceCount);
9797
int getDescriptor(USBSetup& setup);
9898
bool setup(USBSetup& setup);
99+
uint8_t getShortName(char* name);
99100

100101
private:
101102
uint32_t epType[1];

0 commit comments

Comments
 (0)