this software.\r
*/\r
\r
-#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)\r
-\r
-#warning PDI Programming Protocol support is incomplete and not currently suitable for use.\r
-\r
/** \file\r
*\r
* PDI Protocol handler, to process V2 Protocol wrapped PDI commands used in Atmel programmer devices.\r
#define INCLUDE_FROM_PDIPROTOCOL_C\r
#include "PDIProtocol.h"\r
\r
+#if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__)\r
+#warning PDI Programming Protocol support is incomplete and not currently suitable for use.\r
+\r
uint32_t XPROG_Param_NVMBase;\r
uint32_t XPROG_Param_EEPageSize;\r
\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
Endpoint_Write_Byte(CMD_XPROG_SETMODE);\r
- Endpoint_Write_Byte(SetMode_XPROG_Params.Protocol ? STATUS_CMD_FAILED : STATUS_CMD_OK);\r
+ Endpoint_Write_Byte((SetMode_XPROG_Params.Protocol == XPRG_PROTOCOL_PDI) ? STATUS_CMD_OK : STATUS_CMD_FAILED);\r
Endpoint_ClearIN(); \r
}\r
\r
PDITarget_SendByte(PDI_NVMENABLE_KEY[i - 1]);\r
\r
/* Wait until the NVM bus becomes active */\r
- bool NVMBusEnabled = PDITarget_WaitWhileNVMBusBusy();\r
+ bool NVMBusEnabled = NVMTarget_WaitWhileNVMBusBusy();\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_Write_Byte(XPRG_CMD_ENTER_PROGMODE);\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
- /* Clear the RESET key into the RESET PDI register to allow the XMEGA to run */\r
+ /* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */\r
PDITarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG); \r
PDITarget_SendByte(0x00);\r
\r
if (ReadMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG)\r
{\r
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));\r
- PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_CMD);\r
+ NVMTarget_SendNVMRegAddress(NVM_REG_CMD);\r
PDITarget_SendByte(NVM_CMD_READUSERSIG);\r
\r
- \r
+ // TODO\r
}\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
- uint32_t MemoryCRC = 0;\r
- uint8_t CRCReadCommand;\r
+ uint32_t MemoryCRC;\r
\r
if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP)\r
- CRCReadCommand = NVM_CMD_APPCRC;\r
+ MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_APPCRC);\r
else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT)\r
- CRCReadCommand = NVM_CMD_BOOTCRC;\r
+ MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_BOOTCRC);\r
else\r
- CRCReadCommand = NVM_CMD_FLASHCRC;\r
- \r
- /* Set the NVM command to the correct CRC read command */\r
- PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));\r
- PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_CMD);\r
- PDITarget_SendByte(CRCReadCommand);\r
-\r
- /* Set CMDEX bit in NVM CTRLA register to start the CRC generation */\r
- PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));\r
- PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_CTRLA);\r
- PDITarget_SendByte(1 << 0);\r
-\r
- /* Wait until the NVM bus and controller is no longer busy */\r
- PDITarget_WaitWhileNVMBusBusy();\r
- PDITarget_WaitWhileNVMControllerBusy();\r
- \r
- /* Read the three byte generated CRC value */\r
- PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_3BYTES << 2));\r
- PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_DAT0);\r
- MemoryCRC = PDITarget_ReceiveByte();\r
- MemoryCRC |= ((uint16_t)PDITarget_ReceiveByte() << 8);\r
- MemoryCRC |= ((uint32_t)PDITarget_ReceiveByte() << 16);\r
+ MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_FLASHCRC);\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_Write_Byte(XPRG_CMD_CRC);\r
uint8_t XPROGParam = Endpoint_Read_Byte();\r
\r
if (XPROGParam == XPRG_PARAM_NVMBASE)\r
- XPROG_Param_NVMBase = Endpoint_Read_DWord_LE();\r
+ XPROG_Param_NVMBase = Endpoint_Read_DWord_BE();\r
else if (XPROGParam == XPRG_PARAM_EEPPAGESIZE)\r
- XPROG_Param_EEPageSize = Endpoint_Read_Word_LE();\r
+ XPROG_Param_EEPageSize = Endpoint_Read_Word_BE();\r
else\r
ReturnStatus = XPRG_ERR_FAILED;\r
\r