跳转到内容

存储

存储提供了一种机制,使您的设备能够保存数据,在电源循环之间保持数据的持久性。这使您能够根据自己的喜好配置键盘,而不会在重新启动之间丢失您所做的任何更改。

设置

所需 Cargo 功能

你必须启用以下 rumcake 功能:

  • storage

目前,以下功能可以使用存储:

  • backlight(用于存储背光色调、饱和度、亮度、速度、效果等)
  • underglow(用于存储底部灯光色调、饱和度、亮度、速度、效果等)
  • via/vial(用于存储动态按键映射)

请查看它们各自的文档,了解如何为这些功能启用存储使用。通常,任何能够将数据存储到存储外设的功能都需要在 #[keyboard] 宏调用中明确指定 use_storage

如果你的 #[keyboard] 宏调用中没有在任何地方指定 use_storage,则无需设置存储驱动。

使用 MCU 闪存作为存储的必要代码

接下来的说明适用于如果你想使用选定 MCU 上的现有闪存空间作为存储

要设置存储,你必须在 memory.x 文件中添加一个 CONFIG 部分,并使用 __config_start__config_end 指定 CONFIG 部分的起始和结束地址。这将涉及从 FLASH 部分中获取一些空间,因此请确保你仍有足够的空间来刷写编译后的固件二进制文件。

如果不确定要为存储分配多少空间,请参阅此部分

以下示例显示了 STM32F303CBx 芯片的 memory.x 可能是什么样子:

MEMORY
{
FLASH : ORIGIN = 0x08000000, LENGTH = 120K /* 减少为芯片的最大 128K 中的 8K,用于下面 CONFIG 部分 */
CONFIG: ORIGIN = ORIGIN(FLASH) + LENGTH(FLASH), LENGTH = 8K /* 添加此行 */
RAM : ORIGIN = 0x20000000, LENGTH = 32K
}
__config_start = ORIGIN(CONFIG) - ORIGIN(FLASH); /* 添加此行 */
__config_end = __config_start + LENGTH(CONFIG); /* 添加此行 */

CONFIG 部分的要求:

  • 大小必须是闪存外设的“擦除大小”的倍数。有时这也称为“页面大小”或“区域大小”。
    • 在上面的示例中,STM32F303CBx 的擦除大小为 2KiB。因此,CONFIG 部分的大小为 4 页。
  • 起始地址(__config_start)必须对齐到擦除大小的倍数。
  • __config_start__config_end 的值必须相对于 FLASH 部分的起始地址
    • 请注意,在上面的示例中,我们为此目的减去了 ORIGIN(FLASH)

最后,你可以将 storage(driver = "internal") 添加到你的 #[keyboard] 宏调用中。

#[keyboard(
// 你的键盘宏调用中的某处...
underglow(
driver_setup_fn = my_underglow_setup,
use_storage // 此底部灯光功能使用存储
),
storage(
driver = "internal",
// 下面的 `flash_size` 仅适用于 RP2040。如果你不使用 RP2040,则省略。
// 应该等于闪存芯片的总大小(不是你的 CONFIG 分区的大小)
flash_size = 2097152,
// RP2040 上用于处理闪存操作的 `dma` 通道。如果不使用 RP2040,则省略。
dma = DMA_CH0
)
)]
struct MyKeyboard;

存储空间注意事项

为存储分配的空间量取决于你的键盘使用了哪些功能。

在底层,TicKV 用作文件系统来存储数据。有关更多信息,请参阅他们的规范文档。你可能希望考虑分配多个页面以提高闪存的寿命(即使你可能不一定需要所有空间)。

待办事项列表

  • QSPI 驱动