It seem to me that the serialNumber port property reported by the serial-discovery tool is already sufficient for the purpose. As already pointed out by @Coding_Badly, unfortunately the ATmega32U4-based boards don't produce CDC serial port with a serial number (apparently because the chip itself doesn't provide one, unlike other AVRs). So what is needed is to be able to set the serial number to an arbitrary value. The same capability would be needed for any other arbitrary new property you might propose adding to serial-discovery so I don't see that a new property is needed when we already have one.
I was able to set an arbitrary serial number by modifying the core as described here:
--- a/MR_AVR_Arduino/avr/boards.txt
+++ b/MR_AVR_Arduino/avr/boards.txt
@@ -60,22 +60,7 @@ leonardo.build.extra_flags={build.usb_flags}
##############################################################
EU07_power_controller.name=EU07 power controller
-EU07_power_controller.vid.0=0x2341
-EU07_power_controller.pid.0=0x0036
-EU07_power_controller.vid.1=0x2341
-EU07_power_controller.pid.1=0x8036
-EU07_power_controller.vid.2=0x2A03
-EU07_power_controller.pid.2=0x0036
-EU07_power_controller.vid.3=0x2A03
-EU07_power_controller.pid.3=0x8036
-EU07_power_controller.upload_port.0.vid=0x2341
-EU07_power_controller.upload_port.0.pid=0x0036
-EU07_power_controller.upload_port.1.vid=0x2341
-EU07_power_controller.upload_port.1.pid=0x8036
-EU07_power_controller.upload_port.2.vid=0x2A03
-EU07_power_controller.upload_port.2.pid=0x0036
-EU07_power_controller.upload_port.3.vid=0x2A03
-EU07_power_controller.upload_port.3.pid=0x8036
+EU07_power_controller.upload_port.0.serialNumber=FOO
EU07_power_controller.upload_port.4.board=leonardo
EU07_power_controller.upload.tool=avrdude
@@ -101,8 +86,9 @@ EU07_power_controller.bootloader.lock_bits=0x2F
EU07_power_controller.build.mcu=atmega32u4
EU07_power_controller.build.f_cpu=16000000L
EU07_power_controller.build.vid=0x2341
-EU07_power_controller.build.pid=0x8036
+EU07_power_controller.build.pid=0xCAFE
EU07_power_controller.build.usb_product="EU07 power controller (MR)"
+EU07_power_controller.build.usb_serial_number="FOO"
EU07_power_controller.build.board=AVR_LEONARDO
EU07_power_controller.build.core=arduino
EU07_power_controller.build.variant=leonardo
--- a/MR_AVR_Arduino/avr/cores/arduino/USBCore.cpp
+++ b/MR_AVR_Arduino/avr/cores/arduino/USBCore.cpp
@@ -542,9 +542,13 @@ bool SendDescriptor(USBSetup& setup)
}
else if (setup.wValueL == ISERIAL) {
#ifdef PLUGGABLE_USB_ENABLED
+#ifdef USB_SERIAL_NUMBER
+ return USB_SendStringDescriptor((uint8_t*)USB_SERIAL_NUMBER, strlen(USB_SERIAL_qNUMBER) + 1, 0);
+#else // #ifdef USB_SERIAL_NUMBER
char name[ISERIAL_MAX_LEN];
PluggableUSB().getShortName(name);
return USB_SendStringDescriptor((uint8_t*)name, strlen(name), 0);
+#endif // #ifdef USB_SERIAL_NUMBER
#endif
}
else
--- a/MR_AVR_Arduino/avr/platform.txt
+++ b/MR_AVR_Arduino/avr/platform.txt
@@ -144,4 +144,4 @@ tools.arduino_ota.upload.pattern="{cmd}" -address {upload.port.address} -port {u
# Default blank usb manufacturer will be filled in at compile time
# - from numeric vendor ID, set to Unknown otherwise
build.usb_manufacturer="Unknown"
-build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}'
+build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' '-DUSB_SERIAL_NUMBER={build.usb_serial_number}'
The reason I changed the value of build.pid was to avoid the board also being identified as "Arduino Leonardo". The multiple identifications don't actually cause any problem, so that change is not required, but I thought they might make the demonstration more confusing.
I don't know if there is a better way of configuring an arbitrary serial number.
No, I think the pluggable discovery and port identification systems are flexible enough to accommodate use cases like this without any changes to the development tools.