Fix AVRISP PDI protocol - make sure inverted masks have the appropriate parenthesis...
[pub/USBasp.git] / Projects / AVRISP / Lib / PDIProtocol.c
index c1e7bf2..28bd540 100644 (file)
@@ -99,15 +99,13 @@ void PDIProtocol_XPROG_Command(void)
 /** Handler for the XPROG ENTER_PROGMODE command to establish a PDI connection with the attached device. */\r
 static void PDIProtocol_EnterXPROGMode(void)\r
 {\r
-       uint8_t ReturnStatus = XPRG_ERR_OK;\r
-\r
        Endpoint_ClearOUT();\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
        \r
        /* Enable PDI programming mode with the attached target */\r
        PDITarget_EnableTargetPDI();\r
        \r
-       /* Store the RESET ket into the RESET PDI register to complete the handshake */\r
+       /* Store the RESET key into the RESET PDI register to keep the XMEGA in reset */\r
        PDITarget_SendByte(PDI_CMD_STCS | PD_RESET_REG);        \r
        PDITarget_SendByte(PDI_RESET_KEY);\r
 \r
@@ -116,14 +114,20 @@ static void PDIProtocol_EnterXPROGMode(void)
        for (uint8_t i = 0; i < sizeof(PDI_NVMENABLE_KEY); i++)\r
          PDITarget_SendByte(PDI_NVMENABLE_KEY[i]);\r
 \r
-       /* Read out the STATUS register to check that NVM access was successfully enabled */\r
-       PDITarget_SendByte(PDI_CMD_LDCS | PD_STATUS_REG);       \r
-       if (!(PDITarget_ReceiveByte() & PDI_STATUS_NVM))\r
-         ReturnStatus = XPRG_ERR_FAILED;\r
+       /* Poll the STATUS register to check to see if NVM access has been enabled */\r
+       uint8_t NVMAttemptsRemaining = 200;\r
+       while (NVMAttemptsRemaining--)\r
+       {\r
+               _delay_ms(1);\r
+               PDITarget_SendByte(PDI_CMD_LDCS | PD_STATUS_REG);\r
+\r
+               if (PDITarget_ReceiveByte() & PDI_STATUS_NVM)\r
+                 break;\r
+       }\r
        \r
        Endpoint_Write_Byte(CMD_XPROG);\r
        Endpoint_Write_Byte(XPRG_CMD_ENTER_PROGMODE);\r
-       Endpoint_Write_Byte(ReturnStatus);\r
+       Endpoint_Write_Byte(NVMAttemptsRemaining ? XPRG_ERR_OK : XPRG_ERR_FAILED);\r
        Endpoint_ClearIN();\r
 }\r
 \r
@@ -135,6 +139,10 @@ static void PDIProtocol_LeaveXPROGMode(void)
        Endpoint_ClearOUT();\r
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
        \r
+       /* Clear the RESET key into the RESET PDI register to allow the XMEGA to run */\r
+       PDITarget_SendByte(PDI_CMD_STCS | PD_RESET_REG);        \r
+       PDITarget_SendByte(0x00);\r
+\r
        PDITarget_DisableTargetPDI();\r
 \r
        Endpoint_Write_Byte(CMD_XPROG);\r