/** Removes access to the target's NVM controller and physically disables the target's physical TPI interface. */ void TINYNVM_DisableTPI(void) { TINYNVM_WaitWhileNVMBusBusy(); /* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */ XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG); XPROGTarget_SendByte(0x00); XPROGTarget_DisableTargetTPI(); }
/** Removes access to the target's NVM controller and physically disables the target's physical TPI interface. */ void TINYNVM_DisableTPI(void) { TINYNVM_WaitWhileNVMBusBusy(); do { /* Clear the NVMEN bit in the TPI STATUS register to disable TPI mode */ XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_STATUS_REG); XPROGTarget_SendByte(0x00); /* Read back the STATUS register, check to see if it took effect */ XPROGTarget_SendByte(TPI_CMD_SLDCS | PDI_RESET_REG); } while (XPROGTarget_ReceiveByte() != 0x00); XPROGTarget_DisableTargetTPI(); }
/** Handler for the XPROG LEAVE_PROGMODE command to terminate the PDI programming connection with * the attached device. */ static void XPROGProtocol_LeaveXPROGMode(void) { Endpoint_ClearOUT(); Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI) { 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 affect (silicon bug?) */ XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); XPROGTarget_SendByte(0x00); XPROGTarget_DisableTargetPDI(); } else { TINYNVM_WaitWhileNVMBusBusy(); /* Clear the NVMEN bit in the TPI CONTROL register to disable TPI mode */ XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_CTRL_REG); XPROGTarget_SendByte(0x00); XPROGTarget_DisableTargetTPI(); } Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_LEAVE_PROGMODE); Endpoint_Write_Byte(XPRG_ERR_OK); Endpoint_ClearIN(); }