* number for the device.
*/
#define USE_INTERNAL_SERIAL 0xDC
+
+ /** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
+ * model.
+ */
+ #define INTERNAL_SERIAL_LENGTH_BITS 80
#else
#define USE_INTERNAL_SERIAL NO_DESCRIPTOR
+
+ #define INTERNAL_SERIAL_LENGTH_BITS 0
#endif
/* Function Prototypes: */
return (UDADDR & (1 << ADDEN));
}
- static inline uint8_t USB_Device_GetSerialString(uint16_t* UnicodeString, const uint8_t MaxLen)
+ static inline void USB_Device_GetSerialString(uint16_t* UnicodeString)
{
- uint8_t SerialCharNum = 0;
-
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
uint8_t SigReadAddress = 0x0E;
- for (SerialCharNum = 0; SerialCharNum < MIN(MaxLen, 20); SerialCharNum++)
+ for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BYTES * 2); SerialCharNum++)
{
- if (SerialCharNum == MaxLen)
- break;
-
uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
if (SerialCharNum & 0x01)
(('A' - 10) + SerialByte) : ('0' + SerialByte));
}
}
-
- return SerialCharNum;
}
#endif
struct
{
USB_Descriptor_Header_t Header;
- uint16_t UnicodeString[20];
+ uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4];
} SignatureDescriptor;
SignatureDescriptor.Header.Type = DTYPE_String;
- SignatureDescriptor.Header.Size = USB_STRING_LEN(USB_Device_GetSerialString(SignatureDescriptor.UnicodeString,
- sizeof(SignatureDescriptor.UnicodeString) / sizeof(SignatureDescriptor.UnicodeString[0])));
+ SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4);
+
+ USB_Device_GetSerialString(SignatureDescriptor.UnicodeString);
Endpoint_ClearSETUP();
* number for the device.\r
*/\r
#define USE_INTERNAL_SERIAL 0xDC\r
+ \r
+ /** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller\r
+ * model.\r
+ */\r
+ #define INTERNAL_SERIAL_LENGTH_BITS 120\r
#else\r
#define USE_INTERNAL_SERIAL NO_DESCRIPTOR\r
- #endif \r
+\r
+ #define INTERNAL_SERIAL_LENGTH_BITS 0\r
+ #endif\r
\r
/* Function Prototypes: */\r
/** Sends a Remote Wakeup request to the host. This signals to the host that the device should\r
return AVR32_USBB.UDCON.adden;\r
}\r
\r
- static inline uint8_t USB_Device_GetSerialString(uint16_t* UnicodeString, const uint8_t MaxLen)\r
+ static inline void USB_Device_GetSerialString(uint16_t* UnicodeString)\r
{\r
- uint8_t SerialCharNum = 0;\r
-\r
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)\r
{\r
- uint32_t* SigReadAddress = 0x80800204;\r
+ uint8_t* SigReadAddress = (uint8_t*)0x80800204;\r
\r
- for (SerialCharNum = 0; SerialCharNum < MIN(MaxLen, 30); SerialCharNum++)\r
+ for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)\r
{\r
- if (SerialCharNum == MaxLen)\r
- break;\r
-\r
uint8_t SerialByte = *SigReadAddress;\r
\r
if (SerialCharNum & 0x01)\r
(('A' - 10) + SerialByte) : ('0' + SerialByte));\r
}\r
}\r
- \r
- return SerialCharNum;\r
}\r
#endif\r
\r