Skip to content

Commit 5dbeeb9

Browse files
authored
Support --diffwrite FILE --addr ADDR (#518)
Previously, --diffwrite ignored --addr and always wrote from sector 0. This PR lets us use the --addr argument as a starting (sector-aligned) address. In addition, qspi --writefile now bails with an error if --addr is provided, because it's not used.
1 parent b75d4a6 commit 5dbeeb9

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

cmd/qspi/src/lib.rs

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)