Remove incorrect check for the current device state in the Set Configuration request handler of DevChapter9, which broke Set Configuration requests to the device under most circumstances.

Move out the SPI prescaler list to a PROGMEM module-level variable in ISPTarget.c.
pull/1469/head
Dean Camera 15 years ago
parent 571159df1b
commit 34047efc7e

@ -145,9 +145,6 @@ 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;

@ -20,6 +20,8 @@
* - Fixed AVRISP-MKII clone project not correctly issuing LOAD EXTENDED ADDRESS commands when the extended address
* boundary is crossed during programming or readback (thanks to Gerard Sexton)
* - Fixed warnings when building the AVRISP-MKII clone project with the ENABLE_XPROG_PROTOCOL compile time option disabled
* - Remove incorrect check for the current device state in the Set Configuration request handler of DevChapter9, which broke
* Set Configuration requests to the device under most circumstances.
*
* \section Sec_ChangeLog100512 Version 100512
*

@ -37,16 +37,10 @@
#if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__)
/** Converts the given AVR Studio SCK duration parameter (set by a SET PARAM command from the host) to the nearest
* possible SPI clock prescaler mask for passing to the SPI_Init() routine.
*
* \return Nearest SPI prescaler mask for the given SCK frequency
*/
uint8_t ISPTarget_GetSPIPrescalerMask(void)
/** List of SPI prescaler masks for possible AVRStudio ISP programming speeds. */
static uint8_t SPIMaskFromSCKDuration[] PROGMEM =
{
static const uint8_t SPIMaskFromSCKDuration[] =
{
#if (F_CPU == 8000000)
#if (F_CPU == 8000000)
SPI_SPEED_FCPU_DIV_2, // AVRStudio = 8MHz SPI, Actual = 4MHz SPI
SPI_SPEED_FCPU_DIV_2, // AVRStudio = 4MHz SPI, Actual = 4MHz SPI
SPI_SPEED_FCPU_DIV_4, // AVRStudio = 2MHz SPI, Actual = 2MHz SPI
@ -54,7 +48,7 @@ uint8_t ISPTarget_GetSPIPrescalerMask(void)
SPI_SPEED_FCPU_DIV_16, // AVRStudio = 500KHz SPI, Actual = 500KHz SPI
SPI_SPEED_FCPU_DIV_32, // AVRStudio = 250KHz SPI, Actual = 250KHz SPI
SPI_SPEED_FCPU_DIV_64, // AVRStudio = 125KHz SPI, Actual = 125KHz SPI
#elif (F_CPU == 16000000)
#elif (F_CPU == 16000000)
SPI_SPEED_FCPU_DIV_2, // AVRStudio = 8MHz SPI, Actual = 8MHz SPI
SPI_SPEED_FCPU_DIV_4, // AVRStudio = 4MHz SPI, Actual = 4MHz SPI
SPI_SPEED_FCPU_DIV_8, // AVRStudio = 2MHz SPI, Actual = 2MHz SPI
@ -62,17 +56,24 @@ uint8_t ISPTarget_GetSPIPrescalerMask(void)
SPI_SPEED_FCPU_DIV_32, // AVRStudio = 500KHz SPI, Actual = 500KHz SPI
SPI_SPEED_FCPU_DIV_64, // AVRStudio = 250KHz SPI, Actual = 250KHz SPI
SPI_SPEED_FCPU_DIV_128 // AVRStudio = 125KHz SPI, Actual = 125KHz SPI
#else
#else
#error No SPI prescaler masks for chosen F_CPU speed.
#endif
};
#endif
};
/** Converts the given AVR Studio SCK duration parameter (set by a SET PARAM command from the host) to the nearest
* possible SPI clock prescaler mask for passing to the SPI_Init() routine.
*
* \return Nearest SPI prescaler mask for the given SCK frequency
*/
uint8_t ISPTarget_GetSPIPrescalerMask(void)
{
uint8_t SCKDuration = V2Params_GetParameterValue(PARAM_SCK_DURATION);
if (SCKDuration >= sizeof(SPIMaskFromSCKDuration))
SCKDuration = (sizeof(SPIMaskFromSCKDuration) - 1);
return SPIMaskFromSCKDuration[SCKDuration];
return pgm_read_byte(&SPIMaskFromSCKDuration[SCKDuration]);
}
/** Asserts or deasserts the target's reset line, using the correct polarity as set by the host using a SET PARAM command.

@ -38,6 +38,7 @@
/* Includes: */
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <LUFA/Drivers/USB/USB.h>

Loading…
Cancel
Save