@@ -149,6 +149,7 @@ struct QspiArgs {
149149 /// specify flash address in bytes
150150 #[ clap( long, short, value_name = "address" ,
151151 parse( try_from_str = parse_int:: parse) ,
152+ conflicts_with( "writefile" ) ,
152153 ) ]
153154 addr : Option < usize > ,
154155
@@ -251,6 +252,7 @@ fn deltas(
251252 device : & QspiDevice ,
252253 filename : & str ,
253254 compare : & [ ( u32 , Vec < u8 > ) ] ,
255+ base_addr : u32 ,
254256 mut diff : impl FnMut ( u32 , & [ u8 ] ) -> Result < ( ) > ,
255257) -> Result < ( ) > {
256258 let filelen = fs:: metadata ( filename) ?. len ( ) as u32 ;
@@ -261,8 +263,9 @@ fn deltas(
261263 for ( c, result) in compare {
262264 let mut buf = vec ! [ 0u8 ; device. sector_size as usize ] ;
263265
264- if offset != * c {
265- bail ! ( "mismatched offset; expected {}, found {}" , offset, c) ;
266+ let addr = base_addr + offset;
267+ if addr != * c {
268+ bail ! ( "mismatched offset; expected {addr}, found {c}" ) ;
266269 }
267270
268271 let len = if offset + device. sector_size > filelen {
@@ -278,7 +281,7 @@ fn deltas(
278281 let sum = hasher. finalize ( ) ;
279282
280283 if !sum. iter ( ) . eq ( result. iter ( ) ) {
281- diff ( offset , & buf[ ..len as usize ] ) ?;
284+ diff ( addr , & buf[ ..len as usize ] ) ?;
282285 }
283286
284287 offset += device. sector_size ;
@@ -811,7 +814,7 @@ fn qspi(context: &mut ExecutionContext) -> Result<()> {
811814 let results = context. run ( core, ops. as_slice ( ) , Some ( & buf) ) ?;
812815
813816 if updates % update_cycle == 0 {
814- bar. set_position ( ( address) . into ( ) ) ;
817+ bar. set_position ( ( nbytes - ( end_address - address) ) . into ( ) ) ;
815818 }
816819 updates += 1 ;
817820
@@ -852,7 +855,13 @@ fn qspi(context: &mut ExecutionContext) -> Result<()> {
852855 // We are going to hash the contents to find the differences, and
853856 // then erase/flash the different sectors.
854857 //
855- let mut address = 0u32 ;
858+ let base_addr = subargs. addr . unwrap_or ( 0 ) as u32 ;
859+ if base_addr % SECTOR_SIZE != 0 {
860+ bail ! (
861+ "base address (`--addr {base_addr:#x}`) must be divisible by \
862+ sector size ({SECTOR_SIZE:#x})"
863+ ) ;
864+ }
856865 let mut sums = vec ! [ ] ;
857866
858867 let bar = ProgressBar :: new ( filelen as u64 ) ;
@@ -862,29 +871,26 @@ fn qspi(context: &mut ExecutionContext) -> Result<()> {
862871 . template ( "humility: hashing [{bar:30}] {bytes}/{total_bytes}" ) ,
863872 ) ;
864873
874+ let mut offset = 0u32 ;
865875 loop {
866876 let mut ops = vec ! [ ] ;
867- let max = 8 ;
868- let mut laps = 0 ;
869- let base = address;
870-
871- bar. set_position ( address. into ( ) ) ;
877+ bar. set_position ( offset as u64 ) ;
878+ let base = base_addr + offset;
872879
873- loop {
874- let len = if address + SECTOR_SIZE > filelen {
875- filelen - address
880+ for _lap in 0 .. 8 {
881+ let len = if offset + SECTOR_SIZE > filelen {
882+ filelen - offset
876883 } else {
877884 SECTOR_SIZE
878885 } ;
879886
880- ops. push ( Op :: Push32 ( address ) ) ;
887+ ops. push ( Op :: Push32 ( base_addr + offset ) ) ;
881888 ops. push ( Op :: Push32 ( len) ) ;
882889 ops. push ( Op :: Call ( qspi_hash. id ) ) ;
883890
884- laps += 1 ;
885- address += len;
891+ offset += len;
886892
887- if address >= filelen || laps >= max {
893+ if offset >= filelen {
888894 break ;
889895 }
890896 }
@@ -910,7 +916,7 @@ fn qspi(context: &mut ExecutionContext) -> Result<()> {
910916 }
911917 }
912918
913- if address + SECTOR_SIZE >= filelen {
919+ if offset + SECTOR_SIZE >= filelen {
914920 break ;
915921 }
916922 }
@@ -921,8 +927,8 @@ fn qspi(context: &mut ExecutionContext) -> Result<()> {
921927 let mut bufs: Vec < Vec < u8 > > = vec ! [ ] ;
922928 let mut nbytes = 0 ;
923929
924- deltas ( & device, & filename, & sums, |offset , buf| {
925- sectors. push ( offset ) ;
930+ deltas ( & device, & filename, & sums, base_addr , |addr , buf| {
931+ sectors. push ( addr ) ;
926932 bufs. push ( buf. to_vec ( ) ) ;
927933 nbytes += buf. len ( ) ;
928934 Ok ( ( ) )
0 commit comments