diff options
author | Evan Lojewski <github@meklort.com> | 2020-10-03 11:21:45 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-03 11:21:45 -0600 |
commit | 1a2a285a00d5cb7476f33ddaa83e8a91112f7329 (patch) | |
tree | e7f2981eafef54377cf8941bececf9c29681dadd | |
parent | 93e2cd20348d46d51cb6cab5353962afeb1a22c6 (diff) | |
download | bcm5719-ortega-1a2a285a00d5cb7476f33ddaa83e8a91112f7329.tar.gz bcm5719-ortega-1a2a285a00d5cb7476f33ddaa83e8a91112f7329.zip |
NVM: Add an API to determine the NVM size. (#124)
-rw-r--r-- | libs/NVRam/include/NVRam.h | 2 | ||||
-rw-r--r-- | libs/NVRam/nvm.c | 27 | ||||
-rw-r--r-- | utils/bcmflash/bcmflash.h | 1 | ||||
-rw-r--r-- | utils/bcmflash/nvm.cpp | 16 |
4 files changed, 45 insertions, 1 deletions
diff --git a/libs/NVRam/include/NVRam.h b/libs/NVRam/include/NVRam.h index 919aeb7..5ec5b5f 100644 --- a/libs/NVRam/include/NVRam.h +++ b/libs/NVRam/include/NVRam.h @@ -61,6 +61,8 @@ void NVRam_enableWrites(void); void NVRam_disable(void); void NVRam_disableWrites(void); +uint32_t NVRam_size(void); + uint32_t NVRam_crc(const uint8_t *pcDatabuf, // Pointer to data buffer uint32_t ulDatalen, // Length of data buffer in bytes uint32_t crc); // Initial value diff --git a/libs/NVRam/nvm.c b/libs/NVRam/nvm.c index 1e4d0cb..e3c33ba 100644 --- a/libs/NVRam/nvm.c +++ b/libs/NVRam/nvm.c @@ -45,6 +45,8 @@ #include <NVRam.h> +#define BCM_NVRAM_MAGIC (0x669955AAu) + #define ATMEL_AT45DB0X1B_PAGE_POS (9u) #define ATMEL_AT45DB0X1B_PAGE_SIZE (264u) #define ATMEL_AT45DB0X1B_ERASE (false) @@ -90,7 +92,7 @@ static inline uint32_t NVRam_translate(uint32_t address) } else { - return address; + return address; } #else return address; @@ -323,3 +325,26 @@ void NVRam_write(uint32_t address, uint32_t *buffer, uint32_t words) } #endif } + +uint32_t NVRam_size(void) +{ + size_t size; + uint32_t magic = NVRam_readWord(0); + + if (magic != htonl(BCM_NVRAM_MAGIC)) + { + // Unable to determine the size. + return 0; + } + + // Scan for the magic wrapping around, starting at 2KB flash size. + size = 2u * 1024u; + do + { + size *= 2; + + magic = NVRam_readWord(size); + } while (magic != htonl(BCM_NVRAM_MAGIC)); + + return size; +} diff --git a/utils/bcmflash/bcmflash.h b/utils/bcmflash/bcmflash.h index 55d71ee..8831040 100644 --- a/utils/bcmflash/bcmflash.h +++ b/utils/bcmflash/bcmflash.h @@ -50,6 +50,7 @@ bool bcmflash_nvram_read(const char *name, uint32_t *words, uint32_t num_words); bool bcmflash_nvram_write(const char *name, void *buffer, size_t len); +size_t bcmflash_nvram_size(const char *name); void bcmflash_nvram_unlock(void); void bcmflash_nvram_recovery(void); diff --git a/utils/bcmflash/nvm.cpp b/utils/bcmflash/nvm.cpp index f6e8cb6..af067d8 100644 --- a/utils/bcmflash/nvm.cpp +++ b/utils/bcmflash/nvm.cpp @@ -45,6 +45,22 @@ #include <../bcm5719_NVM.h> #include <NVRam.h> +#include <bcm5719_eeprom.h> + +size_t bcmflash_nvram_size(const char *name) +{ + size_t size; + + NVRam_acquireLock(); + + NVRam_enable(); + + size = NVRam_size(); + + NVRam_releaseLock(); + + return size; +} bool bcmflash_nvram_read(const char *name, uint32_t *words, uint32_t num_words) { |