Added new USE_INTERNAL_SERIAL define for using the unique serial numbers in some AVR models as the USB device's serial number, added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code. Updated Mass Storage and CDC based demos to use the new device serial number if the device it is compiled for supports it.

pull/1469/head
Dean Camera 16 years ago
parent 9d506553aa
commit 730624f745

@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.ManufacturerStrIndex = 0x01, .ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02, .ProductStrIndex = 0x02,
.SerialNumStrIndex = NO_DESCRIPTOR, .SerialNumStrIndex = USE_INTERNAL_SERIAL,
.NumberOfConfigurations = 1 .NumberOfConfigurations = 1
}; };

@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.ManufacturerStrIndex = 0x01, .ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02, .ProductStrIndex = 0x02,
.SerialNumStrIndex = NO_DESCRIPTOR, .SerialNumStrIndex = USE_INTERNAL_SERIAL,
.NumberOfConfigurations = 1 .NumberOfConfigurations = 1
}; };

@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.ManufacturerStrIndex = 0x01, .ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02, .ProductStrIndex = 0x02,
.SerialNumStrIndex = 0x03, .SerialNumStrIndex = USE_INTERNAL_SERIAL,
.NumberOfConfigurations = 1 .NumberOfConfigurations = 1
}; };
@ -156,20 +156,6 @@ USB_Descriptor_String_t PROGMEM ProductString =
.UnicodeString = L"LUFA Mass Storage Demo" .UnicodeString = L"LUFA Mass Storage Demo"
}; };
/** Serial number descriptor string. This is a Unicode string containing a string of HEX characters at least 12
* digits in length to uniquely identify a device when concatenated with the device's Vendor and Product IDs. By
* using the unique serial number string to identify a device, the device drivers do not need to be reinstalled
* each time the device is inserted into a different USB port on the same system. <b>This should be unique between
* devices, or conflicts will occur if two devices sharing the same serial number are inserted into the same system
* at the same time.</b>
*/
USB_Descriptor_String_t PROGMEM SerialNumberString =
{
.Header = {.Size = USB_STRING_LEN(12), .Type = DTYPE_String},
.UnicodeString = L"000000000000"
};
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
* documentation) by the application code so that the address and size of a requested descriptor can be given * documentation) by the application code so that the address and size of a requested descriptor can be given
* to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
@ -209,10 +195,6 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex,
Address = (void*)&ProductString; Address = (void*)&ProductString;
Size = pgm_read_byte(&ProductString.Header.Size); Size = pgm_read_byte(&ProductString.Header.Size);
break; break;
case 0x03:
Address = (void*)&SerialNumberString;
Size = pgm_read_byte(&SerialNumberString.Header.Size);
break;
} }
break; break;

@ -59,7 +59,7 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.ManufacturerStrIndex = 0x01, .ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02, .ProductStrIndex = 0x02,
.SerialNumStrIndex = NO_DESCRIPTOR, .SerialNumStrIndex = USE_INTERNAL_SERIAL,
.NumberOfConfigurations = 1 .NumberOfConfigurations = 1
}; };

@ -75,6 +75,21 @@
*/ */
#define NO_DESCRIPTOR 0 #define NO_DESCRIPTOR 0
#if (!defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))) || defined(__DOXYGEN__)
/** String descriptor index for the device's unique serial number string descriptor within the device.
* This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
* number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain
* a unique serial number internally, and setting the device descriptors serial number string index to this value
* will cause it to use the internal serial number.
*
* On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseduo-serial
* number for the device.
*/
#define USE_INTERNAL_SERIAL 0xDC
#else
#define USE_INTERNAL_SERIAL NO_DESCRIPTOR
#endif
/** Macro to calculate the power value for the device descriptor, from a given number of milliamps. */ /** Macro to calculate the power value for the device descriptor, from a given number of milliamps. */
#define USB_CONFIG_POWER_MA(mA) (mA >> 1) #define USB_CONFIG_POWER_MA(mA) (mA >> 1)
@ -247,9 +262,10 @@
* *
* \note On some AVR models, there is an embedded serial number * \note On some AVR models, there is an embedded serial number
* in the chip which can be used for the device serial number. * in the chip which can be used for the device serial number.
* To use this serial number, define USE_INTERNAL_SERIAL to a * To use this serial number, set this to USE_INTERNAL_SERIAL.
* unique string index number in the project makefile and set * On unsupported devices, this will evaluate to 0 and will cause
* this value to USE_INTERNAL_SERIAL. * the host to generate a pseudo-unique value for the device upon
* insertion.
* *
* \see ManufacturerStrIndex structure entry. * \see ManufacturerStrIndex structure entry.
*/ */

