~ruther/qmk_firmware

4bbfecae90e994b4a7d9bf5db06a995fb05d6ab2 — Joel Challis 1 year, 2 months ago 6720e9c
Infer eeconfig identifiers (#22135)

Co-authored-by: Nick Brassel <nick@tzarc.org>
3 files changed, 49 insertions(+), 25 deletions(-)

M platforms/eeprom.h
M quantum/eeconfig.c
M quantum/eeconfig.h
M platforms/eeprom.h => platforms/eeprom.h +4 -0
@@ 22,6 22,10 @@ void     eeprom_update_dword(uint32_t *__p, uint32_t __value);
void     eeprom_update_block(const void *__src, void *__dst, size_t __n);
#endif

static inline void eeprom_write_qword(uint64_t *__p, uint64_t __value) {
    eeprom_update_block(&__value, __p, sizeof(uint64_t));
}

#if defined(EEPROM_CUSTOM)
#    ifndef EEPROM_SIZE
#        error EEPROM_SIZE has not been defined for custom driver.

M quantum/eeconfig.c => quantum/eeconfig.c +3 -3
@@ 19,6 19,8 @@ void via_eeprom_set_valid(bool valid);
void eeconfig_init_via(void);
#endif

_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect");

/** \brief eeconfig enable
 *
 * FIXME: needs doc


@@ 57,11 59,9 @@ void eeconfig_init_quantum(void) {
    eeprom_update_byte(EECONFIG_AUDIO, 0);
    eeprom_update_dword(EECONFIG_RGBLIGHT, 0);
    eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0);
    eeprom_update_byte(EECONFIG_UNUSED, 0);
    eeprom_update_byte(EECONFIG_UNICODEMODE, 0);
    eeprom_update_byte(EECONFIG_STENOMODE, 0);
    uint64_t dummy = 0;
    eeprom_update_block(&dummy, EECONFIG_RGB_MATRIX, sizeof(uint64_t));
    eeprom_write_qword(EECONFIG_RGB_MATRIX, 0);
    eeprom_update_dword(EECONFIG_HAPTIC, 0);
#if defined(HAPTIC_ENABLE)
    haptic_reset();

M quantum/eeconfig.h => quantum/eeconfig.h +42 -22
@@ 19,37 19,57 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h> // offsetof
#include "eeprom.h"
#include "util.h"

#ifndef EECONFIG_MAGIC_NUMBER
#    define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE6 // When changing, decrement this value to avoid future re-init issues
#    define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE5 // When changing, decrement this value to avoid future re-init issues
#endif
#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF

// Dummy struct only used to calculate offsets
typedef struct PACKED {
    uint16_t magic;
    uint8_t  debug;
    uint8_t  default_layer;
    uint16_t keymap;
    uint8_t  backlight;
    uint8_t  audio;
    uint32_t rgblight;
    uint8_t  unicode;
    uint8_t  steno;
    uint8_t  handedness;
    uint32_t keyboard;
    uint32_t user;
    union { // Mutually exclusive
        uint32_t led_matrix;
        uint64_t rgb_matrix;
    };
    uint32_t haptic;
    uint8_t  rgblight_ext;
} eeprom_core_t;

/* EEPROM parameter address */
#define EECONFIG_MAGIC (uint16_t *)0
#define EECONFIG_DEBUG (uint8_t *)2
#define EECONFIG_DEFAULT_LAYER (uint8_t *)3
#define EECONFIG_KEYMAP (uint16_t *)4
#define EECONFIG_BACKLIGHT (uint8_t *)6
#define EECONFIG_AUDIO (uint8_t *)7
#define EECONFIG_RGBLIGHT (uint32_t *)8
#define EECONFIG_UNICODEMODE (uint8_t *)12
#define EECONFIG_STENOMODE (uint8_t *)13
// EEHANDS for two handed boards
#define EECONFIG_HANDEDNESS (uint8_t *)14
#define EECONFIG_KEYBOARD (uint32_t *)15
#define EECONFIG_USER (uint32_t *)19
#define EECONFIG_UNUSED (uint8_t *)23
// Mutually exclusive
#define EECONFIG_LED_MATRIX (uint32_t *)24
#define EECONFIG_RGB_MATRIX (uint64_t *)24

#define EECONFIG_HAPTIC (uint32_t *)32
#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)36
#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic))
#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug))
#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer))
#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap))
#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight))
#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio))
#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight))
#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode))
#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno))
#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness))
#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard))
#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user))
#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix))
#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix))
#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic))
#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext))

// Size of EEPROM being used for core data storage
#define EECONFIG_BASE_SIZE 37
#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t))

// Size of EEPROM dedicated to keyboard- and user-specific data
#ifndef EECONFIG_KB_DATA_SIZE

Do not follow this link