/*
LUFA Library
- Copyright (C) Dean Camera, 2011.
+ Copyright (C) Dean Camera, 2012.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
- Copyright 2011 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
#define _ISP_TARGET_
/* Includes: */
- #include <LUFA/Common/Common.h>
- #include <LUFA/Drivers/USB/USB.h>
-
- #if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__)
- #include <LUFA/Drivers/Peripheral/SPI.h> // TODO: FIXME
- #endif
-
- #if (ARCH == ARCH_AVR8)
- #include <avr/io.h>
- #include <avr/pgmspace.h>
- #elif (ARCH == ARCH_UC3)
- #include <avr32/io.h>
- #endif
+ #include <avr/io.h>
+ #include <avr/pgmspace.h>
+ #include <util/delay.h>
- #include "../V2ProtocolParams.h"
+ #include <LUFA/Drivers/USB/USB.h>
+ #include <LUFA/Drivers/Peripheral/SPI.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. */
void ISPTarget_EnableTargetISP(void);
void ISPTarget_DisableTargetISP(void);
void ISPTarget_ConfigureRescueClock(void);
- void ISPTarget_ConfigureSoftwareISP(const uint8_t SCKDuration);
+ 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);
const uint8_t ReadMemCommand);
/* Inline Functions: */
- #if defined(ENABLE_ISP_PROTOCOL) || defined(__DOXYGEN__)
/** Sends a byte of ISP data to the attached target, using the appropriate SPI hardware or
* software routines depending on the selected ISP speed.
*
*/
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
#endif