More AVR32 achitecture ports.
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / ISP / ISPProtocol.c
index 33ccbf9..9922c19 100644 (file)
@@ -62,13 +62,20 @@ void ISPProtocol_EnterISPMode(void)
        uint8_t ResponseStatus = STATUS_CMD_FAILED;\r
        \r
        CurrentAddress = 0;\r
        uint8_t ResponseStatus = STATUS_CMD_FAILED;\r
        \r
        CurrentAddress = 0;\r
+       \r
+       /* Set up the synchronous USART to generate the recovery clock on XCK pin */\r
+       UBRR1  = (F_CPU / 500000UL);\r
+       UCSR1B = (1 << TXEN1);\r
+       UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);\r
+       DDRD  |= (1 << 5);\r
 \r
 \r
+       /* Perform execution delay, initialize SPI bus */\r
        ISPProtocol_DelayMS(Enter_ISP_Params.ExecutionDelayMS); \r
        SPI_Init(ISPTarget_GetSPIPrescalerMask() | SPI_SCK_LEAD_RISING | SPI_SAMPLE_LEADING | SPI_MODE_MASTER);\r
 \r
        /* Continuously attempt to synchronize with the target until either the number of attempts specified\r
         * by the host has exceeded, or the the device sends back the expected response values */\r
        ISPProtocol_DelayMS(Enter_ISP_Params.ExecutionDelayMS); \r
        SPI_Init(ISPTarget_GetSPIPrescalerMask() | SPI_SCK_LEAD_RISING | SPI_SAMPLE_LEADING | SPI_MODE_MASTER);\r
 \r
        /* Continuously attempt to synchronize with the target until either the number of attempts specified\r
         * by the host has exceeded, or the the device sends back the expected response values */\r
-       while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus == STATUS_CMD_FAILED))\r
+       while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus == STATUS_CMD_FAILED) && TimeoutMSRemaining)\r
        {\r
                uint8_t ResponseBytes[4];\r
 \r
        {\r
                uint8_t ResponseBytes[4];\r
 \r
@@ -78,7 +85,7 @@ void ISPProtocol_EnterISPMode(void)
                for (uint8_t RByte = 0; RByte < sizeof(ResponseBytes); RByte++)\r
                {\r
                        ISPProtocol_DelayMS(Enter_ISP_Params.ByteDelay);\r
                for (uint8_t RByte = 0; RByte < sizeof(ResponseBytes); RByte++)\r
                {\r
                        ISPProtocol_DelayMS(Enter_ISP_Params.ByteDelay);\r
-                       ResponseBytes[RByte] = SPI_TransferByte(Enter_ISP_Params.EnterProgBytes[RByte]);\r
+                       ResponseBytes[RByte] = SPI_Transfer(Enter_ISP_Params.EnterProgBytes[RByte]);\r
                }\r
                \r
                /* Check if polling disabled, or if the polled value matches the expected value */\r
                }\r
                \r
                /* Check if polling disabled, or if the polled value matches the expected value */\r
@@ -118,6 +125,12 @@ void ISPProtocol_LeaveISPMode(void)
        SPI_ShutDown();\r
        ISPProtocol_DelayMS(Leave_ISP_Params.PostDelayMS);\r
 \r
        SPI_ShutDown();\r
        ISPProtocol_DelayMS(Leave_ISP_Params.PostDelayMS);\r
 \r
+       /* Turn off the synchronous USART to terminate the recovery clock on XCK pin */\r
+       UBRR1  = (F_CPU / 500000UL);\r
+       UCSR1B = (1 << TXEN1);\r
+       UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);\r
+       DDRD  &= ~(1 << 5);\r
+\r
        Endpoint_Write_Byte(CMD_LEAVE_PROGMODE_ISP);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
        Endpoint_ClearIN();\r
        Endpoint_Write_Byte(CMD_LEAVE_PROGMODE_ISP);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
        Endpoint_ClearIN();\r
@@ -191,10 +204,10 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
                        bool    IsOddByte   = (CurrentByte & 0x01);\r
                        uint8_t ByteToWrite = *(NextWriteByte++);\r
                \r
                        bool    IsOddByte   = (CurrentByte & 0x01);\r
                        uint8_t ByteToWrite = *(NextWriteByte++);\r
                \r
-                       SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]);\r
-                       SPI_SendByte(CurrentAddress >> 8);\r
-                       SPI_SendByte(CurrentAddress & 0xFF);\r
-                       SPI_SendByte(ByteToWrite);\r
+                       SPI_Send(Write_Memory_Params.ProgrammingCommands[0]);\r
+                       SPI_Send(CurrentAddress >> 8);\r
+                       SPI_Send(CurrentAddress & 0xFF);\r
+                       SPI_Send(ByteToWrite);\r
                        \r
                        /* AVR FLASH addressing requires us to modify the write command based on if we are writing a high\r
                         * or low byte at the current word address */\r
                        \r
                        /* AVR FLASH addressing requires us to modify the write command based on if we are writing a high\r
                         * or low byte at the current word address */\r
@@ -217,10 +230,10 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
                /* If the current page must be committed, send the PROGRAM PAGE command to the target */\r
                if (Write_Memory_Params.ProgrammingMode & PROG_MODE_COMMIT_PAGE_MASK)\r
                {\r
                /* If the current page must be committed, send the PROGRAM PAGE command to the target */\r
                if (Write_Memory_Params.ProgrammingMode & PROG_MODE_COMMIT_PAGE_MASK)\r
                {\r
-                       SPI_SendByte(Write_Memory_Params.ProgrammingCommands[1]);\r
-                       SPI_SendByte(StartAddress >> 8);\r
-                       SPI_SendByte(StartAddress & 0xFF);\r
-                       SPI_SendByte(0x00);\r
+                       SPI_Send(Write_Memory_Params.ProgrammingCommands[1]);\r
+                       SPI_Send(StartAddress >> 8);\r
+                       SPI_Send(StartAddress & 0xFF);\r
+                       SPI_Send(0x00);\r
                        \r
                        /* Check if polling is possible, if not switch to timed delay mode */\r
                        if (!(PollAddress))\r
                        \r
                        /* Check if polling is possible, if not switch to timed delay mode */\r
                        if (!(PollAddress))\r
@@ -241,10 +254,10 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
                        bool    IsOddByte   = (CurrentByte & 0x01);\r
                        uint8_t ByteToWrite = *(NextWriteByte++);\r
                          \r
                        bool    IsOddByte   = (CurrentByte & 0x01);\r
                        uint8_t ByteToWrite = *(NextWriteByte++);\r
                          \r
-                       SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]);\r
-                       SPI_SendByte(CurrentAddress >> 8);\r
-                       SPI_SendByte(CurrentAddress & 0xFF);\r
-                       SPI_SendByte(ByteToWrite);\r
+                       SPI_Send(Write_Memory_Params.ProgrammingCommands[0]);\r
+                       SPI_Send(CurrentAddress >> 8);\r
+                       SPI_Send(CurrentAddress & 0xFF);\r
+                       SPI_Send(ByteToWrite);\r
                        \r
                        /* AVR FLASH addressing requires us to modify the write command based on if we are writing a high\r
                         * or low byte at the current word address */\r
                        \r
                        /* AVR FLASH addressing requires us to modify the write command based on if we are writing a high\r
                         * or low byte at the current word address */\r
