Switch to hardware delays and timeouts via a hardware timer in the V2 Protocol handler.
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 24 Aug 2009 12:49:19 +0000 (12:49 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 24 Aug 2009 12:49:19 +0000 (12:49 +0000)
More additions to the PROGRAM_FLASH_ISP and PROGRAM_EEPROM_ISP commands, although neither work correctly yet.

Added dummy RESET_PROTECTIONS handler to prevent the Atmel driver from crashing when the command returns an UNKNOWN_COMMAND error code.

Projects/Incomplete/AVRISP/AVRISP.c
Projects/Incomplete/AVRISP/Lib/V2Protocol.c
Projects/Incomplete/AVRISP/Lib/V2Protocol.h
Projects/Incomplete/AVRISP/Lib/V2ProtocolParams.c
Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c
Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.h

index f3634fd..32919ef 100644 (file)
@@ -37,6 +37,7 @@
 // TODO: Add reversed target connector checks\r
 // TODO: Add in software SPI for lower programming speeds below 125KHz\r
 // TODO: Add in VTARGET detection\r
+// TODO: Add in software SPI for lower programming speeds\r
 \r
 #include "AVRISP.h"\r
 \r
@@ -72,6 +73,11 @@ void SetupHardware(void)
        /* Hardware Initialization */\r
        LEDs_Init();\r
        USB_Init();\r
+\r
+       /* Millisecond timer initialization for timeout checking */\r
+       OCR0A  = ((F_CPU / 64) / 1000);\r
+       TCCR0A = (1 << WGM01);\r
+       TCCR0B = ((1 << CS01) | (1 << CS00));\r
 }\r
 \r
 /** Event handler for the library USB Connection event. */\r
index 16a1a07..2c29669 100644 (file)
@@ -52,6 +52,9 @@ void V2Protocol_ProcessCommand(void)
                case CMD_LOAD_ADDRESS:\r
                        V2Protocol_Command_LoadAddress();\r
                        break;\r
+               case CMD_RESET_PROTECTION:\r
+                       V2Protocol_Command_ResetProtection();\r
+                       break;\r
                case CMD_ENTER_PROGMODE_ISP:\r
                        V2Protocol_Command_EnterISPMode();\r
                        break;\r
@@ -168,6 +171,16 @@ static void V2Protocol_Command_LoadAddress(void)
        Endpoint_ClearIN();\r
 }\r
 \r
+static void V2Protocol_Command_ResetProtection(void)\r
+{\r
+       Endpoint_ClearOUT();\r
+       Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
+       \r
+       Endpoint_Write_Byte(CMD_RESET_PROTECTION);\r
+       Endpoint_Write_Byte(STATUS_CMD_OK);\r
+       Endpoint_ClearIN();     \r
+}\r
+\r
 static void V2Protocol_Command_EnterISPMode(void)\r
 {\r
        struct\r
@@ -208,7 +221,7 @@ static void V2Protocol_Command_EnterISPMode(void)
                }\r
                \r
                /* Check if polling disabled, or if the polled value matches the expected value */\r
-               if (!Enter_ISP_Params.PollIndex || (ResponseBytes[Enter_ISP_Params.PollIndex - 1] == Enter_ISP_Params.PollValue))\r
+               if (!(Enter_ISP_Params.PollIndex) || (ResponseBytes[Enter_ISP_Params.PollIndex - 1] == Enter_ISP_Params.PollValue))\r
                {\r
                        ResponseStatus = STATUS_CMD_OK;\r
                }\r
@@ -264,6 +277,8 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
        \r
        uint8_t  ProgrammingStatus = STATUS_CMD_OK;     \r
        uint16_t PollAddress       = 0;\r
+       uint8_t  PollValue         = (V2Command == CMD_PROGRAM_FLASH_ISP) ? Write_Memory_Params.PollValue1 :\r
+                                                                           Write_Memory_Params.PollValue2;\r
        \r
        if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK)\r
        {\r
@@ -281,11 +296,11 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
                        SPI_SendByte(CurrentAddress & 0xFF);\r
                        SPI_SendByte(ByteToWrite);\r
                        \r
-                       if (!(PollAddress))\r
+                       if (!(PollAddress) && (ByteToWrite != PollValue))\r
                        {\r
-                               if ((ByteToWrite != Write_Memory_Params.PollValue1) && (V2Command == CMD_PROGRAM_FLASH_ISP))\r
+                               if (V2Command == CMD_PROGRAM_FLASH_ISP)\r
                                  PollAddress = (((CurrentAddress & 0xFFFF) << 1) | IsOddByte);\r
-                               else if ((ByteToWrite != Write_Memory_Params.PollValue2) && (V2Command == CMD_PROGRAM_EEPROM_ISP))\r
+                               else\r
                                  PollAddress = (CurrentAddress & 0xFFFF);                              \r
                        }\r
 \r
@@ -309,7 +324,9 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
                        }\r
                }\r
                \r
