Fixed device state not being reset back to the default state if the host sets the address to 0x00.
Fixed Set Configuration requests not being stalled until the host has set the device's address. Fixed possibility of internal signature retrieval being corrupted if an interrupt occurs during a signature byte read (thanks to Andrei Krainev).
This commit is contained in:
parent
eed7d4df6a
commit
27f0ba6fc3
5 changed files with 54 additions and 43 deletions
|
@ -136,8 +136,7 @@ static void USB_Device_SetAddress(void)
|
|||
return;
|
||||
}
|
||||
|
||||
if (DeviceAddress)
|
||||
USB_DeviceState = DEVICE_STATE_Addressed;
|
||||
USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
|
||||
|
||||
UDADDR = ((1 << ADDEN) | DeviceAddress);
|
||||
|
||||
|
@ -146,12 +145,21 @@ static void USB_Device_SetAddress(void)
|
|||
|
||||
static void USB_Device_SetConfiguration(void)
|
||||
{
|
||||
if (USB_DeviceState != DEVICE_STATE_Addressed)
|
||||
return;
|
||||
|
||||
#if defined(FIXED_NUM_CONFIGURATIONS)
|
||||
if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)
|
||||
return;
|
||||
#else
|
||||
#if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
|
||||
uint8_t MemoryAddressSpace;
|
||||
#if defined(USE_FLASH_DESCRIPTORS)
|
||||
#define MemoryAddressSpace MEMSPACE_FLASH
|
||||
#elif defined(USE_EEPROM_DESCRIPTORS)
|
||||
#define MemoryAddressSpace MEMSPACE_EEPROM
|
||||
#elif defined(USE_SRAM_DESCRIPTORS)
|
||||
#define MemoryAddressSpace MEMSPACE_SRAM
|
||||
#else
|
||||
uint8_t MemoryAddressSpace;
|
||||
#endif
|
||||
|
||||
USB_Descriptor_Device_t* DevDescriptorPtr;
|
||||
|
@ -165,16 +173,6 @@ static void USB_Device_SetConfiguration(void)
|
|||
return;
|
||||
}
|
||||
|
||||
#if defined(USE_RAM_DESCRIPTORS)
|
||||
if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
|
||||
return;
|
||||
#elif defined (USE_EEPROM_DESCRIPTORS)
|
||||
if ((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations))
|
||||
return;
|
||||
#elif defined (USE_FLASH_DESCRIPTORS)
|
||||
if ((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations))
|
||||
return;
|
||||
#else
|
||||
if (MemoryAddressSpace == MEMSPACE_FLASH)
|
||||
{
|
||||
if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
|
||||
|
@ -190,7 +188,6 @@ static void USB_Device_SetConfiguration(void)
|
|||
if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
@ -234,17 +231,20 @@ static void USB_Device_GetInternalSerialDescriptor(void)
|
|||
|
||||
uint8_t SigReadAddress = 0x0E;
|
||||
|
||||
for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++)
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
|
||||
{
|
||||
uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
|
||||
|
||||
if (SerialCharNum & 0x01)
|
||||
for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++)
|
||||
{
|
||||
SerialByte >>= 4;
|
||||
SigReadAddress++;
|
||||
uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
|
||||
|
||||
if (SerialCharNum & 0x01)
|
||||
{
|
||||
SerialByte >>= 4;
|
||||
SigReadAddress++;
|
||||
}
|
||||
|
||||
SignatureDescriptor.UnicodeString[SerialCharNum] = USB_Device_NibbleToASCII(SerialByte);
|
||||
}
|
||||
|
||||
SignatureDescriptor.UnicodeString[SerialCharNum] = USB_Device_NibbleToASCII(SerialByte);
|
||||
}
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue