123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- #define INCLUDE_FROM_TINYNVM_C
- #include "TINYNVM.h"
- #if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
- static void TINYNVM_SendPointerAddress(const uint16_t AbsoluteAddress)
- {
-
- XPROGTarget_SendByte(TPI_CMD_SSTPR | 0);
- XPROGTarget_SendByte(AbsoluteAddress & 0xFF);
- XPROGTarget_SendByte(TPI_CMD_SSTPR | 1);
- XPROGTarget_SendByte(AbsoluteAddress >> 8);
- }
- static void TINYNVM_SendReadNVMRegister(const uint8_t Address)
- {
-
- XPROGTarget_SendByte(TPI_CMD_SIN(Address));
- }
- static void TINYNVM_SendWriteNVMRegister(const uint8_t Address)
- {
-
- XPROGTarget_SendByte(TPI_CMD_SOUT(Address));
- }
- bool TINYNVM_WaitWhileNVMBusBusy(void)
- {
-
- for (;;)
- {
-
- XPROGTarget_SendByte(TPI_CMD_SLDCS(TPI_REG_STATUS));
- uint8_t StatusRegister = XPROGTarget_ReceiveByte();
-
- if (!(TimeoutTicksRemaining))
- return false;
-
- if (StatusRegister & TPI_STATUS_NVM)
- return true;
- }
- }
- bool TINYNVM_WaitWhileNVMControllerBusy(void)
- {
-
- for (;;)
- {
-
- TINYNVM_SendReadNVMRegister(XPROG_Param_NVMCSRRegAddr);
- uint8_t StatusRegister = XPROGTarget_ReceiveByte();
-
- if (!(TimeoutTicksRemaining))
- return false;
-
- if (!(StatusRegister & (1 << 7)))
- return true;
- }
- }
- bool TINYNVM_EnableTPI(void)
- {
-
- XPROGTarget_EnableTargetTPI();
-
- XPROGTarget_SendByte(TPI_CMD_SSTCS(TPI_REG_CTRL));
- XPROGTarget_SendByte(0x02);
-
- XPROGTarget_SendByte(TPI_CMD_SKEY);
- for (uint8_t i = sizeof(TPI_NVMENABLE_KEY); i > 0; i--)
- XPROGTarget_SendByte(TPI_NVMENABLE_KEY[i - 1]);
-
- return TINYNVM_WaitWhileNVMBusBusy();
- }
- void TINYNVM_DisableTPI(void)
- {
- TINYNVM_WaitWhileNVMBusBusy();
- do
- {
-
- XPROGTarget_SendByte(TPI_CMD_SSTCS(TPI_REG_STATUS));
- XPROGTarget_SendByte(0x00);
-
- XPROGTarget_SendByte(TPI_CMD_SLDCS(TPI_REG_STATUS));
- } while (XPROGTarget_ReceiveByte() != 0x00);
- XPROGTarget_DisableTargetTPI();
- }
- bool TINYNVM_ReadMemory(const uint16_t ReadAddress,
- uint8_t* ReadBuffer,
- uint16_t ReadSize)
- {
-
- if (!(TINYNVM_WaitWhileNVMControllerBusy()))
- return false;
-
- TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);
- XPROGTarget_SendByte(TINY_NVM_CMD_NOOP);
-
- TINYNVM_SendPointerAddress(ReadAddress);
- while (ReadSize-- && TimeoutTicksRemaining)
- {
-
- XPROGTarget_SendByte(TPI_CMD_SLD(TPI_POINTER_INDIRECT_PI));
- *(ReadBuffer++) = XPROGTarget_ReceiveByte();
- }
- return (TimeoutTicksRemaining > 0);
- }
- bool TINYNVM_WriteMemory(const uint16_t WriteAddress,
- uint8_t* WriteBuffer,
- uint16_t WriteLength)
- {
-
- if (!(TINYNVM_WaitWhileNVMControllerBusy()))
- return false;
-
- if (WriteLength & 0x01)
- WriteBuffer[WriteLength++] = 0xFF;
-
- TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);
- XPROGTarget_SendByte(TINY_NVM_CMD_WORDWRITE);
-
- TINYNVM_SendPointerAddress(WriteAddress);
- while (WriteLength)
- {
-
- if (!(TINYNVM_WaitWhileNVMControllerBusy()))
- return false;
-
- XPROGTarget_SendByte(TPI_CMD_SST(TPI_POINTER_INDIRECT_PI));
- XPROGTarget_SendByte(*(WriteBuffer++));
-
- XPROGTarget_SendByte(TPI_CMD_SST(TPI_POINTER_INDIRECT_PI));
- XPROGTarget_SendByte(*(WriteBuffer++));
-
- WriteLength -= 2;
- }
- return true;
- }
- bool TINYNVM_EraseMemory(const uint8_t EraseCommand,
- const uint16_t Address)
- {
-
- if (!(TINYNVM_WaitWhileNVMControllerBusy()))
- return false;
-
- TINYNVM_SendWriteNVMRegister(XPROG_Param_NVMCMDRegAddr);
- XPROGTarget_SendByte(EraseCommand);
-
- TINYNVM_SendPointerAddress(Address | 0x0001);
- XPROGTarget_SendByte(TPI_CMD_SST(TPI_POINTER_INDIRECT));
- XPROGTarget_SendByte(0x00);
-
- if (!(TINYNVM_WaitWhileNVMControllerBusy()))
- return false;
- return true;
- }
- #endif
|