/*
LUFA Library
- Copyright (C) Dean Camera, 2010.
+ Copyright (C) Dean Camera, 2012.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+ Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
#include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/Peripheral/SPI.h>
- #include "../V2ProtocolParams.h"
-
+ #include "../V2Protocol.h"
+ #include "ISPProtocol.h"
+ #include "Config/AppConfig.h"
+
/* Preprocessor Checks: */
#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
#undef ENABLE_ISP_PROTOCOL
#endif
/* Macros: */
- /** Low level device command to issue an extended FLASH address, for devices with other 128KB of FLASH. */
+ /** Low level device command to issue an extended FLASH address, for devices with over 128KB of FLASH. */
#define LOAD_EXTENDED_ADDRESS_CMD 0x4D
- /** Macro to convert an ISP frequency to a number of timer clock cycles for the software SPI driver */
- #define TIMER_COMP(freq) ((((F_CPU / 8) / freq) / 2) - 1)
+ /** Macro to convert an ISP frequency to a number of timer clock cycles for the software SPI driver. */
+ #define TIMER_COMP(freq) (((F_CPU / 8) / 2 / freq) - 1)
+
+ /** ISP rescue clock speed in Hz, for clocking targets with incorrectly set fuses. */
+ #define ISP_RESCUE_CLOCK_SPEED 4000000
/* External Variables: */
extern bool HardwareSPIMode;
/* Function Prototypes: */
- void ISPTarget_Init(void);
- void ISPTarget_ShutDown(void);
+ void ISPTarget_EnableTargetISP(void);
+ void ISPTarget_DisableTargetISP(void);
+ void ISPTarget_ConfigureRescueClock(void);
+ void ISPTarget_ConfigureSoftwareSPI(const uint8_t SCKDuration);
uint8_t ISPTarget_TransferSoftSPIByte(const uint8_t Byte);
void ISPTarget_ChangeTargetResetLine(const bool ResetTarget);
uint8_t ISPTarget_WaitWhileTargetBusy(void);
*/
static inline uint8_t ISPTarget_ReceiveByte(void)
{
+ #if !defined(INVERTED_ISP_MISO)
if (HardwareSPIMode)
return SPI_ReceiveByte();
else
return ISPTarget_TransferSoftSPIByte(0x00);
+ #else
+ if (HardwareSPIMode)
+ return ~SPI_ReceiveByte();
+ else
+ return ~ISPTarget_TransferSoftSPIByte(0x00);
+ #endif
}
/** Sends and receives a byte of ISP data to and from the attached target, using the
*/
static inline uint8_t ISPTarget_TransferByte(const uint8_t Byte)
{
+ #if !defined(INVERTED_ISP_MISO)
if (HardwareSPIMode)
return SPI_TransferByte(Byte);
else
return ISPTarget_TransferSoftSPIByte(Byte);
+ #else
+ if (HardwareSPIMode)
+ return ~SPI_TransferByte(Byte);
+ else
+ return ~ISPTarget_TransferSoftSPIByte(Byte);
+ #endif
}
#endif