From b3fcf283d464ea89d26f55fefee9de6162edbb60 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 15 Mar 2021 14:14:29 -0600 Subject: [PATCH] Use EEPROM to store RGB parameters --- keyboards/system76/launch_1/config.h | 21 ++++++----- keyboards/system76/launch_1/launch_1.c | 13 ++++--- keyboards/system76/system76_ec.c | 49 ++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/keyboards/system76/launch_1/config.h b/keyboards/system76/launch_1/config.h index 3e24d1e703f..b6514768851 100644 --- a/keyboards/system76/launch_1/config.h +++ b/keyboards/system76/launch_1/config.h @@ -62,10 +62,7 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -// Dynamic keyboard support { -#define DYNAMIC_KEYMAP_LAYER_COUNT 4 - -// EEPROM usage +// EEPROM { #define EEPROM_SIZE 1024 // TODO: refactor with new user EEPROM code (coming soon) @@ -74,16 +71,24 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x01 +#define EEPROM_VERSION 0x02 #define EEPROM_VERSION_ADDR (EEPROM_MAGIC_ADDR + 2) +// } EEPROM +// Dynamic keyboard support { +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 // Dynamic keymap starts after EEPROM version #define DYNAMIC_KEYMAP_EEPROM_ADDR (EEPROM_VERSION_ADDR + 1) #define DYNAMIC_KEYMAP_EEPROM_SIZE (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2) -// Dynamic macro starts after dynamic keymaps +// Dynamic macro starts after dynamic keymaps, it is disabled #define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + DYNAMIC_KEYMAP_EEPROM_SIZE) -#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (EEPROM_SIZE - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) -#define DYNAMIC_KEYMAP_MACRO_COUNT 16 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 0 +#define DYNAMIC_KEYMAP_MACRO_COUNT 0 // } Dynamic keyboard support +// System76 EC { +#define SYSTEM76_EC_EEPROM_ADDR (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) +#define SYSTEM76_EC_EEPROM_SIZE (EEPROM_SIZE - SYSTEM76_EC_EEPROM_ADDR) +// } System76 EC + #endif // CONFIG_H diff --git a/keyboards/system76/launch_1/launch_1.c b/keyboards/system76/launch_1/launch_1.c index 23a76322f76..809c95823dd 100644 --- a/keyboards/system76/launch_1/launch_1.c +++ b/keyboards/system76/launch_1/launch_1.c @@ -87,6 +87,10 @@ void bootmagic_lite(void) { } } +void system76_ec_rgb_eeprom(bool write); +void system76_ec_rgb_layer(layer_state_t layer_state); +void system76_ec_unlock(void); + void matrix_init_kb(void) { usb_mux_init(); @@ -94,8 +98,13 @@ void matrix_init_kb(void) { if (!eeprom_is_valid()) { dynamic_keymap_reset(); dynamic_keymap_macro_reset(); + system76_ec_rgb_eeprom(true); eeprom_set_valid(true); + } else { + system76_ec_rgb_eeprom(false); } + + system76_ec_rgb_layer(layer_state); } void matrix_scan_kb(void) { @@ -104,8 +113,6 @@ void matrix_scan_kb(void) { matrix_scan_user(); } -void system76_ec_unlock(void); - bool process_record_kb(uint16_t keycode, keyrecord_t *record) { switch(keycode) { case RESET: @@ -118,8 +125,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return process_record_user(keycode, record); } -void system76_ec_rgb_layer(layer_state_t layer_state); - layer_state_t layer_state_set_kb(layer_state_t layer_state) { system76_ec_rgb_layer(layer_state); diff --git a/keyboards/system76/system76_ec.c b/keyboards/system76/system76_ec.c index 4e7613171aa..d64a325a70d 100644 --- a/keyboards/system76/system76_ec.c +++ b/keyboards/system76/system76_ec.c @@ -155,6 +155,52 @@ rgb_config_t layer_rgb[DYNAMIC_KEYMAP_LAYER_COUNT] = { }, }; +// Read or write EEPROM data with checks for being inside System76 EC region +static bool system76_ec_eeprom_op(void * buf, uint16_t size, uint16_t offset, bool write) { + uint16_t addr = SYSTEM76_EC_EEPROM_ADDR + offset; + uint16_t end = addr + size; + if ( + (end > addr) && // check for overflow and zero size + (addr >= SYSTEM76_EC_EEPROM_ADDR) && + (end <= (SYSTEM76_EC_EEPROM_ADDR + SYSTEM76_EC_EEPROM_SIZE)) + ) { + if (write) { + eeprom_write_block( + (const void *)buf, + (void *)addr, + size + ); + } else { + eeprom_read_block( + (void *)buf, + (const void *)addr, + size + ); + } + return true; + } else { + return false; + } +} + +// Read or write EEPROM RGB parameters +void system76_ec_rgb_eeprom(bool write) { + uint16_t layer_rgb_size = sizeof(layer_rgb); + system76_ec_eeprom_op( + (void *)layer_rgb, + layer_rgb_size, + 0, + write + ); + system76_ec_eeprom_op( + (void *)raw_rgb_data, + sizeof(raw_rgb_data), + layer_rgb_size, + write + ); +} + +// Update RGB parameters on layer change void system76_ec_rgb_layer(layer_state_t layer_state) { if (!bootloader_unlocked) { uint8_t layer = get_highest_layer(layer_state); @@ -238,6 +284,7 @@ void raw_hid_receive(uint8_t *data, uint8_t length) { layer_rgb[layer].hsv.v = value; data[1] = 0; system76_ec_rgb_layer(layer_state); + system76_ec_rgb_eeprom(true); // TODO: instead use command for save/load break; } } @@ -283,6 +330,7 @@ void raw_hid_receive(uint8_t *data, uint8_t length) { // Ignore rgb.b data[1] = 0; system76_ec_rgb_layer(layer_state); + system76_ec_rgb_eeprom(true); // TODO: instead use command for save/load break; } } @@ -315,6 +363,7 @@ void raw_hid_receive(uint8_t *data, uint8_t length) { layer_rgb[layer].speed = speed; data[1] = 0; system76_ec_rgb_layer(layer_state); + system76_ec_rgb_eeprom(true); // TODO: instead use command for save/load } } break;