Skip to content

Commit caf5008

Browse files
committed
Add buffer for SDMMC access.
1 parent 9b3d004 commit caf5008

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

src/sdmmc.rs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,8 @@ pub struct FatFsCursor<SDMMC> {
928928
sdmmc: SDMMC,
929929
pos: u64,
930930
partition_info: Option<(u32, u32)>,
931+
block: [u8; 512],
932+
current_block: Option<u32>,
931933
}
932934

933935
impl FatFsCursor<Sdmmc> {
@@ -936,6 +938,8 @@ impl FatFsCursor<Sdmmc> {
936938
sdmmc,
937939
pos: 0,
938940
partition_info: None,
941+
block: [0; 512],
942+
current_block: None,
939943
}
940944
}
941945

@@ -982,9 +986,6 @@ impl<SDMMC> IoBase for FatFsCursor<SDMMC> {
982986
#[cfg(feature = "fatfs")]
983987
impl Seek for FatFsCursor<Sdmmc> {
984988
fn seek(&mut self, pos: SeekFrom) -> Result<u64, Self::Error> {
985-
let itm = unsafe { &mut *cortex_m::peripheral::ITM::PTR };
986-
// cortex_m::itm::write_fmt(&mut itm.stim[0], format_args!("Seek from {} to {:?}\n", self.pos, pos));
987-
988989
// TODO: Use `checked_add_signed` when stable.
989990
let new_pos = match pos {
990991
SeekFrom::Start(offset) => offset as i128,
@@ -1019,9 +1020,14 @@ impl Read for FatFsCursor<Sdmmc> {
10191020
let offset = (pos % 512) as usize;
10201021
let len = buf.len().min(512 - offset);
10211022

1022-
let mut block = [0; 512];
1023-
self.sdmmc.read_block(addr, &mut block)?;
1024-
buf[0..len].copy_from_slice(&block[offset..(offset + len)]);
1023+
// Only read the block if we have not already read it.
1024+
if self.current_block != Some(addr) {
1025+
self.sdmmc.read_block(addr, &mut self.block)?;
1026+
self.current_block = Some(addr);
1027+
}
1028+
1029+
buf[0..len].copy_from_slice(&self.block[offset..(offset + len)]);
1030+
10251031
self.pos += len as u64;
10261032

10271033
Ok(len)
@@ -1046,10 +1052,16 @@ impl Write for FatFsCursor<Sdmmc> {
10461052
let offset = (pos % 512) as usize;
10471053
let len = buf.len().min(512 - offset);
10481054

1049-
let mut block = [0; 512];
1050-
self.sdmmc.read_block(addr, &mut block)?;
1051-
block[offset..(offset + len)].copy_from_slice(&buf[0..len]);
1052-
self.sdmmc.write_block(addr, &block)?;
1055+
// Only read the block if we have not already read it.
1056+
if self.current_block != Some(addr) {
1057+
self.current_block = None;
1058+
self.sdmmc.read_block(addr, &mut self.block)?;
1059+
}
1060+
1061+
self.block[offset..(offset + len)].copy_from_slice(&buf[0..len]);
1062+
self.sdmmc.write_block(addr, &self.block)?;
1063+
self.current_block = Some(addr);
1064+
10531065
self.pos += len as u64;
10541066

10551067
Ok(len)

0 commit comments

Comments
 (0)