From 21427bf019daaf2371dd33c4d7e22b0eb0ada0c6 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Fri, 6 Mar 2026 15:35:45 +0100 Subject: [PATCH 1/3] removed page alignment constraint for qspi spansion programming --- firmware/zedboard-bsp/src/qspi_spansion.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/firmware/zedboard-bsp/src/qspi_spansion.rs b/firmware/zedboard-bsp/src/qspi_spansion.rs index f099537..a0555b6 100644 --- a/firmware/zedboard-bsp/src/qspi_spansion.rs +++ b/firmware/zedboard-bsp/src/qspi_spansion.rs @@ -500,7 +500,7 @@ impl QspiSpansionS25Fl256SIoMode { return Err(AddrError::Alignment.into()); } for chunk in data.chunks(PAGE_SIZE) { - self.program_page(addr, chunk)?; + self.program(addr, chunk)?; addr += PAGE_SIZE as u32; } Ok(()) @@ -510,13 +510,10 @@ impl QspiSpansionS25Fl256SIoMode { /// This function will block until the operation has completed. /// /// The data length max not exceed the page size [PAGE_SIZE]. - pub fn program_page(&mut self, addr: u32, data: &[u8]) -> Result<(), ProgramPageError> { + pub fn program(&mut self, addr: u32, data: &[u8]) -> Result<(), ProgramPageError> { if addr + data.len() as u32 > u24::MAX.as_u32() { return Err(AddrError::OutOfRange.into()); } - if !addr.is_multiple_of(PAGE_SIZE as u32) { - return Err(AddrError::Alignment.into()); - } if data.len() > PAGE_SIZE { return Err(ProgramPageError::DataLargerThanPage); } -- 2.43.0 From 74940360991d45ae014bf577abdfbf03c3f8eb0a Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Fri, 6 Mar 2026 16:04:07 +0100 Subject: [PATCH 2/3] changed read_page to read --- firmware/zedboard-bsp/src/qspi_spansion.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/zedboard-bsp/src/qspi_spansion.rs b/firmware/zedboard-bsp/src/qspi_spansion.rs index a0555b6..d3dd194 100644 --- a/firmware/zedboard-bsp/src/qspi_spansion.rs +++ b/firmware/zedboard-bsp/src/qspi_spansion.rs @@ -610,7 +610,7 @@ impl QspiSpansionS25Fl256SIoMode { } } - fn generic_read_page(&self, addr: u32, buf: &mut [u8], dummy_byte: bool, fast_read: bool) { + fn generic_read(&self, addr: u32, buf: &mut [u8], dummy_byte: bool, fast_read: bool) { let mut offset = 0; let reg_id = if fast_read { RegisterId::FastRead @@ -730,13 +730,13 @@ impl QspiSpansionS25Fl256SIoMode { } } - pub fn read_page_fast_read(&self, addr: u32, buf: &mut [u8], dummy_byte: bool) { - self.generic_read_page(addr, buf, dummy_byte, true) + pub fn read_fast_read(&self, addr: u32, buf: &mut [u8], dummy_byte: bool) { + self.generic_read(addr, buf, dummy_byte, true) } /// Only works if the clock speed is slower than 50 MHz according to datasheet. pub fn read_page_read(&self, addr: u32, buf: &mut [u8]) { - self.generic_read_page(addr, buf, false, false) + self.generic_read(addr, buf, false, false) } } -- 2.43.0 From ecabeb1a4bd48da4870f70c1aafbfce6722b9214 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Tue, 10 Mar 2026 11:25:55 +0100 Subject: [PATCH 3/3] adapted qspi example and qpsi-flasher to api changes in qspi_spansion --- firmware/examples/zedboard/src/bin/qspi.rs | 4 ++-- firmware/zedboard-qspi-flasher/README.md | 7 ++++++- firmware/zedboard-qspi-flasher/src/main.rs | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/firmware/examples/zedboard/src/bin/qspi.rs b/firmware/examples/zedboard/src/bin/qspi.rs index 34e2fd9..dd7159a 100644 --- a/firmware/examples/zedboard/src/bin/qspi.rs +++ b/firmware/examples/zedboard/src/bin/qspi.rs @@ -129,13 +129,13 @@ async fn main(_spawner: Spawner) -> ! { spansion_qspi .erase_sector(0x10000) .expect("erasing sector failed"); - spansion_qspi.read_page_fast_read(0x10000, &mut read_buf, true); + spansion_qspi.read_fast_read(0x10000, &mut read_buf, true); for read in read_buf.iter() { assert_eq!(*read, 0xFF); } read_buf.fill(0); spansion_qspi.write_pages(0x10000, &write_buf).unwrap(); - spansion_qspi.read_page_fast_read(0x10000, &mut read_buf, true); + spansion_qspi.read_fast_read(0x10000, &mut read_buf, true); for (read, written) in read_buf.iter().zip(write_buf.iter()) { assert_eq!(read, written); } diff --git a/firmware/zedboard-qspi-flasher/README.md b/firmware/zedboard-qspi-flasher/README.md index d962b75..0309bea 100644 --- a/firmware/zedboard-qspi-flasher/README.md +++ b/firmware/zedboard-qspi-flasher/README.md @@ -11,4 +11,9 @@ The main `justfile` provides a convenience runner: just flash-nor-zedboard ``` -Please note that `xsct` must be callable for this to be usable. +Please note that `xsct` must be callable for this to be usable which is part of a Xilinx Vitis installation. + +If the hardware server is running on a remote target the IP address can be specified by setting the environment variable ip_address_hw_server. +````sh +$ export ip_address_hw_server= +```` \ No newline at end of file diff --git a/firmware/zedboard-qspi-flasher/src/main.rs b/firmware/zedboard-qspi-flasher/src/main.rs index 3838744..7f0454a 100644 --- a/firmware/zedboard-qspi-flasher/src/main.rs +++ b/firmware/zedboard-qspi-flasher/src/main.rs @@ -148,7 +148,7 @@ fn main() -> ! { let write_size = core::cmp::min(qspi_spansion::PAGE_SIZE, boot_bin_size - current_addr); let write_slice = &boot_bin_slice[current_addr..current_addr + write_size]; log::debug!("Programming address {:#x}", current_addr); - match spansion_qspi.program_page(current_addr as u32, write_slice) { + match spansion_qspi.program(current_addr as u32, write_slice) { Ok(()) => {} Err(e) => { log::error!( @@ -160,7 +160,7 @@ fn main() -> ! { } } if VERIFY_PROGRAMMING { - spansion_qspi.read_page_fast_read( + spansion_qspi.read_fast_read( current_addr as u32, &mut read_buf[0..write_size], true, -- 2.43.0