}\r
}\r
\r
+void NVMTarget_EraseMemory(uint8_t EraseCommand, uint32_t Address)\r
+{\r
+ NVMTarget_WaitWhileNVMControllerBusy();\r
+\r
+ PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));\r
+ NVMTarget_SendNVMRegAddress(NVM_REG_CMD);\r
+ PDITarget_SendByte(EraseCommand);\r
+ \r
+ if (EraseCommand == NVM_CMD_CHIPERASE)\r
+ {\r
+ /* Set CMDEX bit in NVM CTRLA register to start the chip erase */\r
+ PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));\r
+ NVMTarget_SendNVMRegAddress(NVM_REG_CTRLA);\r
+ PDITarget_SendByte(1 << 0); \r
+ }\r
+ else\r
+ {\r
+ /* Other erase modes just need us to address a byte within the target memory space */\r
+ PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));\r
+ NVMTarget_SendAddress(Address); \r
+ PDITarget_SendByte(0x00);\r
+ }\r
+ \r
+ NVMTarget_WaitWhileNVMBusBusy();\r
+ NVMTarget_WaitWhileNVMControllerBusy();\r
+}\r
+\r
#endif\r
void NVMTarget_WaitWhileNVMControllerBusy(void);\r
uint32_t NVMTarget_GetMemoryCRC(uint8_t MemoryCommand);\r
void NVMTarget_ReadMemory(uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadSize);\r
+ void NVMTarget_EraseMemory(uint8_t EraseCommand, uint32_t Address);\r
\r
#endif\r
} Erase_XPROG_Params;\r
\r
Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params));\r
+ Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address);\r
\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
- // TODO: Send erase command here via PDI protocol\r
+ uint8_t EraseCommand;\r
+ \r
+ if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_CHIP)\r
+ EraseCommand = NVM_CMD_CHIPERASE;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP)\r
+ EraseCommand = NVM_CMD_ERASEAPPSEC;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT)\r
+ EraseCommand = NVM_CMD_ERASEBOOTSEC;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM)\r
+ EraseCommand = NVM_CMD_ERASEEEPROM;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP_PAGE)\r
+ EraseCommand = NVM_CMD_ERASEAPPSECPAGE;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT_PAGE)\r
+ EraseCommand = NVM_CMD_ERASEBOOTSECPAGE;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM_PAGE)\r
+ EraseCommand = NVM_CMD_ERASEEEPROMPAGE;\r
+ else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_USERSIG)\r
+ EraseCommand = NVM_CMD_ERASEUSERSIG;\r
+ \r
+ NVMTarget_EraseMemory(EraseCommand, Erase_XPROG_Params.Address);\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_Write_Byte(XPRG_CMD_ERASE);\r