qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

eeprom_transient.c (1931B)


      1 /* Copyright 2019 Nick Brassel (tzarc)
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 #include <stdint.h>
     18 #include <string.h>
     19 
     20 #include "eeprom_driver.h"
     21 #include "eeprom_transient.h"
     22 
     23 __attribute__((aligned(4))) static uint8_t transientBuffer[TRANSIENT_EEPROM_SIZE] = {0};
     24 
     25 size_t clamp_length(intptr_t offset, size_t len) {
     26     if (offset + len > TRANSIENT_EEPROM_SIZE) {
     27         len = TRANSIENT_EEPROM_SIZE - offset;
     28     }
     29 
     30     return len;
     31 }
     32 
     33 void eeprom_driver_init(void) {}
     34 
     35 void eeprom_driver_format(bool erase) {
     36     /* The transient eeprom driver doesn't necessarily need to be formatted before use, and it always starts up filled with zeros, due to placement in the .bss section */
     37     if (erase) {
     38         eeprom_driver_erase();
     39     }
     40 }
     41 
     42 void eeprom_driver_erase(void) {
     43     memset(transientBuffer, 0x00, TRANSIENT_EEPROM_SIZE);
     44 }
     45 
     46 void eeprom_read_block(void *buf, const void *addr, size_t len) {
     47     intptr_t offset = (intptr_t)addr;
     48     memset(buf, 0x00, len);
     49     len = clamp_length(offset, len);
     50     if (len > 0) {
     51         memcpy(buf, &transientBuffer[offset], len);
     52     }
     53 }
     54 
     55 void eeprom_write_block(const void *buf, void *addr, size_t len) {
     56     intptr_t offset = (intptr_t)addr;
     57     len             = clamp_length(offset, len);
     58     if (len > 0) {
     59         memcpy(&transientBuffer[offset], buf, len);
     60     }
     61 }