RKTK API Docs RKTK Home Repo

rktk_drivers_common/storage/
flash_sequential_map.rs

1//! Storage driver using [`sequential_storage`] and nor flash.
2
3use core::fmt::Debug;
4use embedded_storage_async::nor_flash::{MultiwriteNorFlash, NorFlash, ReadNorFlash};
5use rktk::{
6    drivers::interface::{Error, storage::StorageDriver},
7    utils::Mutex,
8};
9pub use sequential_storage;
10use sequential_storage::{
11    cache::NoCache,
12    map::{fetch_item, remove_all_items, store_item},
13};
14
15pub struct FlashSequentialMapStorage<'a, F: NorFlash + ReadNorFlash + MultiwriteNorFlash> {
16    pub flash_range: core::ops::Range<u32>,
17    pub flash: &'a Mutex<F>,
18    pub cache: &'a Mutex<NoCache>,
19}
20
21#[derive(Debug)]
22#[cfg_attr(feature = "defmt", derive(defmt::Format))]
23pub enum FlashSequentialMapStorageError<E: Debug> {
24    Storage(#[cfg_attr(feature = "defmt", defmt(Debug2Format))] sequential_storage::Error<E>),
25    NotFound,
26}
27
28impl<E: Debug> Error for FlashSequentialMapStorageError<E> {}
29
30impl<E: Debug> From<sequential_storage::Error<E>> for FlashSequentialMapStorageError<E> {
31    fn from(e: sequential_storage::Error<E>) -> Self {
32        Self::Storage(e)
33    }
34}
35
36impl<F: NorFlash + ReadNorFlash + MultiwriteNorFlash> StorageDriver
37    for FlashSequentialMapStorage<'_, F>
38{
39    type Error = FlashSequentialMapStorageError<F::Error>;
40
41    async fn format(&self) -> Result<(), Self::Error> {
42        let mut flash = self.flash.lock().await;
43        let mut cache = self.cache.lock().await;
44        remove_all_items::<u64, _>(
45            &mut *flash,
46            self.flash_range.clone(),
47            &mut *cache,
48            &mut [0; 1024],
49        )
50        .await?;
51        Ok(())
52    }
53
54    async fn read<const N: usize>(&self, key: u64, buf: &mut [u8]) -> Result<(), Self::Error> {
55        let mut flash = self.flash.lock().await;
56        let mut cache = self.cache.lock().await;
57        let val: [u8; N] = fetch_item(
58            &mut *flash,
59            self.flash_range.clone(),
60            &mut *cache,
61            &mut [0; 1024],
62            &key,
63        )
64        .await?
65        .ok_or(FlashSequentialMapStorageError::NotFound)?;
66        buf.copy_from_slice(&val);
67        Ok(())
68    }
69
70    async fn write<const N: usize>(&self, key: u64, buf: &[u8]) -> Result<(), Self::Error> {
71        let mut flash = self.flash.lock().await;
72        let mut cache = self.cache.lock().await;
73        store_item(
74            &mut *flash,
75            self.flash_range.clone(),
76            &mut *cache,
77            &mut [0; 1024],
78            &key,
79            &buf,
80        )
81        .await?;
82        Ok(())
83    }
84}