diff options
Diffstat (limited to 'firmware/zpu/usrp2p')
-rw-r--r-- | firmware/zpu/usrp2p/spi_flash_read.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/firmware/zpu/usrp2p/spi_flash_read.c b/firmware/zpu/usrp2p/spi_flash_read.c index 36c326e96..75721b0f7 100644 --- a/firmware/zpu/usrp2p/spi_flash_read.c +++ b/firmware/zpu/usrp2p/spi_flash_read.c @@ -21,7 +21,8 @@ #include <stdlib.h> // abort #include <nonstdio.h> -static size_t _spi_flash_log2_memory_size; +//FIXME cannot be zero or it gets optimized out and the get size functions break... +#define UNINITIALIZED 0xdeadbeef uint32_t spi_flash_rdid(void) @@ -32,42 +33,29 @@ spi_flash_rdid(void) size_t spi_flash_log2_sector_size(void) { - static size_t _spi_flash_log2_sector_size; - - if (_spi_flash_log2_sector_size != 0) - return _spi_flash_log2_sector_size; - - - uint32_t id = spi_flash_rdid(); - int type = (id >> 8) & 0xff; - int size = id & 0xff; - if (type != 0x20 || size < 22 || size > 24) - abort(); - static unsigned char log2_sector_size[3] = { - 16, /* M25P32 */ + 16, /* M25P32 */ 16, /* M25P64 */ 18, /* M25P128 */ }; - - _spi_flash_log2_sector_size = log2_sector_size[size - 22]; - _spi_flash_log2_memory_size = size; //while we're at it - return _spi_flash_log2_sector_size; + return log2_sector_size[spi_flash_log2_memory_size() - 22]; } size_t spi_flash_log2_memory_size(void) { - if (_spi_flash_log2_memory_size != 0) - return _spi_flash_log2_memory_size; + static size_t _spi_flash_log2_memory_size = UNINITIALIZED; + + if (_spi_flash_log2_memory_size == UNINITIALIZED){ + uint32_t id = spi_flash_rdid(); + uint8_t type = (id >> 8) & 0xff; + uint8_t size = (id >> 0) & 0xff; + if (type != 0x20 || size < 22 || size > 24) + abort(); - uint32_t id = spi_flash_rdid(); - int type = (id >> 8) & 0xff; - int size = id & 0xff; - if (type != 0x20 || size < 22 || size > 24) - abort(); + _spi_flash_log2_memory_size = size; + } - _spi_flash_log2_memory_size = size; return _spi_flash_log2_memory_size; } |