Minor documentation adjustments to the demos, projects and bootloaders to ensure...
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / ISP / ISPProtocol.c
index 2e31c18..445e088 100644 (file)
@@ -1,13 +1,13 @@
 /*
              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
@@ -52,12 +52,12 @@ void ISPProtocol_EnterISPMode(void)
                uint8_t PollValue;
                uint8_t PollIndex;
                uint8_t EnterProgBytes[4];
-       } ATTR_PACKED Enter_ISP_Params;
+       } Enter_ISP_Params;
 
        Endpoint_Read_Stream_LE(&Enter_ISP_Params, sizeof(Enter_ISP_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint8_t ResponseStatus = STATUS_CMD_FAILED;
@@ -69,10 +69,11 @@ void ISPProtocol_EnterISPMode(void)
        ISPTarget_EnableTargetISP();
 
        ISPTarget_ChangeTargetResetLine(true);
+       ISPProtocol_DelayMS(Enter_ISP_Params.PinStabDelayMS);
 
        /* Continuously attempt to synchronize with the target until either the number of attempts specified
         * by the host has exceeded, or the the device sends back the expected response values */
-       while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus != STATUS_CMD_OK) && !(TimeoutExpired))
+       while (Enter_ISP_Params.SynchLoops-- && TimeoutTicksRemaining)
        {
                uint8_t ResponseBytes[4];
 
@@ -86,12 +87,14 @@ void ISPProtocol_EnterISPMode(void)
                if (!(Enter_ISP_Params.PollIndex) || (ResponseBytes[Enter_ISP_Params.PollIndex - 1] == Enter_ISP_Params.PollValue))
                {
                        ResponseStatus = STATUS_CMD_OK;
+                       break;
                }
                else
                {
                        ISPTarget_ChangeTargetResetLine(false);
                        ISPProtocol_DelayMS(Enter_ISP_Params.PinStabDelayMS);
                        ISPTarget_ChangeTargetResetLine(true);
+                       ISPProtocol_DelayMS(Enter_ISP_Params.PinStabDelayMS);
                }
        }
 
@@ -107,12 +110,12 @@ void ISPProtocol_LeaveISPMode(void)
        {
                uint8_t PreDelayMS;
                uint8_t PostDelayMS;
-       } ATTR_PACKED Leave_ISP_Params;
+       } Leave_ISP_Params;
 
        Endpoint_Read_Stream_LE(&Leave_ISP_Params, sizeof(Leave_ISP_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        /* Perform pre-exit delay, release the target /RESET, disable the SPI bus and perform the post-exit delay */
@@ -141,17 +144,17 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
                uint8_t  ProgrammingCommands[3];
                uint8_t  PollValue1;
                uint8_t  PollValue2;
-               uint8_t  ProgData[256];        // Note, the Jungo driver has a very short ACK timeout period, need to buffer the
-       } ATTR_PACKED Write_Memory_Params; // whole page and ACK the packet as fast as possible to prevent it from aborting
+               uint8_t  ProgData[256]; // Note, the Jungo driver has a very short ACK timeout period, need to buffer the
+       } Write_Memory_Params;      // whole page and ACK the packet as fast as possible to prevent it from aborting
 
        Endpoint_Read_Stream_LE(&Write_Memory_Params, (sizeof(Write_Memory_Params) -
                                                       sizeof(Write_Memory_Params.ProgData)), NULL);
-       Write_Memory_Params.BytesToWrite = be16_to_cpu(Write_Memory_Params.BytesToWrite);
-       
+       Write_Memory_Params.BytesToWrite = SwapEndian_16(Write_Memory_Params.BytesToWrite);
+
        if (Write_Memory_Params.BytesToWrite > sizeof(Write_Memory_Params.ProgData))
        {
                Endpoint_ClearOUT();
-               Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+               Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
                Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
                Endpoint_Write_8(V2Command);
@@ -172,7 +175,7 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
        }
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint8_t  ProgrammingStatus = STATUS_CMD_OK;
@@ -230,22 +233,22 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
                        if (ProgrammingStatus != STATUS_CMD_OK)
                          break;
 
-                       /* Must reset the polling address afterwards, so it is not erronously used for the next byte */
+                       /* Must reset the polling address afterwards, so it is not erroneously used for the next byte */
                        PollAddress = 0;
                }
-               
+
                /* EEPROM just increments the address each byte, flash needs to increment on each word and
                 * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
-                * address boundary has been crossed */
+                * address boundary has been crossed during FLASH memory programming */
                if ((CurrentByte & 0x01) || (V2Command == CMD_PROGRAM_EEPROM_ISP))
                {
                        CurrentAddress++;
 
-                       if ((V2Command != CMD_PROGRAM_EEPROM_ISP) && !(CurrentAddress & 0xFFFF))
+                       if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
                          MustLoadExtendedAddress = true;
                }
        }
