mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-06-12 03:44:19 +00:00
Added memory erase handling to the PDI protocol in the AVRISP project.
This commit is contained in:
parent
8a55d80e7e
commit
48e50b6b57
@ -137,4 +137,31 @@ void NVMTarget_ReadMemory(uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t Re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NVMTarget_EraseMemory(uint8_t EraseCommand, uint32_t Address)
|
||||||
|
{
|
||||||
|
NVMTarget_WaitWhileNVMControllerBusy();
|
||||||
|
|
||||||
|
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendNVMRegAddress(NVM_REG_CMD);
|
||||||
|
PDITarget_SendByte(EraseCommand);
|
||||||
|
|
||||||
|
if (EraseCommand == NVM_CMD_CHIPERASE)
|
||||||
|
{
|
||||||
|
/* Set CMDEX bit in NVM CTRLA register to start the chip erase */
|
||||||
|
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendNVMRegAddress(NVM_REG_CTRLA);
|
||||||
|
PDITarget_SendByte(1 << 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Other erase modes just need us to address a byte within the target memory space */
|
||||||
|
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendAddress(Address);
|
||||||
|
PDITarget_SendByte(0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
NVMTarget_WaitWhileNVMBusBusy();
|
||||||
|
NVMTarget_WaitWhileNVMControllerBusy();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -117,5 +117,6 @@
|
|||||||
void NVMTarget_WaitWhileNVMControllerBusy(void);
|
void NVMTarget_WaitWhileNVMControllerBusy(void);
|
||||||
uint32_t NVMTarget_GetMemoryCRC(uint8_t MemoryCommand);
|
uint32_t NVMTarget_GetMemoryCRC(uint8_t MemoryCommand);
|
||||||
void NVMTarget_ReadMemory(uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadSize);
|
void NVMTarget_ReadMemory(uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadSize);
|
||||||
|
void NVMTarget_EraseMemory(uint8_t EraseCommand, uint32_t Address);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -154,11 +154,31 @@ static void PDIProtocol_Erase(void)
|
|||||||
} Erase_XPROG_Params;
|
} Erase_XPROG_Params;
|
||||||
|
|
||||||
Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params));
|
Endpoint_Read_Stream_LE(&Erase_XPROG_Params, sizeof(Erase_XPROG_Params));
|
||||||
|
Erase_XPROG_Params.Address = SwapEndian_32(Erase_XPROG_Params.Address);
|
||||||
|
|
||||||
Endpoint_ClearOUT();
|
Endpoint_ClearOUT();
|
||||||
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
||||||
|
|
||||||
// TODO: Send erase command here via PDI protocol
|
uint8_t EraseCommand;
|
||||||
|
|
||||||
|
if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_CHIP)
|
||||||
|
EraseCommand = NVM_CMD_CHIPERASE;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP)
|
||||||
|
EraseCommand = NVM_CMD_ERASEAPPSEC;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT)
|
||||||
|
EraseCommand = NVM_CMD_ERASEBOOTSEC;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM)
|
||||||
|
EraseCommand = NVM_CMD_ERASEEEPROM;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_APP_PAGE)
|
||||||
|
EraseCommand = NVM_CMD_ERASEAPPSECPAGE;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_BOOT_PAGE)
|
||||||
|
EraseCommand = NVM_CMD_ERASEBOOTSECPAGE;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_EEPROM_PAGE)
|
||||||
|
EraseCommand = NVM_CMD_ERASEEEPROMPAGE;
|
||||||
|
else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_USERSIG)
|
||||||
|
EraseCommand = NVM_CMD_ERASEUSERSIG;
|
||||||
|
|
||||||
|
NVMTarget_EraseMemory(EraseCommand, Erase_XPROG_Params.Address);
|
||||||
|
|
||||||
Endpoint_Write_Byte(CMD_XPROG);
|
Endpoint_Write_Byte(CMD_XPROG);
|
||||||
Endpoint_Write_Byte(XPRG_CMD_ERASE);
|
Endpoint_Write_Byte(XPRG_CMD_ERASE);
|
||||||
|
Loading…
Reference in New Issue
Block a user