aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-01-17 04:39:33 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-01-17 04:39:33 +0000
commitf3d370a7778dc8e374efc3b76e26f8ecefc27e84 (patch)
tree8e6b6a3842e05e78d7bb51a38975ff09286558c0 /Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
parentb0ce1eab668ac2e4779bbf8c3e6ef193d0ab0368 (diff)
downloadlufa-f3d370a7778dc8e374efc3b76e26f8ecefc27e84.tar.gz
lufa-f3d370a7778dc8e374efc3b76e26f8ecefc27e84.tar.bz2
lufa-f3d370a7778dc8e374efc3b76e26f8ecefc27e84.zip
Clean up and add more comments to the AVRISP-MKII project. Make sure the SPI_MULTI command handler supports multiple packet responses. Use slightly smaller/faster repeated indirect-load commands when retrieving the PDI target's memory CRCs.
Diffstat (limited to 'Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c')
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
index c23b9d75b..573f8fde5 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
@@ -136,24 +136,18 @@ bool XMEGANVM_GetMemoryCRC(const uint8_t CRCCommand, uint32_t* const CRCDest)
if (!(XMEGANVM_WaitWhileNVMControllerBusy()))
return false;
- uint32_t MemoryCRC = 0;
-
- /* Read the first generated CRC byte value */
- XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
+ /* Load the PDI pointer register with the DAT0 register start address */
+ XPROGTarget_SendByte(PDI_CMD_ST | (PDI_POINTER_DIRECT << 2) | PDI_DATSIZE_4BYTES);
XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_DAT0);
- MemoryCRC = XPROGTarget_ReceiveByte();
-
- /* Read the second generated CRC byte value */
- XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
- XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_DAT1);
- MemoryCRC |= ((uint16_t)XPROGTarget_ReceiveByte() << 8);
- /* Read the third generated CRC byte value */
- XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
- XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_DAT2);
- MemoryCRC |= ((uint32_t)XPROGTarget_ReceiveByte() << 16);
+ /* Send the REPEAT command to grab the CRC bytes */
+ XPROGTarget_SendByte(PDI_CMD_REPEAT | PDI_DATSIZE_1BYTE);
+ XPROGTarget_SendByte(XMEGA_CRC_LENGTH - 1);
- *CRCDest = MemoryCRC;
+ /* Read in the CRC bytes from the target */
+ XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT_PI << 2) | PDI_DATSIZE_1BYTE);
+ for (uint8_t i = 0; i < XMEGA_CRC_LENGTH; i++)
+ ((uint8_t*)CRCDest)[i] = XPROGTarget_ReceiveByte();
return true;
}