+}
+
+/** Enables the physical PDI interface on the target and enables access to the internal NVM controller.
+ *
+ *  \return Boolean \c true if the PDI interface was enabled successfully, \c 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_REG_RESET));
+       XPROGTarget_SendByte(PDI_RESET_KEY);
+
+       /* Lower direction change guard time to 32 USART bits */
+       XPROGTarget_SendByte(PDI_CMD_STCS(PDI_REG_CTRL));
+       XPROGTarget_SendByte(0x02);
+
+       /* 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 - 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_REG_RESET));
+               XPROGTarget_SendByte(0x00);
+
+               /* Read back the reset register, check to see if it took effect */
+               XPROGTarget_SendByte(PDI_CMD_LDCS(PDI_REG_RESET));
+       } while (XPROGTarget_ReceiveByte() != 0x00);
+
+       XPROGTarget_DisableTargetPDI();