diff options
author | Evan Lojewski <github@meklort.com> | 2019-02-23 12:41:38 -0700 |
---|---|---|
committer | Evan Lojewski <github@meklort.com> | 2019-02-23 12:41:38 -0700 |
commit | d81fa4c17c6c815fa30120dc9ddf26e29f19821b (patch) | |
tree | cfe8a4274beeeb50b452624258715d91e082e876 /libs | |
parent | 856a5889fa5a2278085b4d84f74b736b13194e3a (diff) | |
download | bcm5719-ortega-d81fa4c17c6c815fa30120dc9ddf26e29f19821b.tar.gz bcm5719-ortega-d81fa4c17c6c815fa30120dc9ddf26e29f19821b.zip |
Add API to enable NVM writes.
When using single-writes (writeWord()) only write if the destination has changed.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/NVRam/include/NVRam.h | 2 | ||||
-rw-r--r-- | libs/NVRam/nvm.c | 32 |
2 files changed, 25 insertions, 9 deletions
diff --git a/libs/NVRam/include/NVRam.h b/libs/NVRam/include/NVRam.h index 3d995ff..a3d5378 100644 --- a/libs/NVRam/include/NVRam.h +++ b/libs/NVRam/include/NVRam.h @@ -58,7 +58,9 @@ void NVRam_writeWord(uint32_t address, uint32_t data); void NVRam_write(uint32_t address, uint32_t *buffer, size_t words); void NVRam_enable(void); +void NVRam_enableWrites(void); void NVRam_disable(void); +void NVRam_disableWrites(void); uint32_t NVRam_crc(uint8_t *pcDatabuf, // Pointer to data buffer uint32_t ulDatalen, // Length of data buffer in bytes diff --git a/libs/NVRam/nvm.c b/libs/NVRam/nvm.c index a2d68b6..9e69ecc 100644 --- a/libs/NVRam/nvm.c +++ b/libs/NVRam/nvm.c @@ -90,16 +90,25 @@ static inline uint32_t NVRam_translate(uint32_t address) void NVRam_enable(void) { - // TODO: enable both bits on read. NVM.Access.bits.Enable = 1; } +void NVRam_enableWrites(void) +{ + NVM.Access.bits.WriteEnable = 1; +} + void NVRam_disable(void) { - // TODO: enable both bits on read. NVM.Access.bits.Enable = 0; } +void NVRam_disableWrites(void) +{ + NVM.Access.bits.WriteEnable = 0; +} + + static inline void NVRam_waitDone(void) { while (!NVM.Command.bits.Done) @@ -214,14 +223,19 @@ void NVRam_read(uint32_t address, uint32_t *buffer, size_t words) void NVRam_writeWord(uint32_t address, uint32_t data) { - RegNVMCommand_t cmd; - cmd.r32 = 0; - cmd.bits.First = 1; - cmd.bits.Last = 1; - cmd.bits.Doit = 1; - cmd.bits.Wr = 1; + if(data != NVRam_readWord(address)) + { + // Only write if different. - NVRam_writeWordInternal(address, data, cmd); + RegNVMCommand_t cmd; + cmd.r32 = 0; + cmd.bits.First = 1; + cmd.bits.Last = 1; + cmd.bits.Doit = 1; + cmd.bits.Wr = 1; + + NVRam_writeWordInternal(address, data, cmd); + } } void NVRam_write(uint32_t address, uint32_t *buffer, size_t words) |