-               ProgrammingStatus = V2Protocol_WaitForProgrammingComplete(PollAddress, Write_Memory_Params.ProgrammingMode);\r
+               ProgrammingStatus = V2Protocol_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,\r
+                                                                      Write_Memory_Params.DelayMS, (V2Command == CMD_READ_FLASH_ISP),\r
+                                                                      Write_Memory_Params.ProgrammingCommands[2]);\r
        }\r
        else\r
        {\r
@@ -327,15 +344,20 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
                        SPI_SendByte(CurrentAddress & 0xFF);\r
                        SPI_SendByte(ByteToWrite);\r
                        \r
-                       if ((ByteToWrite != Write_Memory_Params.PollValue1) && (V2Command == CMD_PROGRAM_FLASH_ISP))\r
-                         PollAddress = (((CurrentAddress & 0xFFFF) << 1) | IsOddByte);\r
-                       else if ((ByteToWrite != Write_Memory_Params.PollValue2) && (V2Command == CMD_PROGRAM_EEPROM_ISP))\r
-                         PollAddress = (CurrentAddress & 0xFFFF);\r
-\r
-                       ProgrammingStatus = V2Protocol_WaitForProgrammingComplete(PollAddress, Write_Memory_Params.ProgrammingMode);\r
-\r
+                       if (ByteToWrite != PollValue)\r
+                       {\r
+                               if (V2Command == CMD_PROGRAM_FLASH_ISP)\r
+                                 PollAddress = (((CurrentAddress & 0xFFFF) << 1) | IsOddByte);\r
+                               else\r
+                                 PollAddress = (CurrentAddress & 0xFFFF);\r
+                       }\r
+                       \r
                        if (IsOddByte || (V2Command == CMD_PROGRAM_EEPROM_ISP))\r
                          CurrentAddress++;\r
+                       \r
+                       ProgrammingStatus = V2Protocol_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,\r
+                                                                          Write_Memory_Params.DelayMS, (V2Command == CMD_READ_FLASH_ISP),\r
+                                                                          Write_Memory_Params.ProgrammingCommands[2]);\r
                          \r
                        if (ProgrammingStatus != STATUS_CMD_OK)\r
                          break;\r
@@ -390,7 +412,17 @@ static void V2Protocol_Command_ReadMemory(uint8_t V2Command)
        }\r
 \r
        Endpoint_Write_Byte(STATUS_CMD_OK);\r
+\r
+       bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed());\r
        Endpoint_ClearIN();\r
+       \r
+       /* Ensure last packet is a short packet to terminate the transfer */\r
+       if (IsEndpointFull)\r
+       {\r
+               Endpoint_WaitUntilReady();      \r
+               Endpoint_ClearIN();\r
+               Endpoint_WaitUntilReady();      \r
+       }\r
 }\r
 \r
 static void V2Protocol_Command_ChipErase(void)\r
@@ -412,7 +444,7 @@ static void V2Protocol_Command_ChipErase(void)
        for (uint8_t SByte = 0; SByte < sizeof(Erase_Chip_Params.EraseCommandBytes); SByte++)\r
          SPI_SendByte(Erase_Chip_Params.EraseCommandBytes[SByte]);\r
 \r
-       if (Erase_Chip_Params.PollMethod == 0)\r
+       if (!(Erase_Chip_Params.PollMethod))\r
          V2Protocol_DelayMS(Erase_Chip_Params.EraseDelayMS);\r
        else\r
          ResponseStatus = V2Protocol_WaitWhileTargetBusy();\r
index cd96482..55c1c78 100644 (file)
@@ -56,7 +56,6 @@
                #define PROG_MODE_PAGED_TIMEDELAY_MASK  (1 << 4)\r
                #define PROG_MODE_PAGED_VALUE_MASK      (1 << 5)\r
                #define PROG_MODE_PAGED_READYBUSY_MASK  (1 << 6)\r
-\r
                #define PROG_MODE_COMMIT_PAGE_MASK      (1 << 7)\r
 
        /* Function Prototypes: */\r
@@ -67,6 +66,7 @@
                        static void V2Protocol_Command_SignOn(void);\r
                        static void V2Protocol_Command_GetSetParam(uint8_t V2Command);\r
                        static void V2Protocol_Command_LoadAddress(void);\r
+                       static void V2Protocol_Command_ResetProtection(void);\r
                        static void V2Protocol_Command_EnterISPMode(void);\r
                        static void V2Protocol_Command_LeaveISPMode(void);\r
                        static void V2Protocol_Command_ProgramMemory(uint8_t V2Command);\r