@@ -312,10 +325,10 @@ void ISPProtocol_ReadMemory(uint8_t V2Command)
        for (uint16_t CurrentByte = 0; CurrentByte < Read_Memory_Params.BytesToRead; CurrentByte++)\r
        {\r
                /* Read the next byte from the desired memory space in the device */\r
        for (uint16_t CurrentByte = 0; CurrentByte < Read_Memory_Params.BytesToRead; CurrentByte++)\r
        {\r
                /* Read the next byte from the desired memory space in the device */\r
-               SPI_SendByte(Read_Memory_Params.ReadMemoryCommand);\r
-               SPI_SendByte(CurrentAddress >> 8);\r
-               SPI_SendByte(CurrentAddress & 0xFF);\r
-               Endpoint_Write_Byte(SPI_ReceiveByte());\r
+               SPI_Send(Read_Memory_Params.ReadMemoryCommand);\r
+               SPI_Send(CurrentAddress >> 8);\r
+               SPI_Send(CurrentAddress & 0xFF);\r
+               Endpoint_Write_Byte(SPI_Receive());\r
                \r
                /* Check if the endpoint bank is currently full, if so send the packet */\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
                \r
                /* Check if the endpoint bank is currently full, if so send the packet */\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
@@ -368,7 +381,7 @@ void ISPProtocol_ChipErase(void)
        \r
        /* Send the chip erase commands as given by the host to the device */\r
        for (uint8_t SByte = 0; SByte < sizeof(Erase_Chip_Params.EraseCommandBytes); SByte++)\r
        \r
        /* Send the chip erase commands as given by the host to the device */\r
        for (uint8_t SByte = 0; SByte < sizeof(Erase_Chip_Params.EraseCommandBytes); SByte++)\r
-         SPI_SendByte(Erase_Chip_Params.EraseCommandBytes[SByte]);\r
+         SPI_Send(Erase_Chip_Params.EraseCommandBytes[SByte]);\r
 \r
        /* Use appropriate command completion check as given by the host (delay or busy polling) */\r
        if (!(Erase_Chip_Params.PollMethod))\r
 \r
        /* Use appropriate command completion check as given by the host (delay or busy polling) */\r
        if (!(Erase_Chip_Params.PollMethod))\r
@@ -403,7 +416,7 @@ void ISPProtocol_ReadFuseLockSigOSCCAL(uint8_t V2Command)
 \r
        /* Send the Fuse or Lock byte read commands as given by the host to the device, store response */\r
        for (uint8_t RByte = 0; RByte < sizeof(ResponseBytes); RByte++)\r
 \r
        /* Send the Fuse or Lock byte read commands as given by the host to the device, store response */\r
        for (uint8_t RByte = 0; RByte < sizeof(ResponseBytes); RByte++)\r
-         ResponseBytes[RByte] = SPI_TransferByte(Read_FuseLockSigOSCCAL_Params.ReadCommandBytes[RByte]);\r
+         ResponseBytes[RByte] = SPI_Transfer(Read_FuseLockSigOSCCAL_Params.ReadCommandBytes[RByte]);\r
                \r
        Endpoint_Write_Byte(V2Command);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
                \r
        Endpoint_Write_Byte(V2Command);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
@@ -431,7 +444,7 @@ void ISPProtocol_WriteFuseLock(uint8_t V2Command)
 \r
        /* Send the Fuse or Lock byte program commands as given by the host to the device */\r
        for (uint8_t SByte = 0; SByte < sizeof(Write_FuseLockSig_Params.WriteCommandBytes); SByte++)\r
 \r
        /* Send the Fuse or Lock byte program commands as given by the host to the device */\r
        for (uint8_t SByte = 0; SByte < sizeof(Write_FuseLockSig_Params.WriteCommandBytes); SByte++)\r
-         SPI_SendByte(Write_FuseLockSig_Params.WriteCommandBytes[SByte]);\r
+         SPI_Send(Write_FuseLockSig_Params.WriteCommandBytes[SByte]);\r
                \r
        Endpoint_Write_Byte(V2Command);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
                \r
        Endpoint_Write_Byte(V2Command);\r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
@@ -466,9 +479,9 @@ void ISPProtocol_SPIMulti(void)
        while (CurrTxPos < SPI_Multi_Params.RxStartAddr)\r
        {\r
                if (CurrTxPos < SPI_Multi_Params.TxBytes)\r
        while (CurrTxPos < SPI_Multi_Params.RxStartAddr)\r
        {\r
                if (CurrTxPos < SPI_Multi_Params.TxBytes)\r
-                 SPI_SendByte(SPI_Multi_Params.TxData[CurrTxPos]);\r
+                 SPI_Send(SPI_Multi_Params.TxData[CurrTxPos]);\r
                else\r
                else\r
-                 SPI_SendByte(0);\r
+                 SPI_Send(0);\r
                \r
                CurrTxPos++;\r
        }\r
                \r
                CurrTxPos++;\r
        }\r
@@ -477,9 +490,9 @@ void ISPProtocol_SPIMulti(void)
        while (CurrRxPos < SPI_Multi_Params.RxBytes)\r
        {\r
                if (CurrTxPos < SPI_Multi_Params.TxBytes)\r
        while (CurrRxPos < SPI_Multi_Params.RxBytes)\r
        {\r
                if (CurrTxPos < SPI_Multi_Params.TxBytes)\r
-                 Endpoint_Write_Byte(SPI_TransferByte(SPI_Multi_Params.TxData[CurrTxPos++]));\r
+                 Endpoint_Write_Byte(SPI_Transfer(SPI_Multi_Params.TxData[CurrTxPos++]));\r
                else\r
                else\r
-                 Endpoint_Write_Byte(SPI_ReceiveByte());\r
+                 Endpoint_Write_Byte(SPI_Receive());\r
                  \r
                /* Check to see if we have filled the endpoint bank and need to send the packet */\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
                  \r
                /* Check to see if we have filled the endpoint bank and need to send the packet */\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
@@ -505,4 +518,19 @@ void ISPProtocol_SPIMulti(void)
        }\r
 }\r
 \r
        }\r
 }\r
 \r
+/** Blocking delay for a given number of milliseconds.\r
+ *\r
+ *  \param[in] DelayMS  Number of milliseconds to delay for\r
+ */\r
+void ISPProtocol_DelayMS(uint8_t DelayMS)\r
+{\r
+       while (DelayMS-- && TimeoutMSRemaining)\r
+       {\r
+               if (TimeoutMSRemaining)\r
+                 TimeoutMSRemaining--;\r
+                 \r
+               _delay_ms(1);\r
+       }\r
+}\r
+\r
 #endif
\ No newline at end of file
 #endif
\ No newline at end of file