@ -179,7 +179,7 @@ static void USB_Device_GetDescriptor(void)
void* DescriptorPointer; void* DescriptorPointer;
uint16_t DescriptorSize; uint16_t DescriptorSize;
#if defined(USE_INTERNAL_SERIAL) #if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL)) if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
{ {
uint8_t SignatureDescriptor[2 + (sizeof(int16_t) * 12)]; uint8_t SignatureDescriptor[2 + (sizeof(int16_t) * 12)];

@ -45,15 +45,6 @@
#include "../HighLevel/USBTask.h" #include "../HighLevel/USBTask.h"
#include "LowLevel.h" #include "LowLevel.h"
/* Preprocessor Checks: */
#if defined(USE_INTERNAL_SERIAL) && !(defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
#error USE_INTERNAL_SERIAL invalid, the selected AVR model does not contain unique serial bytes.
#endif
#if defined(USE_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL <= 1)
#error USE_INTERNAL_SERIAL must be defined to the string descriptor index chosen for the serial number descriptor.
#endif
/* Enable C linkage for C++ Compilers: */ /* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {

@ -28,7 +28,8 @@
* cleared to prevent endpoint type corruption * cleared to prevent endpoint type corruption
* - Fix documentation mentioning Pipe_GetCurrentToken() function when real name is Pipe_GetPipeToken() * - Fix documentation mentioning Pipe_GetCurrentToken() function when real name is Pipe_GetPipeToken()
* - Extend USB_GetDeviceConfigDescriptor() routine to require the configuration number within the device to fetch * - Extend USB_GetDeviceConfigDescriptor() routine to require the configuration number within the device to fetch
* - Added new USE_INTERNAL_SERIAL compile time option * - Added new USE_INTERNAL_SERIAL define for using the unique serial numbers in some AVR models as the USB device's serial number,
* added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code
* *
* \section Sec_ChangeLog090605 Version 090605 * \section Sec_ChangeLog090605 Version 090605
* *

@ -80,13 +80,11 @@
* compatibility. If this token is defined, the structure element names are switched to the LUFA-specific but more descriptive * compatibility. If this token is defined, the structure element names are switched to the LUFA-specific but more descriptive
* names documented in the StdDescriptors.h source file. * names documented in the StdDescriptors.h source file.
* *
* <b>USE_INTERNAL_SERIAL</b> - ( \ref Group_Descriptors ) \n * <b>NO_INTERNAL_SERIAL</b> - ( \ref Group_Descriptors ) \n
* Some AVR models contain a unique 20-digit serial number which can be used as the device serial number, while in device mode. This * Some AVR models contain a unique 20-digit serial number which can be used as the device serial number, while in device mode. This
* allows the host to uniquely identify the device regardless of if it is moved between USB ports on the same computer, allowing * allows the host to uniquely identify the device regardless of if it is moved between USB ports on the same computer, allowing
* allocated resources (such as drivers, COM Port number allocations) to be preserved. To make the library use this value for the * allocated resources (such as drivers, COM Port number allocations) to be preserved. This is not needed in many apps, and so the
* device's serial number, define this token in the project makefile, set it to a unique string descriptor index (i.e. one not used * code that performs this task can be disabled by defining this option and passing it to the compiler via the -D switch.
* elsewhere in the device for a string descriptor) and set the Device Descriptor's serial number descriptor index entry to the
* USE_INTERNAL_SERIAL value.
* *
* <b>FIXED_CONTROL_ENDPOINT_SIZE</b> - ( \ref Group_EndpointManagement ) \n * <b>FIXED_CONTROL_ENDPOINT_SIZE</b> - ( \ref Group_EndpointManagement ) \n
* By default, the library determines the size of the control endpoint (when in device mode) by reading the device descriptor. * By default, the library determines the size of the control endpoint (when in device mode) by reading the device descriptor.

Loading…
Cancel
Save