forked from mfulz_github/qmk_firmware
Fix NVM commands so that memory reads and CRC generations now work correctly using unoptimized PDI commands.
This commit is contained in:
parent
1fa27139f5
commit
8a55d80e7e
|
@ -42,10 +42,18 @@ void NVMTarget_SendNVMRegAddress(uint8_t Register)
|
||||||
{
|
{
|
||||||
uint32_t Address = XPROG_Param_NVMBase | Register;
|
uint32_t Address = XPROG_Param_NVMBase | Register;
|
||||||
|
|
||||||
PDITarget_SendByte(Address >> 24);
|
|
||||||
PDITarget_SendByte(Address >> 26);
|
|
||||||
PDITarget_SendByte(Address >> 8);
|
|
||||||
PDITarget_SendByte(Address & 0xFF);
|
PDITarget_SendByte(Address & 0xFF);
|
||||||
|
PDITarget_SendByte(Address >> 8);
|
||||||
|
PDITarget_SendByte(Address >> 16);
|
||||||
|
PDITarget_SendByte(Address >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NVMTarget_SendAddress(uint32_t AbsoluteAddress)
|
||||||
|
{
|
||||||
|
PDITarget_SendByte(AbsoluteAddress & 0xFF);
|
||||||
|
PDITarget_SendByte(AbsoluteAddress >> 8);
|
||||||
|
PDITarget_SendByte(AbsoluteAddress >> 16);
|
||||||
|
PDITarget_SendByte(AbsoluteAddress >> 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NVMTarget_WaitWhileNVMBusBusy(void)
|
bool NVMTarget_WaitWhileNVMBusBusy(void)
|
||||||
|
@ -68,7 +76,7 @@ void NVMTarget_WaitWhileNVMControllerBusy(void)
|
||||||
/* Poll the NVM STATUS register while the NVM controller is busy */
|
/* Poll the NVM STATUS register while the NVM controller is busy */
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_1BYTE << 2));
|
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
NVMTarget_SendNVMRegAddress(NVM_REG_STATUS);
|
NVMTarget_SendNVMRegAddress(NVM_REG_STATUS);
|
||||||
|
|
||||||
if (!(PDITarget_ReceiveByte() & (1 << 7)))
|
if (!(PDITarget_ReceiveByte() & (1 << 7)))
|
||||||
|
@ -80,13 +88,15 @@ uint32_t NVMTarget_GetMemoryCRC(uint8_t MemoryCommand)
|
||||||
{
|
{
|
||||||
uint32_t MemoryCRC;
|
uint32_t MemoryCRC;
|
||||||
|
|
||||||
|
NVMTarget_WaitWhileNVMControllerBusy();
|
||||||
|
|
||||||
/* Set the NVM command to the correct CRC read command */
|
/* Set the NVM command to the correct CRC read command */
|
||||||
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));
|
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
NVMTarget_SendNVMRegAddress(NVM_REG_CMD);
|
NVMTarget_SendNVMRegAddress(NVM_REG_CMD);
|
||||||
PDITarget_SendByte(MemoryCommand);
|
PDITarget_SendByte(MemoryCommand);
|
||||||
|
|
||||||
/* Set CMDEX bit in NVM CTRLA register to start the CRC generation */
|
/* Set CMDEX bit in NVM CTRLA register to start the CRC generation */
|
||||||
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));
|
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
NVMTarget_SendNVMRegAddress(NVM_REG_CTRLA);
|
NVMTarget_SendNVMRegAddress(NVM_REG_CTRLA);
|
||||||
PDITarget_SendByte(1 << 0);
|
PDITarget_SendByte(1 << 0);
|
||||||
|
|
||||||
|
@ -94,14 +104,37 @@ uint32_t NVMTarget_GetMemoryCRC(uint8_t MemoryCommand)
|
||||||
NVMTarget_WaitWhileNVMBusBusy();
|
NVMTarget_WaitWhileNVMBusBusy();
|
||||||
NVMTarget_WaitWhileNVMControllerBusy();
|
NVMTarget_WaitWhileNVMControllerBusy();
|
||||||
|
|
||||||
/* Read the three byte generated CRC value */
|
/* Read the three bytes generated CRC value */
|
||||||
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_3BYTES << 2));
|
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
NVMTarget_SendNVMRegAddress(NVM_REG_DAT0);
|
NVMTarget_SendNVMRegAddress(NVM_REG_DAT0);
|
||||||
MemoryCRC = PDITarget_ReceiveByte();
|
MemoryCRC = PDITarget_ReceiveByte();
|
||||||
|
|
||||||
|
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendNVMRegAddress(NVM_REG_DAT1);
|
||||||
MemoryCRC |= ((uint16_t)PDITarget_ReceiveByte() << 8);
|
MemoryCRC |= ((uint16_t)PDITarget_ReceiveByte() << 8);
|
||||||
|
|
||||||
|
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendNVMRegAddress(NVM_REG_DAT2);
|
||||||
MemoryCRC |= ((uint32_t)PDITarget_ReceiveByte() << 16);
|
MemoryCRC |= ((uint32_t)PDITarget_ReceiveByte() << 16);
|
||||||
|
|
||||||
return MemoryCRC;
|
return MemoryCRC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NVMTarget_ReadMemory(uint32_t ReadAddress, uint8_t* ReadBuffer, uint16_t ReadSize)
|
||||||
|
{
|
||||||
|
NVMTarget_WaitWhileNVMControllerBusy();
|
||||||
|
|
||||||
|
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendNVMRegAddress(NVM_REG_CMD);
|
||||||
|
PDITarget_SendByte(NVM_CMD_READNVM);
|
||||||
|
|
||||||
|
/* TODO: Optimize via REPEAT and buffer orientated commands */
|
||||||
|
for (uint16_t i = 0; i < ReadSize; i++)
|
||||||
|
{
|
||||||
|
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_4BYTES << 2));
|
||||||
|
NVMTarget_SendAddress(ReadAddress++);
|
||||||
|
*(ReadBuffer++) = PDITarget_ReceiveByte();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -76,15 +76,46 @@
|
||||||
#define NVM_REG_STATUS 0x0F
|
#define NVM_REG_STATUS 0x0F
|
||||||
#define NVM_REG_LOCKBITS 0x10
|
#define NVM_REG_LOCKBITS 0x10
|
||||||
|
|
||||||
#define NVM_CMD_APPCRC 0x38
|
#define NVM_CMD_NOOP 0x00
|
||||||
#define NVM_CMD_BOOTCRC 0x39
|
#define NVM_CMD_CHIPERASE 0x40
|
||||||
|
#define NVM_CMD_READNVM 0x43
|
||||||
|
#define NVM_CMD_LOADFLASHBUFF 0x23
|
||||||
|
#define NVM_CMD_ERASEFLASHBUFF 0x26
|
||||||
|
#define NVM_CMD_ERASEFLASHPAGE 0x2B
|
||||||
|
#define NVM_CMD_FLASHPAGEWRITE 0x2E
|
||||||
|
#define NVM_CMD_ERASEWRITEFLASH 0x2F
|
||||||
#define NVM_CMD_FLASHCRC 0x78
|
#define NVM_CMD_FLASHCRC 0x78
|
||||||
|
#define NVM_CMD_ERASEAPPSEC 0x20
|
||||||
|
#define NVM_CMD_ERASEAPPSECPAGE 0x22
|
||||||
|
#define NVM_CMD_WRITEAPPSECPAGE 0x24
|
||||||
|
#define NVM_CMD_ERASEWRITEAPPSECPAGE 0x25
|
||||||
|
#define NVM_CMD_APPCRC 0x38
|
||||||
|
#define NVM_CMD_ERASEBOOTSEC 0x68
|
||||||
|
#define NVM_CMD_ERASEBOOTSECPAGE 0x2A
|
||||||
|
#define NVM_CMD_WRITEBOOTSECPAGE 0x2C
|
||||||
|
#define NVM_CMD_ERASEWRITEBOOTSECPAGE 0x2D
|
||||||
|
#define NVM_CMD_BOOTCRC 0x39
|
||||||
#define NVM_CMD_READUSERSIG 0x03
|
#define NVM_CMD_READUSERSIG 0x03
|
||||||
|
#define NVM_CMD_ERASEUSERSIG 0x18
|
||||||
|
#define NVM_CMD_WRITEUSERSIG 0x1A
|
||||||
|
#define NVM_CMD_READCALIBRATION 0x02
|
||||||
|
#define NVM_CMD_READFUSE 0x07
|
||||||
|
#define NVM_CMD_WRITEFUSE 0x4C
|
||||||
|
#define NVM_CMD_WRITELOCK 0x08
|
||||||
|
#define NVM_CMD_LOADEEPROMPAGEBUFF 0x33
|
||||||
|
#define NVM_CMD_ERASEEEPROMPAGEBUFF 0x36
|
||||||
|
#define NVM_CMD_ERASEEEPROM 0x30
|
||||||
|
#define NVM_CMD_ERASEEEPROMPAGE 0x32
|
||||||
|
#define NVM_CMD_WRITEEEPROMPAGE 0x34
|
||||||
|
#define NVM_CMD_ERASEWRITEEEPROMPAGE 0x35
|
||||||
|
#define NVM_CMD_READEEPROM 0x06
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void NVMTarget_SendNVMRegAddress(uint8_t Register);
|
void NVMTarget_SendNVMRegAddress(uint8_t Register);
|
||||||
|
void NVMTarget_SendAddress(uint32_t AbsoluteAddress);
|
||||||
bool NVMTarget_WaitWhileNVMBusBusy(void);
|
bool NVMTarget_WaitWhileNVMBusBusy(void);
|
||||||
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);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -217,19 +217,16 @@ static void PDIProtocol_ReadMemory(void)
|
||||||
Endpoint_ClearOUT();
|
Endpoint_ClearOUT();
|
||||||
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
||||||
|
|
||||||
if (ReadMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG)
|
uint8_t ReadBuffer[ReadMemory_XPROG_Params.Length];
|
||||||
{
|
NVMTarget_ReadMemory(ReadMemory_XPROG_Params.Address, ReadBuffer, ReadMemory_XPROG_Params.Length);
|
||||||
PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));
|
|
||||||
NVMTarget_SendNVMRegAddress(NVM_REG_CMD);
|
|
||||||
PDITarget_SendByte(NVM_CMD_READUSERSIG);
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
Endpoint_Write_Byte(CMD_XPROG);
|
Endpoint_Write_Byte(CMD_XPROG);
|
||||||
Endpoint_Write_Byte(XPRG_CMD_READ_MEM);
|
Endpoint_Write_Byte(XPRG_CMD_READ_MEM);
|
||||||
Endpoint_Write_Byte(ReturnStatus);
|
Endpoint_Write_Byte(ReturnStatus);
|
||||||
|
|
||||||
|
if (ReturnStatus == XPRG_ERR_OK)
|
||||||
|
Endpoint_Write_Stream_LE(ReadBuffer, ReadMemory_XPROG_Params.Length);
|
||||||
|
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,13 +247,16 @@ static void PDIProtocol_ReadCRC(void)
|
||||||
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
||||||
|
|
||||||
uint32_t MemoryCRC;
|
uint32_t MemoryCRC;
|
||||||
|
uint8_t CRCCommand;
|
||||||
|
|
||||||
if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP)
|
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)
|
else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT)
|
||||||
MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_BOOTCRC);
|
CRCCommand = NVM_CMD_BOOTCRC;
|
||||||
else
|
else
|
||||||
MemoryCRC = NVMTarget_GetMemoryCRC(NVM_CMD_FLASHCRC);
|
CRCCommand = NVM_CMD_FLASHCRC;
|
||||||
|
|
||||||
|
MemoryCRC = NVMTarget_GetMemoryCRC(CRCCommand);
|
||||||
|
|
||||||
Endpoint_Write_Byte(CMD_XPROG);
|
Endpoint_Write_Byte(CMD_XPROG);
|
||||||
Endpoint_Write_Byte(XPRG_CMD_CRC);
|
Endpoint_Write_Byte(XPRG_CMD_CRC);
|
||||||
|
|
Loading…
Reference in New Issue