index 74c8f20..a95e875 100644 (file)
@@ -63,7 +63,7 @@ static ParameterItem_t ParameterTable[] =
                  .ParamPrivellages = PARAM_PRIV_READ                    },\r
 \r
                { .ParamID          = PARAM_VTARGET,\r
-                 .ParamValue       = 0x00,\r
+                 .ParamValue       = 0x32,\r
                  .ParamPrivellages = PARAM_PRIV_READ                    },\r
 \r
                { .ParamID          = PARAM_SCK_DURATION,\r
index b2064fc..f9b4427 100644 (file)
@@ -78,22 +78,58 @@ void V2Protocol_ChangeTargetResetLine(bool ResetTarget)
 \r
 void V2Protocol_DelayMS(uint8_t MS)\r
 {\r
-       while (MS--)\r
-         _delay_ms(1);\r
+       TCNT0  = 0;\r
+       while (TCNT0 < MS);\r
 }\r
 \r
-uint8_t V2Protocol_WaitForProgrammingComplete(uint16_t PollAddress, uint8_t ProgrammingMode)\r
+uint8_t V2Protocol_WaitForProgComplete(uint8_t ProgrammingMode, uint16_t PollAddress, uint8_t PollValue,\r
+                                       uint8_t DelayMS, bool IsFlashMemory, uint8_t ReadMemCommand)\r
 {\r
-       // TODO\r
+       uint8_t ProgrammingStatus = STATUS_CMD_OK;\r
 \r
-       return STATUS_CMD_OK;\r
+       /* Determine method of Programming Complete check */\r
+       switch (ProgrammingMode & ~(PROG_MODE_PAGED_WRITES_MASK | PROG_MODE_COMMIT_PAGE_MASK))\r
+       {\r
+               case PROG_MODE_WORD_TIMEDELAY_MASK:\r
+               case PROG_MODE_PAGED_TIMEDELAY_MASK:\r
+                       V2Protocol_DelayMS(DelayMS);\r
+                       break;\r
+               case PROG_MODE_WORD_VALUE_MASK:\r
+               case PROG_MODE_PAGED_VALUE_MASK:\r
+                       if (IsFlashMemory && (PollAddress & 0x01))\r
+                       {\r
+                               ReadMemCommand |= READ_WRITE_ODD_BYTE_MASK;\r
+                               PollAddress >>= 1;\r
+                       }\r
+\r
+                       TCNT0  = 0;\r
+\r
+                       do\r
+                       {\r
+                               SPI_SendByte(ReadMemCommand);\r
+                               SPI_SendByte(PollAddress >> 8);\r
+                               SPI_SendByte(PollAddress & 0xFF);                               \r
+                       }\r
+                       while ((SPI_TransferByte(0x00) != PollValue) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));\r
+\r
+                       if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)\r
+                        ProgrammingStatus = STATUS_RDY_BSY_TOUT;\r
+                       \r
+                       break;          \r
+               case PROG_MODE_WORD_READYBUSY_MASK:\r
+               case PROG_MODE_PAGED_READYBUSY_MASK:\r
+                       ProgrammingStatus = V2Protocol_WaitWhileTargetBusy();\r
+       }\r
+\r
+       return ProgrammingStatus;\r
 }\r
 \r
 uint8_t V2Protocol_WaitWhileTargetBusy(void)\r
 {\r
-       uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;\r
        uint8_t ResponseByte;\r
        \r
+       TCNT0  = 0;\r
+       \r
        do\r
        {\r
                SPI_SendByte(0xF0);\r
@@ -101,13 +137,11 @@ uint8_t V2Protocol_WaitWhileTargetBusy(void)
 \r
                SPI_SendByte(0x00);\r
                ResponseByte = SPI_ReceiveByte();\r
-\r
-               V2Protocol_DelayMS(1);\r
        }\r
-       while ((ResponseByte & 0x01) && (TimeoutMS--));\r
+       while ((ResponseByte & 0x01) && (TCNT0 < TARGET_BUSY_TIMEOUT_MS));\r
 \r
-       if (!(TimeoutMS))\r
-         return STATUS_CMD_TOUT;\r
+       if (TCNT0 >= TARGET_BUSY_TIMEOUT_MS)\r
+         return STATUS_RDY_BSY_TOUT;\r
        else\r
          return STATUS_CMD_OK;\r
 }\r
index 847770c..d67f847 100644 (file)
@@ -48,7 +48,7 @@
                #include "V2ProtocolParams.h"\r
 \r
        /* Macros: */\r
-               #define TARGET_BUSY_TIMEOUT_MS    100\r
+               #define TARGET_BUSY_TIMEOUT_MS    200\r
        \r
        /* External Variables: */\r
                extern uint32_t CurrentAddress;\r
@@ -57,7 +57,8 @@
                        uint8_t V2Protocol_GetSPIPrescalerMask(void);\r
                        void    V2Protocol_ChangeTargetResetLine(bool ResetTarget);\r
                        void    V2Protocol_DelayMS(uint8_t MS);\r
-                       uint8_t V2Protocol_WaitForProgrammingComplete(uint16_t PollAddress, uint8_t ProgrammingMode);\r
+                       uint8_t V2Protocol_WaitForProgComplete(uint8_t ProgrammingMode, uint16_t PollAddress, uint8_t PollValue,\r
+                                                   uint8_t DelayMS, bool IsFlashMemory, uint8_t ReadMemCommand);\r
                        uint8_t V2Protocol_WaitWhileTargetBusy(void);\r
                        void    V2Protocol_LoadExtendedAddress(void);\r
 \r