From 02dfd7dc3ddf5f485bdd47d45867fa58b569ca2f Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 13 Mar 2011 23:32:32 +0000 Subject: [PATCH] Simplify the internal serial extraction routines for each architecture. --- LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h | 18 +++++++++--------- LUFA/Drivers/USB/Core/DeviceStandardReq.c | 7 ++++--- LUFA/Drivers/USB/Core/UC3/Device_UC3.h | 22 +++++++++++----------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h index dc8630257c..f822d0ba54 100644 --- a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h +++ b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h @@ -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 diff --git a/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/LUFA/Drivers/USB/Core/DeviceStandardReq.c index a2270f4d28..2ac6c0a542 100644 --- a/LUFA/Drivers/USB/Core/DeviceStandardReq.c +++ b/LUFA/Drivers/USB/Core/DeviceStandardReq.c @@ -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(); diff --git a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h index 59897a7696..8389d62dcb 100644 --- a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h +++ b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h @@ -90,9 +90,16 @@ * 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 - #endif + + #define INTERNAL_SERIAL_LENGTH_BITS 0 + #endif /* Function Prototypes: */ /** Sends a Remote Wakeup request to the host. This signals to the host that the device should @@ -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