Fixed programming errors in the AVRISP-MKII project when the programming packet is...
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / XPROG / XPROGProtocol.c
index c89f94f..ffc07ad 100644 (file)
@@ -143,6 +143,8 @@ static void XPROGProtocol_LeaveXPROGMode(void)
          TINYNVM_DisableTPI();
 
        #if defined(XCK_RESCUE_CLOCK_ENABLE) && defined(ENABLE_ISP_PROTOCOL)
+       /* If the XCK rescue clock option is enabled, we need to restart it once the 
+        * XPROG mode has been exited, since the XPROG protocol stops it after use. */
        ISPTarget_ConfigureRescueClock();
        #endif
 
@@ -248,6 +250,15 @@ static void XPROGProtocol_WriteMemory(void)
        WriteMemory_XPROG_Params.Length  = SwapEndian_16(WriteMemory_XPROG_Params.Length);
        Endpoint_Read_Stream_LE(&WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length, NULL);
 
+       // The driver will terminate transfers that are a round multiple of the endpoint bank in size with a ZLP, need
+       // to catch this and discard it before continuing on with packet processing to prevent communication issues
+       if (((sizeof(uint8_t) + sizeof(WriteMemory_XPROG_Params) - sizeof(WriteMemory_XPROG_Params.ProgData)) +
+           WriteMemory_XPROG_Params.Length) % AVRISP_DATA_EPSIZE == 0)
+       {
+               Endpoint_ClearOUT();
+               Endpoint_WaitUntilReady();
+       }
+       
        Endpoint_ClearOUT();
        Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);