X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/1fa27139f5c195c0d7147dac0c5332a6ea10229a..f3e4fbe5126fc8edf40a0b0ace2d3437ee988d2e:/Projects/AVRISP/Lib/PDIProtocol.c diff --git a/Projects/AVRISP/Lib/PDIProtocol.c b/Projects/AVRISP/Lib/PDIProtocol.c index a7b11557c..af6fbeaf9 100644 --- a/Projects/AVRISP/Lib/PDIProtocol.c +++ b/Projects/AVRISP/Lib/PDIProtocol.c @@ -114,7 +114,7 @@ static void PDIProtocol_EnterXPROGMode(void) PDITarget_SendByte(PDI_NVMENABLE_KEY[i - 1]); /* Wait until the NVM bus becomes active */ - bool NVMBusEnabled = NVMTarget_WaitWhileNVMBusBusy(); + bool NVMBusEnabled = PDITarget_WaitWhileNVMBusBusy(); Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_ENTER_PROGMODE); @@ -154,11 +154,31 @@ static void PDIProtocol_Erase(void) } 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_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(XPRG_CMD_ERASE); @@ -216,20 +236,17 @@ static void PDIProtocol_ReadMemory(void) Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); - - if (ReadMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG) - { - PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2)); - NVMTarget_SendNVMRegAddress(NVM_REG_CMD); - PDITarget_SendByte(NVM_CMD_READUSERSIG); - // TODO - } - + uint8_t ReadBuffer[ReadMemory_XPROG_Params.Length]; + NVMTarget_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length); + Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_READ_MEM); Endpoint_Write_Byte(ReturnStatus); + if (ReturnStatus == XPRG_ERR_OK) + Endpoint_Write_Stream_LE(ReadBuffer, ReadMemory_XPROG_Params.Length); + Endpoint_ClearIN(); } @@ -250,13 +267,16 @@ static void PDIProtocol_ReadCRC(void) Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); uint32_t MemoryCRC; + uint8_t CRCCommand; if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP) - MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_APPCRC); + CRCCommand = NVM_CMD_APPCRC; else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT) - MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_BOOTCRC); + CRCCommand = NVM_CMD_BOOTCRC; else - MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_FLASHCRC); + CRCCommand = NVM_CMD_FLASHCRC; + + MemoryCRC = NVMTarget_GetMemoryCRC(CRCCommand); Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_CRC);