-       
+
        /* If the current page must be committed, send the PROGRAM PAGE command to the target */
        if (Write_Memory_Params.ProgrammingMode & PROG_MODE_COMMIT_PAGE_MASK)
        {
@@ -268,7 +271,7 @@ void ISPProtocol_ProgramMemory(uint8_t V2Command)
                /* Check to see if the FLASH address has crossed the extended address boundary */
                if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
                  MustLoadExtendedAddress = true;
-       }       
+       }
 
        Endpoint_Write_8(V2Command);
        Endpoint_Write_8(ProgrammingStatus);
@@ -286,13 +289,13 @@ void ISPProtocol_ReadMemory(uint8_t V2Command)
        {
                uint16_t BytesToRead;
                uint8_t  ReadMemoryCommand;
-       } ATTR_PACKED Read_Memory_Params;
+       } Read_Memory_Params;
 
        Endpoint_Read_Stream_LE(&Read_Memory_Params, sizeof(Read_Memory_Params), NULL);
-       Read_Memory_Params.BytesToRead = be16_to_cpu(Read_Memory_Params.BytesToRead);
-       
+       Read_Memory_Params.BytesToRead = SwapEndian_16(Read_Memory_Params.BytesToRead);
+
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        Endpoint_Write_8(V2Command);
@@ -360,12 +363,12 @@ void ISPProtocol_ChipErase(void)
                uint8_t EraseDelayMS;
                uint8_t PollMethod;
                uint8_t EraseCommandBytes[4];
-       } ATTR_PACKED Erase_Chip_Params;
+       } Erase_Chip_Params;
 
        Endpoint_Read_Stream_LE(&Erase_Chip_Params, sizeof(Erase_Chip_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint8_t ResponseStatus = STATUS_CMD_OK;
@@ -396,12 +399,12 @@ void ISPProtocol_ReadFuseLockSigOSCCAL(uint8_t V2Command)
        {
                uint8_t RetByte;
                uint8_t ReadCommandBytes[4];
-       } ATTR_PACKED Read_FuseLockSigOSCCAL_Params;
+       } Read_FuseLockSigOSCCAL_Params;
 
        Endpoint_Read_Stream_LE(&Read_FuseLockSigOSCCAL_Params, sizeof(Read_FuseLockSigOSCCAL_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        uint8_t ResponseBytes[4];
@@ -427,12 +430,12 @@ void ISPProtocol_WriteFuseLock(uint8_t V2Command)
        struct
        {
                uint8_t WriteCommandBytes[4];
-       } ATTR_PACKED Write_FuseLockSig_Params;
+       } Write_FuseLockSig_Params;
 
        Endpoint_Read_Stream_LE(&Write_FuseLockSig_Params, sizeof(Write_FuseLockSig_Params), NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        /* Send the Fuse or Lock byte program commands as given by the host to the device */
@@ -454,13 +457,13 @@ void ISPProtocol_SPIMulti(void)
                uint8_t RxBytes;
                uint8_t RxStartAddr;
                uint8_t TxData[255];
-       } ATTR_PACKED SPI_Multi_Params;
+       } SPI_Multi_Params;
 
        Endpoint_Read_Stream_LE(&SPI_Multi_Params, (sizeof(SPI_Multi_Params) - sizeof(SPI_Multi_Params.TxData)), NULL);
        Endpoint_Read_Stream_LE(&SPI_Multi_Params.TxData, SPI_Multi_Params.TxBytes, NULL);
 
        Endpoint_ClearOUT();
-       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
+       Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPADDR);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
        Endpoint_Write_8(CMD_SPI_MULTI);
@@ -512,14 +515,17 @@ void ISPProtocol_SPIMulti(void)
        }
 }
 
-/** Blocking delay for a given number of milliseconds.
+/** Blocking delay for a given number of milliseconds. This provides a simple wrapper around
+ *  the avr-libc provided delay function, so that the delay function can be called with a
+ *  constant value (to prevent run-time floating point operations being required).
  *
  *  \param[in] DelayMS  Number of milliseconds to delay for
  */
 void ISPProtocol_DelayMS(uint8_t DelayMS)
 {
-       while (DelayMS-- && !(TimeoutExpired))
+       while (DelayMS-- && TimeoutTicksRemaining)
          Delay_MS(1);
 }
 
 #endif
+