Parent directory

eeprom.h

3394 bytes
 1// Copyright 2018-2022 QMK
 2// SPDX-License-Identifier: GPL-2.0-or-later
 3#pragma once
 4
 5#if defined(__AVR__) && !defined(EEPROM_DRIVER)
 6#    include <avr/eeprom.h>
 7#else
 8#    include <stdint.h>
 9#    include <stdlib.h>
10
11uint8_t  eeprom_read_byte(const uint8_t *__p);
12uint16_t eeprom_read_word(const uint16_t *__p);
13uint32_t eeprom_read_dword(const uint32_t *__p);
14void     eeprom_read_block(void *__dst, const void *__src, size_t __n);
15void     eeprom_write_byte(uint8_t *__p, uint8_t __value);
16void     eeprom_write_word(uint16_t *__p, uint16_t __value);
17void     eeprom_write_dword(uint32_t *__p, uint32_t __value);
18void     eeprom_write_block(const void *__src, void *__dst, size_t __n);
19void     eeprom_update_byte(uint8_t *__p, uint8_t __value);
20void     eeprom_update_word(uint16_t *__p, uint16_t __value);
21void     eeprom_update_dword(uint32_t *__p, uint32_t __value);
22void     eeprom_update_block(const void *__src, void *__dst, size_t __n);
23#endif
24
25// While newer avr-libc versions may have an implementation
26//   use preprocessor as to not cause conflicts
27#undef eeprom_write_qword
28#define eeprom_write_qword(__p, __value)                  \
29    do {                                                  \
30        uint64_t tmp = __value;                           \
31        eeprom_update_block(&tmp, __p, sizeof(uint64_t)); \
32    } while (0)
33
34#if defined(EEPROM_CUSTOM)
35#    ifndef EEPROM_SIZE
36#        error EEPROM_SIZE has not been defined for custom driver.
37#    endif
38#    define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
39#elif defined(EEPROM_WEAR_LEVELING)
40#    define TOTAL_EEPROM_BYTE_COUNT (WEAR_LEVELING_LOGICAL_SIZE)
41#elif defined(EEPROM_TRANSIENT)
42#    include "eeprom_transient.h"
43#    define TOTAL_EEPROM_BYTE_COUNT (TRANSIENT_EEPROM_SIZE)
44#elif defined(EEPROM_I2C)
45#    include "eeprom_i2c.h"
46#    define TOTAL_EEPROM_BYTE_COUNT (EXTERNAL_EEPROM_BYTE_COUNT)
47#elif defined(EEPROM_SPI)
48#    include "eeprom_spi.h"
49#    define TOTAL_EEPROM_BYTE_COUNT (EXTERNAL_EEPROM_BYTE_COUNT)
50#elif defined(EEPROM_STM32_L0_L1)
51#    include "eeprom_stm32_L0_L1.h"
52#    define TOTAL_EEPROM_BYTE_COUNT (STM32_ONBOARD_EEPROM_SIZE)
53#elif defined(EEPROM_KINETIS_FLEXRAM)
54#    include "eeprom_kinetis_flexram.h"
55#    define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
56#elif defined(EEPROM_LEGACY_EMULATED_FLASH)
57#    include "eeprom_legacy_emulated_flash_defs.h"
58#    define TOTAL_EEPROM_BYTE_COUNT (FEE_DENSITY_BYTES)
59#elif defined(EEPROM_SAMD)
60#    include "eeprom_samd.h"
61#    define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
62#elif defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATtiny85__)
63#    define TOTAL_EEPROM_BYTE_COUNT 512
64#elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega32A__)
65#    define TOTAL_EEPROM_BYTE_COUNT 1024
66#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
67#    define TOTAL_EEPROM_BYTE_COUNT 2048
68#elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
69#    define TOTAL_EEPROM_BYTE_COUNT 4096
70#elif defined(EEPROM_TEST_HARNESS)
71#    ifndef LEGACY_FLASH_OPS_MOCKED
72// Normal tests
73#        define TOTAL_EEPROM_BYTE_COUNT 32
74#    else
75// Flash wear-leveling testing
76#        include "eeprom_legacy_emulated_flash_tests.h"
77#        define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
78#    endif
79#else
80#    error Unknown EEPROM driver.
81#endif