diff options
Diffstat (limited to 'drivers/eeprom')
| -rw-r--r-- | drivers/eeprom/eeprom_i2c.h | 5 | ||||
| -rw-r--r-- | drivers/eeprom/eeprom_spi.c | 42 | ||||
| -rw-r--r-- | drivers/eeprom/eeprom_wear_leveling.c | 23 | 
3 files changed, 47 insertions, 23 deletions
| diff --git a/drivers/eeprom/eeprom_i2c.h b/drivers/eeprom/eeprom_i2c.h index 77eea66d63..85317c9ea5 100644 --- a/drivers/eeprom/eeprom_i2c.h +++ b/drivers/eeprom/eeprom_i2c.h @@ -54,6 +54,11 @@  #    define EXTERNAL_EEPROM_PAGE_SIZE 32  #    define EXTERNAL_EEPROM_ADDRESS_SIZE 2  #    define EXTERNAL_EEPROM_WRITE_TIME 5 +#elif defined(EEPROM_I2C_24LC32A) +#    define EXTERNAL_EEPROM_BYTE_COUNT 4096 +#    define EXTERNAL_EEPROM_PAGE_SIZE 32 +#    define EXTERNAL_EEPROM_ADDRESS_SIZE 2 +#    define EXTERNAL_EEPROM_WRITE_TIME 5  #elif defined(EEPROM_I2C_MB85RC256V)  #    define EXTERNAL_EEPROM_BYTE_COUNT 32768  #    define EXTERNAL_EEPROM_PAGE_SIZE 128 diff --git a/drivers/eeprom/eeprom_spi.c b/drivers/eeprom/eeprom_spi.c index 25955498c4..51ba25dece 100644 --- a/drivers/eeprom/eeprom_spi.c +++ b/drivers/eeprom/eeprom_spi.c @@ -58,14 +58,20 @@ static bool spi_eeprom_start(void) {  static spi_status_t spi_eeprom_wait_while_busy(int timeout) {      uint32_t     deadline = timer_read32() + timeout; -    spi_status_t response; -    do { +    spi_status_t response = SR_WIP; +    while (response & SR_WIP) { +        if (!spi_eeprom_start()) { +            return SPI_STATUS_ERROR; +        } +          spi_write(CMD_RDSR);          response = spi_read(); +        spi_stop(); +          if (timer_read32() >= deadline) {              return SPI_STATUS_TIMEOUT;          } -    } while (response & SR_WIP); +    }      return SPI_STATUS_SUCCESS;  } @@ -105,27 +111,21 @@ void eeprom_driver_erase(void) {  void eeprom_read_block(void *buf, const void *addr, size_t len) {      //-------------------------------------------------      // Wait for the write-in-progress bit to be cleared -    bool res = spi_eeprom_start(); -    if (!res) { -        dprint("failed to start SPI for WIP check\n"); -        memset(buf, 0, len); -        return; -    } -      spi_status_t response = spi_eeprom_wait_while_busy(EXTERNAL_EEPROM_SPI_TIMEOUT); -    spi_stop(); -    if (response == SPI_STATUS_TIMEOUT) { -        dprint("SPI timeout for WIP check\n"); +    if (response != SPI_STATUS_SUCCESS) { +        spi_stop();          memset(buf, 0, len); +        dprint("SPI timeout for WIP check\n");          return;      }      //-------------------------------------------------      // Perform read -    res = spi_eeprom_start(); +    bool res = spi_eeprom_start();      if (!res) { -        dprint("failed to start SPI for read\n"); +        spi_stop();          memset(buf, 0, len); +        dprint("failed to start SPI for read\n");          return;      } @@ -158,15 +158,9 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {          //-------------------------------------------------          // Wait for the write-in-progress bit to be cleared -        res = spi_eeprom_start(); -        if (!res) { -            dprint("failed to start SPI for WIP check\n"); -            return; -        } -          spi_status_t response = spi_eeprom_wait_while_busy(EXTERNAL_EEPROM_SPI_TIMEOUT); -        spi_stop(); -        if (response == SPI_STATUS_TIMEOUT) { +        if (response != SPI_STATUS_SUCCESS) { +            spi_stop();              dprint("SPI timeout for WIP check\n");              return;          } @@ -175,6 +169,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {          // Enable writes          res = spi_eeprom_start();          if (!res) { +            spi_stop();              dprint("failed to start SPI for write-enable\n");              return;          } @@ -186,6 +181,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {          // Perform the write          res = spi_eeprom_start();          if (!res) { +            spi_stop();              dprint("failed to start SPI for write\n");              return;          } diff --git a/drivers/eeprom/eeprom_wear_leveling.c b/drivers/eeprom/eeprom_wear_leveling.c new file mode 100644 index 0000000000..bd77eef35c --- /dev/null +++ b/drivers/eeprom/eeprom_wear_leveling.c @@ -0,0 +1,23 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#include <stdint.h> +#include <string.h> + +#include "eeprom_driver.h" +#include "wear_leveling.h" + +void eeprom_driver_init(void) { +    wear_leveling_init(); +} + +void eeprom_driver_erase(void) { +    wear_leveling_erase(); +} + +void eeprom_read_block(void *buf, const void *addr, size_t len) { +    wear_leveling_read((uint32_t)addr, buf, len); +} + +void eeprom_write_block(const void *buf, void *addr, size_t len) { +    wear_leveling_write((uint32_t)addr, buf, len); +} | 
