Use EEPROM to store RGB parameters

This commit is contained in:
Jeremy Soller 2021-03-15 14:14:29 -06:00 committed by Jeremy Soller
parent 032d9b9b50
commit b3fcf283d4
3 changed files with 71 additions and 12 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;