More minor speedups to the AVRISP-MKII clone programmer PDI memory reading code.
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 27 Oct 2013 17:26:11 +0000 (18:26 +0100)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 27 Oct 2013 17:26:11 +0000 (18:26 +0100)
Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c

index 43c540e..3d7b913 100644 (file)
@@ -236,21 +236,28 @@ bool XMEGANVM_ReadMemory(const uint32_t ReadAddress,
        XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_CMD);
        XPROGTarget_SendByte(XMEGA_NVM_CMD_READNVM);
 
        XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_CMD);
        XPROGTarget_SendByte(XMEGA_NVM_CMD_READNVM);
 
-       /* Load the PDI pointer register with the start address we want to read from */
-       XPROGTarget_SendByte(PDI_CMD_ST | (PDI_POINTER_DIRECT << 2) | PDI_DATSIZE_4BYTES);
-       XMEGANVM_SendAddress(ReadAddress);
-
        if (ReadSize > 1)
        {
        if (ReadSize > 1)
        {
+               /* Load the PDI pointer register with the start address we want to read from */
+               XPROGTarget_SendByte(PDI_CMD_ST | (PDI_POINTER_DIRECT << 2) | PDI_DATSIZE_4BYTES);
+               XMEGANVM_SendAddress(ReadAddress);
+
                /* Send the REPEAT command with the specified number of bytes to read */
                XPROGTarget_SendByte(PDI_CMD_REPEAT | PDI_DATSIZE_1BYTE);
                XPROGTarget_SendByte(ReadSize - 1);
                /* Send the REPEAT command with the specified number of bytes to read */
                XPROGTarget_SendByte(PDI_CMD_REPEAT | PDI_DATSIZE_1BYTE);
                XPROGTarget_SendByte(ReadSize - 1);
-       }
 
 
-       /* Send a LD command with indirect access and post-increment to read out the bytes */
-       XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
-       while (ReadSize-- && TimeoutTicksRemaining)
-         *(ReadBuffer++) = XPROGTarget_ReceiveByte();
+               /* Send a LD command with indirect access and post-increment to read out the bytes */
+               XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
+               while (ReadSize-- && TimeoutTicksRemaining)
+                 *(ReadBuffer++) = XPROGTarget_ReceiveByte();
+       }
+       else
+       {
+               /* Send a LDS command with the read address to read out the requested byte */
+               XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
+               XMEGANVM_SendAddress(ReadAddress);
+               *(ReadBuffer++) = XPROGTarget_ReceiveByte();
+       }
 
        return (TimeoutTicksRemaining > 0);
 }
 
        return (TimeoutTicksRemaining > 0);
 }