|
|
|
@@ -37,6 +37,30 @@
|
|
|
|
|
|
|
|
|
|
#if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__)
|
|
|
|
|
|
|
|
|
|
/** List of SPI prescaler masks for possible AVRStudio ISP programming speeds. */
|
|
|
|
|
static uint8_t SPIMaskFromSCKDuration[] PROGMEM =
|
|
|
|
|
{
|
|
|
|
|
#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
|
|
|
|
|
SPI_SPEED_FCPU_DIV_8, // AVRStudio = 1MHz SPI, Actual = 1MHz SPI
|
|
|
|
|
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)
|
|
|
|
|
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
|
|
|
|
|
SPI_SPEED_FCPU_DIV_16, // AVRStudio = 1MHz SPI, Actual = 1MHz SPI
|
|
|
|
|
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
|
|
|
|
|
#error No SPI prescaler masks for chosen F_CPU speed.
|
|
|
|
|
#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.
|
|
|
|
|
*
|
|
|
|
@@ -44,35 +68,12 @@
|
|
|
|
|
*/
|
|
|
|
|
uint8_t ISPTarget_GetSPIPrescalerMask(void)
|
|
|
|
|
{
|
|
|
|
|
static const uint8_t SPIMaskFromSCKDuration[] =
|
|
|
|
|
{
|
|
|
|
|
#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
|
|
|
|
|
SPI_SPEED_FCPU_DIV_8, // AVRStudio = 1MHz SPI, Actual = 1MHz SPI
|
|
|
|
|
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)
|
|
|
|
|
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
|
|
|
|
|
SPI_SPEED_FCPU_DIV_16, // AVRStudio = 1MHz SPI, Actual = 1MHz SPI
|
|
|
|
|
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
|
|
|
|
|
#error No SPI prescaler masks for chosen F_CPU speed.
|
|
|
|
|
#endif
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|