X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/48e50b6b578fa7a74b4f33f067aa684e3469850e..79efd8c79e723adb3392367ae62356c5c3a835d0:/Projects/AVRISP/Lib/PDIProtocol.c diff --git a/Projects/AVRISP/Lib/PDIProtocol.c b/Projects/AVRISP/Lib/PDIProtocol.c index 39f33cf49..aa03fc494 100644 --- a/Projects/AVRISP/Lib/PDIProtocol.c +++ b/Projects/AVRISP/Lib/PDIProtocol.c @@ -37,9 +37,12 @@ #include "PDIProtocol.h" #if defined(ENABLE_PDI_PROTOCOL) || defined(__DOXYGEN__) -#warning PDI Programming Protocol support is incomplete and not currently suitable for use. +#warning PDI Programming Protocol support is incomplete and not currently suitable for general use. +/** Base absolute address for the target's NVM controller */ uint32_t XPROG_Param_NVMBase; + +/** Size in bytes of the target's EEPROM page */ uint32_t XPROG_Param_EEPageSize; /** Handler for the CMD_XPROG_SETMODE command, which sets the programmer-to-target protocol used for PDI @@ -114,7 +117,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); @@ -159,7 +162,7 @@ static void PDIProtocol_Erase(void) Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); - uint8_t EraseCommand; + uint8_t EraseCommand = NVM_CMD_NOOP; if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_CHIP) EraseCommand = NVM_CMD_CHIPERASE; @@ -178,7 +181,8 @@ static void PDIProtocol_Erase(void) else if (Erase_XPROG_Params.MemoryType == XPRG_ERASE_USERSIG) EraseCommand = NVM_CMD_ERASEUSERSIG; - NVMTarget_EraseMemory(EraseCommand, Erase_XPROG_Params.Address); + if (!(NVMTarget_EraseMemory(EraseCommand, Erase_XPROG_Params.Address))) + ReturnStatus = XPRG_ERR_TIMEOUT; Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_ERASE); @@ -194,6 +198,7 @@ static void PDIProtocol_WriteMemory(void) struct { uint8_t MemoryType; + uint8_t PageMode; uint32_t Address; uint16_t Length; uint8_t ProgData[256]; @@ -207,11 +212,70 @@ static void PDIProtocol_WriteMemory(void) Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); + + + uint8_t WriteCommand = NVM_CMD_NOOP; + uint8_t WriteBuffCommand = NVM_CMD_NOOP; + uint8_t EraseBuffCommand = NVM_CMD_NOOP; + bool PagedMemory = false; - // TODO: Send program command here via PDI protocol + if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_APPL) + { + WriteCommand = NVM_CMD_ERASEWRITEFLASH; + WriteBuffCommand = NVM_CMD_LOADFLASHPAGEBUFF; + EraseBuffCommand = NVM_CMD_ERASEFLASHPAGEBUFF; + PagedMemory = true; + } + else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_BOOT) + { + WriteCommand = NVM_CMD_ERASEWRITEFLASH; + WriteBuffCommand = NVM_CMD_LOADFLASHPAGEBUFF; + EraseBuffCommand = NVM_CMD_ERASEFLASHPAGEBUFF; + PagedMemory = true; + } + else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_EEPROM) + { + WriteCommand = NVM_CMD_ERASEWRITEEEPROMPAGE; + WriteBuffCommand = NVM_CMD_LOADEEPROMPAGEBUFF; + EraseBuffCommand = NVM_CMD_ERASEEEPROMPAGEBUFF; + PagedMemory = true; + } + else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG) + { + WriteCommand = NVM_CMD_WRITEUSERSIG; + WriteBuffCommand = NVM_CMD_LOADFLASHPAGEBUFF; + EraseBuffCommand = NVM_CMD_ERASEFLASHPAGEBUFF; + PagedMemory = true; + } + else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_FUSE) + { + WriteCommand = NVM_CMD_WRITEFUSE; + } + else if (WriteMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_LOCKBITS) + { + WriteCommand = NVM_CMD_WRITELOCK; + } + + if (PagedMemory) + { + if (!(NVMTarget_WritePageMemory(WriteBuffCommand, EraseBuffCommand, WriteCommand, + WriteMemory_XPROG_Params.PageMode, WriteMemory_XPROG_Params.Address, + WriteMemory_XPROG_Params.ProgData, WriteMemory_XPROG_Params.Length))) + { + ReturnStatus = XPRG_ERR_TIMEOUT; + } + } + else + { + if (!(NVMTarget_WriteByteMemory(WriteCommand, WriteMemory_XPROG_Params.Address, WriteMemory_XPROG_Params.ProgData, + WriteMemory_XPROG_Params.Length))) + { + ReturnStatus = XPRG_ERR_TIMEOUT; + } + } Endpoint_Write_Byte(CMD_XPROG); - Endpoint_Write_Byte(XPRG_CMD_READ_MEM); + Endpoint_Write_Byte(XPRG_CMD_WRITE_MEM); Endpoint_Write_Byte(ReturnStatus); Endpoint_ClearIN(); } @@ -238,7 +302,9 @@ static void PDIProtocol_ReadMemory(void) Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); uint8_t ReadBuffer[ReadMemory_XPROG_Params.Length]; - NVMTarget_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length); + + if (!(NVMTarget_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length))) + ReturnStatus = XPRG_ERR_TIMEOUT; Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_READ_MEM); @@ -266,8 +332,8 @@ static void PDIProtocol_ReadCRC(void) Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); + uint8_t CRCCommand = NVM_CMD_NOOP; uint32_t MemoryCRC; - uint8_t CRCCommand; if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP) CRCCommand = NVM_CMD_APPCRC; @@ -276,7 +342,8 @@ static void PDIProtocol_ReadCRC(void) else CRCCommand = NVM_CMD_FLASHCRC; - MemoryCRC = NVMTarget_GetMemoryCRC(CRCCommand); + if (!(NVMTarget_GetMemoryCRC(CRCCommand, &MemoryCRC))) + ReturnStatus = XPRG_ERR_TIMEOUT; Endpoint_Write_Byte(CMD_XPROG); Endpoint_Write_Byte(XPRG_CMD_CRC);