diff options
Diffstat (limited to 'drivers/eeprom')
| -rw-r--r-- | drivers/eeprom/eeprom_i2c.c | 23 | ||||
| -rw-r--r-- | drivers/eeprom/eeprom_spi.c | 7 | ||||
| -rw-r--r-- | drivers/eeprom/eeprom_stm32_L0_L1.c | 96 | ||||
| -rw-r--r-- | drivers/eeprom/eeprom_stm32_L0_L1.h | 33 | 
4 files changed, 24 insertions, 135 deletions
| diff --git a/drivers/eeprom/eeprom_i2c.c b/drivers/eeprom/eeprom_i2c.c index 4210f06f9f..8e80ff544f 100644 --- a/drivers/eeprom/eeprom_i2c.c +++ b/drivers/eeprom/eeprom_i2c.c @@ -16,6 +16,9 @@  #include <stdint.h>  #include <string.h> +#if defined(EXTERNAL_EEPROM_WP_PIN) +#    include "gpio.h" +#endif  /*      Note that the implementations of eeprom_XXXX_YYYY on AVR are normally @@ -50,7 +53,14 @@ static inline void fill_target_address(uint8_t *buffer, const void *addr) {      }  } -void eeprom_driver_init(void) { i2c_init(); } +void eeprom_driver_init(void) { +    i2c_init(); +#if defined(EXTERNAL_EEPROM_WP_PIN) +    /* We are setting the WP pin to high in a way that requires at least two bit-flips to change back to 0 */ +    writePin(EXTERNAL_EEPROM_WP_PIN, 1); +    setPinInputHigh(EXTERNAL_EEPROM_WP_PIN); +#endif +}  void eeprom_driver_erase(void) {  #if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT) @@ -89,6 +99,11 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {      uint8_t * read_buf    = (uint8_t *)buf;      uintptr_t target_addr = (uintptr_t)addr; +#if defined(EXTERNAL_EEPROM_WP_PIN) +    setPinOutput(EXTERNAL_EEPROM_WP_PIN); +    writePin(EXTERNAL_EEPROM_WP_PIN, 0); +#endif +      while (len > 0) {          uintptr_t page_offset  = target_addr % EXTERNAL_EEPROM_PAGE_SIZE;          int       write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset; @@ -116,4 +131,10 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {          target_addr += write_length;          len -= write_length;      } + +#if defined(EXTERNAL_EEPROM_WP_PIN) +    /* We are setting the WP pin to high in a way that requires at least two bit-flips to change back to 0 */ +    writePin(EXTERNAL_EEPROM_WP_PIN, 1); +    setPinInputHigh(EXTERNAL_EEPROM_WP_PIN); +#endif  } diff --git a/drivers/eeprom/eeprom_spi.c b/drivers/eeprom/eeprom_spi.c index 182731d82f..e273090854 100644 --- a/drivers/eeprom/eeprom_spi.c +++ b/drivers/eeprom/eeprom_spi.c @@ -31,6 +31,8 @@  */  #include "wait.h" +#include "debug.h" +#include "timer.h"  #include "spi_master.h"  #include "eeprom.h"  #include "eeprom_spi.h" @@ -50,11 +52,6 @@  #    define EXTERNAL_EEPROM_SPI_TIMEOUT 100  #endif -#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT) -#    include "timer.h" -#    include "debug.h" -#endif  // CONSOLE_ENABLE -  static bool spi_eeprom_start(void) { return spi_start(EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN, EXTERNAL_EEPROM_SPI_LSBFIRST, EXTERNAL_EEPROM_SPI_MODE, EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR); }  static spi_status_t spi_eeprom_wait_while_busy(int timeout) { diff --git a/drivers/eeprom/eeprom_stm32_L0_L1.c b/drivers/eeprom/eeprom_stm32_L0_L1.c deleted file mode 100644 index ed26cc7145..0000000000 --- a/drivers/eeprom/eeprom_stm32_L0_L1.c +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright 2020 Nick Brassel (tzarc) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program.  If not, see <http://www.gnu.org/licenses/>. - */ - -#include <stdint.h> -#include <string.h> - -#include <hal.h> -#include "eeprom_driver.h" -#include "eeprom_stm32_L0_L1.h" - -#define EEPROM_BASE_ADDR 0x08080000 -#define EEPROM_ADDR(offset) (EEPROM_BASE_ADDR + (offset)) -#define EEPROM_PTR(offset) ((__IO uint8_t *)EEPROM_ADDR(offset)) -#define EEPROM_BYTE(location, offset) (*(EEPROM_PTR(((uint32_t)location) + ((uint32_t)offset)))) - -#define BUFFER_BYTE(buffer, offset) (*(((uint8_t *)buffer) + offset)) - -#define FLASH_PEKEY1 0x89ABCDEF -#define FLASH_PEKEY2 0x02030405 - -static inline void STM32_L0_L1_EEPROM_WaitNotBusy(void) { -    while (FLASH->SR & FLASH_SR_BSY) { -        __WFI(); -    } -} - -static inline void STM32_L0_L1_EEPROM_Unlock(void) { -    STM32_L0_L1_EEPROM_WaitNotBusy(); -    if (FLASH->PECR & FLASH_PECR_PELOCK) { -        FLASH->PEKEYR = FLASH_PEKEY1; -        FLASH->PEKEYR = FLASH_PEKEY2; -    } -} - -static inline void STM32_L0_L1_EEPROM_Lock(void) { -    STM32_L0_L1_EEPROM_WaitNotBusy(); -    FLASH->PECR |= FLASH_PECR_PELOCK; -} - -void eeprom_driver_init(void) {} - -void eeprom_driver_erase(void) { -    STM32_L0_L1_EEPROM_Unlock(); - -    for (size_t offset = 0; offset < STM32_ONBOARD_EEPROM_SIZE; offset += sizeof(uint32_t)) { -        FLASH->PECR |= FLASH_PECR_ERASE | FLASH_PECR_DATA; - -        *(__IO uint32_t *)EEPROM_ADDR(offset) = (uint32_t)0; - -        STM32_L0_L1_EEPROM_WaitNotBusy(); -        FLASH->PECR &= ~(FLASH_PECR_ERASE | FLASH_PECR_DATA); -    } - -    STM32_L0_L1_EEPROM_Lock(); -} - -void eeprom_read_block(void *buf, const void *addr, size_t len) { -    for (size_t offset = 0; offset < len; ++offset) { -        // Drop out if we've hit the limit of the EEPROM -        if ((((uint32_t)addr) + offset) >= STM32_ONBOARD_EEPROM_SIZE) { -            break; -        } - -        STM32_L0_L1_EEPROM_WaitNotBusy(); -        BUFFER_BYTE(buf, offset) = EEPROM_BYTE(addr, offset); -    } -} - -void eeprom_write_block(const void *buf, void *addr, size_t len) { -    STM32_L0_L1_EEPROM_Unlock(); - -    for (size_t offset = 0; offset < len; ++offset) { -        // Drop out if we've hit the limit of the EEPROM -        if ((((uint32_t)addr) + offset) >= STM32_ONBOARD_EEPROM_SIZE) { -            break; -        } - -        STM32_L0_L1_EEPROM_WaitNotBusy(); -        EEPROM_BYTE(addr, offset) = BUFFER_BYTE(buf, offset); -    } - -    STM32_L0_L1_EEPROM_Lock(); -} diff --git a/drivers/eeprom/eeprom_stm32_L0_L1.h b/drivers/eeprom/eeprom_stm32_L0_L1.h deleted file mode 100644 index a35defca8b..0000000000 --- a/drivers/eeprom/eeprom_stm32_L0_L1.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2020 Nick Brassel (tzarc) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program.  If not, see <http://www.gnu.org/licenses/>. - */ - -#pragma once - -/* -    The size used by the STM32 L0/L1 EEPROM driver. -*/ -#ifndef STM32_ONBOARD_EEPROM_SIZE -#    ifdef VIA_ENABLE -#        define STM32_ONBOARD_EEPROM_SIZE 1024 -#    else -#        include "eeconfig.h" -#        define STM32_ONBOARD_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4)  // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO and EEPROM page sizing -#    endif -#endif - -#if STM32_ONBOARD_EEPROM_SIZE > 128 -#    pragma message("Please note: resetting EEPROM using an STM32L0/L1 device takes up to 1 second for every 1kB of internal EEPROM used.") -#endif | 
