mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-03-13 23:14:09 +00:00
Use EEPROM to store RGB parameters
This commit is contained in:
parent
032d9b9b50
commit
b3fcf283d4
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user