Simplify the internal serial extraction routines for each architecture.

pull/1469/head
Dean Camera 14 years ago
parent a7eca42996
commit 02dfd7dc3d

@ -100,8 +100,15 @@
* number for the device. * number for the device.
*/ */
#define USE_INTERNAL_SERIAL 0xDC #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 #else
#define USE_INTERNAL_SERIAL NO_DESCRIPTOR #define USE_INTERNAL_SERIAL NO_DESCRIPTOR
#define INTERNAL_SERIAL_LENGTH_BITS 0
#endif #endif
/* Function Prototypes: */ /* Function Prototypes: */
@ -190,19 +197,14 @@
return (UDADDR & (1 << ADDEN)); 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) ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{ {
uint8_t SigReadAddress = 0x0E; 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); uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
if (SerialCharNum & 0x01) if (SerialCharNum & 0x01)
@ -217,8 +219,6 @@
(('A' - 10) + SerialByte) : ('0' + SerialByte)); (('A' - 10) + SerialByte) : ('0' + SerialByte));
} }
} }
return SerialCharNum;
} }
#endif #endif

@ -204,12 +204,13 @@ static void USB_Device_GetInternalSerialDescriptor(void)
struct struct
{ {
USB_Descriptor_Header_t Header; USB_Descriptor_Header_t Header;
uint16_t UnicodeString[20]; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4];
} SignatureDescriptor; } SignatureDescriptor;
SignatureDescriptor.Header.Type = DTYPE_String; SignatureDescriptor.Header.Type = DTYPE_String;
SignatureDescriptor.Header.Size = USB_STRING_LEN(USB_Device_GetSerialString(SignatureDescriptor.UnicodeString, SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4);
sizeof(SignatureDescriptor.UnicodeString) / sizeof(SignatureDescriptor.UnicodeString[0])));
USB_Device_GetSerialString(SignatureDescriptor.UnicodeString);
Endpoint_ClearSETUP(); Endpoint_ClearSETUP();

@ -90,8 +90,15 @@
* number for the device. * number for the device.
*/ */
#define USE_INTERNAL_SERIAL 0xDC #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 #else
#define USE_INTERNAL_SERIAL NO_DESCRIPTOR #define USE_INTERNAL_SERIAL NO_DESCRIPTOR
#define INTERNAL_SERIAL_LENGTH_BITS 0
#endif #endif
/* Function Prototypes: */ /* Function Prototypes: */
@ -178,19 +185,14 @@
return AVR32_USBB.UDCON.adden; 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) 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; uint8_t SerialByte = *SigReadAddress;
if (SerialCharNum & 0x01) if (SerialCharNum & 0x01)
@ -205,8 +207,6 @@
(('A' - 10) + SerialByte) : ('0' + SerialByte)); (('A' - 10) + SerialByte) : ('0' + SerialByte));
} }
} }
return SerialCharNum;
} }
#endif #endif

Loading…
Cancel
Save