From 27f0ba6fc30db478fbab0b952bf2c3137f5a7719 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 4 May 2010 10:07:22 +0000 Subject: [PATCH] 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). --- Bootloaders/TeensyHID/Descriptors.c | 39 +++++++++++---------- LUFA/Drivers/USB/LowLevel/DevChapter9.c | 46 ++++++++++++------------- LUFA/Drivers/USB/LowLevel/DevChapter9.h | 1 + LUFA/ManPages/ChangeLog.txt | 6 ++++ Projects/AVRISP-MKII/AVRISP.txt | 5 +-- 5 files changed, 54 insertions(+), 43 deletions(-) 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