diff --git a/Bootloaders/TeensyHID/Descriptors.c b/Bootloaders/TeensyHID/Descriptors.c index 2832ec3935..4142f12474 100644 --- a/Bootloaders/TeensyHID/Descriptors.c +++ b/Bootloaders/TeensyHID/Descriptors.c @@ -157,26 +157,29 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - switch (DescriptorType) + /* If/Else If chain compiles slightly smaller than a switch case */ + + if (DescriptorType == DTYPE_Device) + { + Address = (void*)&DeviceDescriptor; + Size = sizeof(USB_Descriptor_Device_t); + } + else if (DescriptorType == DTYPE_Device) + { + Address = (void*)&ConfigurationDescriptor; + Size = sizeof(USB_Descriptor_Configuration_t); + } + else if (DescriptorType == DTYPE_HID) + { + Address = (void*)&ConfigurationDescriptor.HID_VendorHID; + Size = sizeof(USB_Descriptor_HID_t); + } + else { - case DTYPE_Device: - Address = (void*)&DeviceDescriptor; - Size = sizeof(USB_Descriptor_Device_t); - break; - case DTYPE_Configuration: - Address = (void*)&ConfigurationDescriptor; - Size = sizeof(USB_Descriptor_Configuration_t); - break; - case DTYPE_HID: - Address = (void*)&ConfigurationDescriptor.HID_VendorHID; - Size = sizeof(USB_Descriptor_HID_t); - break; - case DTYPE_Report: - Address = (void*)&HIDReport; - Size = sizeof(HIDReport); - break; + Address = (void*)&HIDReport; + Size = sizeof(HIDReport); } - + *DescriptorAddress = Address; return Size; } diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c index 17a5fd4714..b7f811b5eb 100644 --- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c +++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c @@ -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(); diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.h b/LUFA/Drivers/USB/LowLevel/DevChapter9.h index d591327390..868c3fab21 100644 --- a/LUFA/Drivers/USB/LowLevel/DevChapter9.h +++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.h @@ -46,6 +46,7 @@ #include #include #include + #include #include "../HighLevel/StdDescriptors.h" #include "../HighLevel/Events.h" diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 8d5a7ab6a4..c38f9e73e6 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -52,6 +52,12 @@ * - Fixed Set/Clear Feature requests directed to a non-configured endpoint not returning a stall to the host * - Fixed HID Device Class Driver not allocating a temporary buffer when the host requests a report via the control endpoint and the * user has set the PrevReportINBuffer driver configuration element to NULL (thanks to Lars Noschinski) + * - Fixed device state not being reset to DEVICE_STATE_Default if the host sets a 0x00 device address + * - Fixed device not stalling configuration requests before the device's address has been set + * - Fixed possibility of internal signature retrieval being corrupted if an interrupt occurs during a signature byte + * read (thanks to Andrei Krainev) + * - Fixed device state not being reset back to the default state if the host sets the address to 0 + * - Fixed Set Configuration requests not being stalled until the host has set the device's address * * \section Sec_ChangeLog100219 Version 100219 * diff --git a/Projects/AVRISP-MKII/AVRISP.txt b/Projects/AVRISP-MKII/AVRISP.txt index fddae6d2bb..6109031106 100644 --- a/Projects/AVRISP-MKII/AVRISP.txt +++ b/Projects/AVRISP-MKII/AVRISP.txt @@ -56,14 +56,15 @@ * Note that this design currently has the following limitations: * - Minimum ISP target clock speed of 500KHz due to hardware SPI module prescaler limitations * - No reversed/shorted target connector detection and notification + * - Very slow TPI and PDI programming when in software emulated USART mode * * On AVR models with an ADC converter, AVCC should be tied to 5V (e.g. VBUS) and the VTARGET_ADC_CHANNEL token should be * set to an appropriate ADC channel number in the project makefile for VTARGET detection to operate correctly. On models * without an ADC converter, VTARGET will report a fixed 5V level at all times. * * When compiled for the XPLAIN board target, this will automatically configure itself for the correct connections to the - * XPLAIN's XMEGA AVR, and will enable PDI/TPI only programming support (since ISP mode is not needed). Note that the - * first revision XPLAIN board lacks a bootloader on the AT90USB1287, and thus for this firmware to be loaded, an external + * XPLAIN's XMEGA AVR, and will enable hardware PDI/TPI only programming support (since ISP mode is not needed). Note that + * the first revision XPLAIN board lacks a bootloader on the AT90USB1287, and thus for this firmware to be loaded, an external * programmer will be required. * * While this application can be compiled for USB AVRs with as little as 8KB of FLASH, for full functionality 16KB or more