From 5fab310e65f30514ec5d119af756f9a45e7e8454 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Tue, 5 Sep 2023 01:53:05 +0100 Subject: [PATCH] Implement data driven wear leveling (#21906) * DD encoder map, wear leveling * remove encoder map from DD let's avoid the support headache * wear leveling: specify the allowed drivers by name Co-authored-by: Ryan * Add additional params * Relocate under eeprom * disable parsing --------- Co-authored-by: Dimitris Mantzouranis Co-authored-by: Ryan --- data/mappings/info_config.hjson | 4 ++++ data/mappings/info_rules.hjson | 1 + data/schemas/keyboard.jsonschema | 14 +++++++++++++- docs/reference_info_json.md | 7 +++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson index ab9a4a0e45..c3db2e46a2 100644 --- a/data/mappings/info_config.hjson +++ b/data/mappings/info_config.hjson @@ -49,6 +49,10 @@ "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"}, "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"}, + // EEPROM + "WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false}, + "WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false}, + // Indicators "LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"}, "LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"}, diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson index 07191551da..6a0f0a3030 100644 --- a/data/mappings/info_rules.hjson +++ b/data/mappings/info_rules.hjson @@ -42,6 +42,7 @@ "STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"}, "STENO_PROTOCOL": {"info_key": "stenography.protocol"}, "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}, + "WEAR_LEVELING_DRIVER": {"info_key": "eeprom.wear_leveling.driver"}, "WS2812_DRIVER": {"info_key": "ws2812.driver"}, // Items we want flagged in lint diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema index 901caa75fe..0f0576b1c3 100644 --- a/data/schemas/keyboard.jsonschema +++ b/data/schemas/keyboard.jsonschema @@ -247,7 +247,19 @@ }, "eeprom": { "properties": { - "driver": {"type": "string"} + "driver": {"type": "string"}, + "wear_leveling": { + "type": "object", + "additionalProperties": false, + "properties": { + "driver": { + "type": "string", + "enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"] + }, + "backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}, + "logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"} + } + } } }, "encoder": { diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md index 91581afc73..b81aacb43c 100644 --- a/docs/reference_info_json.md +++ b/docs/reference_info_json.md @@ -202,6 +202,13 @@ Configures the [EEPROM](eeprom_driver.md) driver. * `driver` * The EEPROM backend to use. Must be one of `custom`, `i2c`, `legacy_stm32_flash`, `spi`, `transient`, `vendor`, `wear_leveling`. * Default: `"vendor"` + * `wear_leveling` + * `driver` + * The driver to use. Must be one of `embedded_flash`, `legacy`, `rp2040_flash`, `spi_flash`, `custom`. + * `backing_size` + * Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size. + * `logical_size` + * Number of bytes “exposed” to the rest of QMK and denotes the size of the usable EEPROM. ## Encoder :id=encoder