aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-11-16 12:30:00 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-11-16 12:30:00 +0000
commita9f313afa9a65a692718b8609fd47ae1dcb60523 (patch)
treec43f06af3c44b189de5982af82ee185fbe86d04a /Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
parent002cd6df49981ad75b2092f2ae6b3efc4e2dd364 (diff)
downloadlufa-a9f313afa9a65a692718b8609fd47ae1dcb60523.tar.gz
lufa-a9f313afa9a65a692718b8609fd47ae1dcb60523.tar.bz2
lufa-a9f313afa9a65a692718b8609fd47ae1dcb60523.zip
Slow AVRISP-MKII clone PDI/TPI programming speed back to 250KHz due to issues with the XPLAINBridge when PDI programming at faster rates.
Speed up XMEGANVM_WaitWhileNVMControllerBusy() by preloading the status register address into the pointer register of the target's NVM controller and then reading via a faster indirect load command.
Diffstat (limited to 'Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c')
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
index ce02ebe95..60e755265 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
@@ -96,13 +96,15 @@ bool XMEGANVM_WaitWhileNVMBusBusy(void)
*/
bool XMEGANVM_WaitWhileNVMControllerBusy(void)
{
+ /* Preload the pointer register with the NVM STATUS register address to check the BUSY flag */
+ XPROGTarget_SendByte(PDI_CMD_ST | (PDI_POINTER_DIRECT << 2) | PDI_DATSIZE_4BYTES);
+ XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_STATUS);
+
/* Poll the NVM STATUS register while the NVM controller is busy */
for (;;)
{
- /* Send a LDS command to read the NVM STATUS register to check the BUSY flag */
- XPROGTarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
- XMEGANVM_SendNVMRegAddress(XMEGA_NVM_REG_STATUS);
-
+ /* Fetch the current status value via the pointer register (without auto-increment afterwards) */
+ XPROGTarget_SendByte(PDI_CMD_LD | (PDI_POINTER_INDIRECT << 2) | PDI_DATSIZE_1BYTE);
uint8_t StatusRegister = XPROGTarget_ReceiveByte();
/* We might have timed out waiting for the status register read response, check here */