aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-11-16 13:14:27 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-11-16 13:14:27 +0000
commitcbc00c843a3107b8c76f0b3f1e3425f924518416 (patch)
tree00776d360607a273bcb4abafb47133a3887761a5 /Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
parenta9f313afa9a65a692718b8609fd47ae1dcb60523 (diff)
downloadlufa-cbc00c843a3107b8c76f0b3f1e3425f924518416.tar.gz
lufa-cbc00c843a3107b8c76f0b3f1e3425f924518416.tar.bz2
lufa-cbc00c843a3107b8c76f0b3f1e3425f924518416.zip
Fixed AVRISP-MKII clone project not starting the target's program automatically after exiting TPI programming mode.
Diffstat (limited to 'Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c')
-rw-r--r--Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
index 60e755265..378e691ad 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.c
@@ -105,6 +105,7 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void)
{
/* 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 */
@@ -117,6 +118,48 @@ bool XMEGANVM_WaitWhileNVMControllerBusy(void)
}
}
+/** Enables the physical PDI interface on the target and enables access to the internal NVM controller.
+ *
+ * \return Boolean true if the PDI interface was enabled successfully, false otherwise
+ */
+bool XMEGANVM_EnablePDI(void)
+{
+ /* Enable PDI programming mode with the attached target */
+ XPROGTarget_EnableTargetPDI();
+
+ /* Store the RESET key into the RESET PDI register to keep the XMEGA in reset */
+ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
+ XPROGTarget_SendByte(PDI_RESET_KEY);
+
+ /* Lower direction change guard time to 0 USART bits */
+ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_CTRL_REG);
+ XPROGTarget_SendByte(0x07);
+
+ /* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
+ XPROGTarget_SendByte(PDI_CMD_KEY);
+ for (uint8_t i = sizeof(PDI_NVMENABLE_KEY); i > 0; i--)
+ XPROGTarget_SendByte(PDI_NVMENABLE_KEY[i - 1]);
+
+ /* Wait until the NVM bus becomes active */
+ return XMEGANVM_WaitWhileNVMBusBusy();
+}
+
+/** Removes access to the target's NVM controller and physically disables the target's physical PDI interface. */
+void XMEGANVM_DisablePDI(void)
+{
+ 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);
+
+ /* Do it twice to make sure it takes effect (silicon bug?) */
+ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);
+ XPROGTarget_SendByte(0x00);
+
+ XPROGTarget_DisableTargetPDI();
+}
+
/** Retrieves the CRC value of the given memory space.
*
* \param[in] CRCCommand NVM CRC command to issue to the target