summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2019-02-23 12:41:38 -0700
committerEvan Lojewski <github@meklort.com>2019-02-23 12:41:38 -0700
commitd81fa4c17c6c815fa30120dc9ddf26e29f19821b (patch)
treecfe8a4274beeeb50b452624258715d91e082e876 /libs
parent856a5889fa5a2278085b4d84f74b736b13194e3a (diff)
downloadbcm5719-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.h2
-rw-r--r--libs/NVRam/nvm.c32
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)
OpenPOWER on IntegriCloud