Added support to the AVRISP-MKII project for ISP speeds slower than 125KHz via a...
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / ISP / ISPTarget.h
index 869e0e5..967849a 100644 (file)
                #endif
 
        /* Macros: */
-               /** Total number of allowable ISP programming speeds supported by the device. */
-               #define TOTAL_ISP_PROGRAMMING_SPEEDS  7
-               
                /** Low level device command to issue an extended FLASH address, for devices with other 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)
+
+       /* External Variables: */
+               extern bool HardwareSPIMode;
+
        /* Function Prototypes: */
-               uint8_t ISPTarget_GetSPIPrescalerMask(void);
+               void    ISPTarget_Init(void);
+               void    ISPTarget_ShutDown(void);
+               uint8_t ISPTarget_TransferSoftSPIByte(const uint8_t Byte);
                void    ISPTarget_ChangeTargetResetLine(const bool ResetTarget);
+               uint8_t ISPTarget_WaitWhileTargetBusy(void);
+               void    ISPTarget_LoadExtendedAddress(void);
                uint8_t ISPTarget_WaitForProgComplete(const uint8_t ProgrammingMode,
                                                      const uint16_t PollAddress,
                                                      const uint8_t PollValue,
                                                      const uint8_t DelayMS,
                                                      const uint8_t ReadMemCommand);
-               uint8_t ISPTarget_WaitWhileTargetBusy(void);
-               void    ISPTarget_LoadExtendedAddress(void);
+
+       /* Inline Functions: */
+               /** Sends a byte of ISP data to the attached target, using the appropriate SPI hardware or
+                *  software routines depending on the selected ISP speed.
+                *
+                *  \param[in] Byte  Byte of data to send to the attached target
+                */
+               static inline void ISPTarget_SendByte(const uint8_t Byte)
+               {
+                       if (HardwareSPIMode)
+                         SPI_SendByte(Byte);
+                       else
+                         ISPTarget_TransferSoftSPIByte(Byte);
+               }
+
+               /** Receives a byte of ISP data from the attached target, using the appropriate
+                *  SPI hardware or software routines depending on the selected ISP speed.
+                *
+                *  \return Received byte of data from the attached target
+                */
+               static inline uint8_t ISPTarget_ReceiveByte(void)
+               {
+                       if (HardwareSPIMode)
+                         return SPI_ReceiveByte();
+                       else
+                         return ISPTarget_TransferSoftSPIByte(0x00);
+               }
+
+               /** Sends and receives a byte of ISP data to and from the attached target, using the
+                *  appropriate SPI hardware or software routines depending on the selected ISP speed.
+                *
+                *  \param[in] Byte  Byte of data to send to the attached target
+                *
+                *  \return Received byte of data from the attached target
+                */
+               static inline uint8_t ISPTarget_TransferByte(const uint8_t Byte)
+               {
+                       if (HardwareSPIMode)
+                         return SPI_TransferByte(Byte);
+                       else
+                         return ISPTarget_TransferSoftSPIByte(Byte);
+               }
 
 #endif