@@ -928,6 +928,8 @@ pub struct FatFsCursor<SDMMC> {
928
928
sdmmc : SDMMC ,
929
929
pos : u64 ,
930
930
partition_info : Option < ( u32 , u32 ) > ,
931
+ block : [ u8 ; 512 ] ,
932
+ current_block : Option < u32 > ,
931
933
}
932
934
933
935
impl FatFsCursor < Sdmmc > {
@@ -936,6 +938,8 @@ impl FatFsCursor<Sdmmc> {
936
938
sdmmc,
937
939
pos : 0 ,
938
940
partition_info : None ,
941
+ block : [ 0 ; 512 ] ,
942
+ current_block : None ,
939
943
}
940
944
}
941
945
@@ -982,9 +986,6 @@ impl<SDMMC> IoBase for FatFsCursor<SDMMC> {
982
986
#[ cfg( feature = "fatfs" ) ]
983
987
impl Seek for FatFsCursor < Sdmmc > {
984
988
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
-
988
989
// TODO: Use `checked_add_signed` when stable.
989
990
let new_pos = match pos {
990
991
SeekFrom :: Start ( offset) => offset as i128 ,
@@ -1019,9 +1020,14 @@ impl Read for FatFsCursor<Sdmmc> {
1019
1020
let offset = ( pos % 512 ) as usize ;
1020
1021
let len = buf. len ( ) . min ( 512 - offset) ;
1021
1022
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
+
1025
1031
self . pos += len as u64 ;
1026
1032
1027
1033
Ok ( len)
@@ -1046,10 +1052,16 @@ impl Write for FatFsCursor<Sdmmc> {
1046
1052
let offset = ( pos % 512 ) as usize ;
1047
1053
let len = buf. len ( ) . min ( 512 - offset) ;
1048
1054
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
+
1053
1065
self . pos += len as u64 ;
1054
1066
1055
1067
Ok ( len)
0 commit comments