Add new tag for the LUFA-120219-BETA release.
[pub/USBasp.git] / Projects / AVRISP-MKII / Lib / XPROG / XMEGANVM.c
index b1fea59..820374f 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 static void XMEGANVM_SendAddress(const uint32_t AbsoluteAddress)
 {
        /* Send the given 32-bit address to the target, LSB first */
 static void XMEGANVM_SendAddress(const uint32_t AbsoluteAddress)
 {
        /* Send the given 32-bit address to the target, LSB first */
-       XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[0]);
-       XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[1]);
-       XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[2]);
-       XPROGTarget_SendByte(((uint8_t*)&AbsoluteAddress)[3]);
+       XPROGTarget_SendByte(AbsoluteAddress &  0xFF);
+       XPROGTarget_SendByte(AbsoluteAddress >> 8);
+       XPROGTarget_SendByte(AbsoluteAddress >> 16);
+       XPROGTarget_SendByte(AbsoluteAddress >> 24);
 }
 
 /** Sends the given NVM register address to the target.
 }
 
 /** Sends the given NVM register address to the target.
@@ -149,13 +149,18 @@ void XMEGANVM_DisablePDI(void)
 {
        XMEGANVM_WaitWhileNVMBusBusy();
 
 {
        XMEGANVM_WaitWhileNVMBusBusy();
 
-       /* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */
-       XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
-       XPROGTarget_SendByte(0x00);
+       /* Clear the RESET key in the RESET PDI register to allow the XMEGA to run - must perform this until the
+        * change takes effect, as in some cases it takes multiple writes (silicon bug?).
+        */
+       do
+       {
+               /* Clear reset register */
+               XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
+               XPROGTarget_SendByte(0x00);
 
 
-       /* Do it twice to make sure it takes effect (silicon bug?) */
-       XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
-       XPROGTarget_SendByte(0x00);
+               /* Read back the reset register, check to see if it took effect */
+               XPROGTarget_SendByte(PDI_CMD_LDCS | PDI_RESET_REG);
+       } while (XPROGTarget_ReceiveByte() != 0x00);
 
        XPROGTarget_DisableTargetPDI();
 }
 
        XPROGTarget_DisableTargetPDI();
 }