aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-03-13 23:32:32 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-03-13 23:32:32 +0000
commit02dfd7dc3ddf5f485bdd47d45867fa58b569ca2f (patch)
tree822c3654d239e3f512f9539360cae2464c641f64
parenta7eca42996418a7fd87b3411deb368e41615f9a1 (diff)
downloadlufa-02dfd7dc3ddf5f485bdd47d45867fa58b569ca2f.tar.gz
lufa-02dfd7dc3ddf5f485bdd47d45867fa58b569ca2f.tar.bz2
lufa-02dfd7dc3ddf5f485bdd47d45867fa58b569ca2f.zip
Simplify the internal serial extraction routines for each architecture.
-rw-r--r--LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h18
-rw-r--r--LUFA/Drivers/USB/Core/DeviceStandardReq.c7
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Device_UC3.h22
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 dc8630257..f822d0ba5 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 a2270f4d2..2ac6c0a54 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 59897a769..8389d62dc 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