Skip to content
Snippets Groups Projects
Commit 02dfd7dc authored by Dean Camera's avatar Dean Camera
Browse files

Simplify the internal serial extraction routines for each architecture.

parent a7eca429
Branches
Tags
No related merge requests found
......@@ -100,8 +100,15 @@
* 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: */
......@@ -190,19 +197,14 @@
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)
......@@ -217,8 +219,6 @@
(('A' - 10) + SerialByte) : ('0' + SerialByte));
}
}
return SerialCharNum;
}
#endif
......
......@@ -204,12 +204,13 @@ static void USB_Device_GetInternalSerialDescriptor(void)
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();
......
......@@ -90,8 +90,15 @@
* 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 120
#else
#define USE_INTERNAL_SERIAL NO_DESCRIPTOR
#define INTERNAL_SERIAL_LENGTH_BITS 0
#endif
/* Function Prototypes: */
......@@ -178,19 +185,14 @@
return AVR32_USBB.UDCON.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)
{
uint32_t* SigReadAddress = 0x80800204;
uint8_t* SigReadAddress = (uint8_t*)0x80800204;
for (SerialCharNum = 0; SerialCharNum < MIN(MaxLen, 30); SerialCharNum++)
for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
{
if (SerialCharNum == MaxLen)
break;
uint8_t SerialByte = *SigReadAddress;
if (SerialCharNum & 0x01)
......@@ -205,8 +207,6 @@
(('A' - 10) + SerialByte) : ('0' + SerialByte));
}
}
return SerialCharNum;
}
#endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment