Simplify the internal serial extraction routines for each architecture.
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 13 Mar 2011 23:32:32 +0000 (23:32 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 13 Mar 2011 23:32:32 +0000 (23:32 +0000)
LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
LUFA/Drivers/USB/Core/DeviceStandardReq.c
LUFA/Drivers/USB/Core/UC3/Device_UC3.h

index dc86302..f822d0b 100644 (file)
                                 *  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
index a2270f4..2ac6c0a 100644 (file)
@@ -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();
 
index 59897a7..8389d62 100644 (file)
                                 *  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