From bc4e459e288920a20a86af620cb0302ad2010aee Mon Sep 17 00:00:00 2001 From: bunnie Date: Thu, 27 Nov 2025 12:34:40 +0800 Subject: [PATCH] convert spim txrx timeout from a hard-error into an error message occassionally when the bus is loaded, some SPIM transactions won't complete. this needs to be looked into a little more, i think... --- libs/bao1x-hal/src/sh1107.rs | 12 ++++++++++-- libs/bao1x-hal/src/udma/mod.rs | 2 +- libs/bao1x-hal/src/udma/spim.rs | 3 ++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/libs/bao1x-hal/src/sh1107.rs b/libs/bao1x-hal/src/sh1107.rs index 72e162f8e..8ced7bad2 100644 --- a/libs/bao1x-hal/src/sh1107.rs +++ b/libs/bao1x-hal/src/sh1107.rs @@ -423,7 +423,11 @@ impl<'a> Oled128x128<'a> { .txrx_data_async_from_parts::(total_buf_len, len, true, false) .expect("Couldn't initiate oled command"); } - self.spim.txrx_await(false).unwrap(); + self.spim.txrx_await(false).unwrap_or_else(|_e| { + #[cfg(feature = "std")] + log::error!("txrx err {:?}", _e); + &[] + }); } pub fn init(&mut self) { @@ -479,7 +483,11 @@ impl<'a> FrameBuffer for Oled128x128<'a> { .txrx_data_async_from_parts::(page * chunk_size, chunk_size, true, false) .expect("Couldn't initiate oled data transfer"); } - self.spim.txrx_await(false).unwrap(); + self.spim.txrx_await(false).unwrap_or_else(|_e| { + #[cfg(feature = "std")] + log::error!("txrx err {:?}", _e); + &[] + }); } } diff --git a/libs/bao1x-hal/src/udma/mod.rs b/libs/bao1x-hal/src/udma/mod.rs index d9b9e4abc..bf2064959 100644 --- a/libs/bao1x-hal/src/udma/mod.rs +++ b/libs/bao1x-hal/src/udma/mod.rs @@ -270,7 +270,7 @@ pub trait Udma { ); */ bank_addr.add(DmaReg::Saddr.into()).write_volatile(buf_addr); bank_addr.add(DmaReg::Size.into()).write_volatile((buf.len() * size_of::()) as u32); - bank_addr.add(DmaReg::Cfg.into()).write_volatile(config | CFG_EN) + bank_addr.add(DmaReg::Cfg.into()).write_volatile(config | CFG_EN | CFG_BACKPRESSURE) } fn udma_reset(&self, bank: Bank) { unsafe { diff --git a/libs/bao1x-hal/src/udma/spim.rs b/libs/bao1x-hal/src/udma/spim.rs index ff83f52fd..93266e639 100644 --- a/libs/bao1x-hal/src/udma/spim.rs +++ b/libs/bao1x-hal/src/udma/spim.rs @@ -657,7 +657,7 @@ impl Spim { if let Some(pending) = self.pending_txrx.take() { let tt = xous_api_ticktimer::Ticktimer::new().unwrap(); let start = tt.elapsed_ms(); - let mut now = tt.elapsed_ms(); + let mut now = start; const TIMEOUT_MS: u64 = 500; while (self.udma_busy(Bank::Tx) || self.udma_busy(Bank::Rx) || self.udma_busy(Bank::Custom)) && ((now - start) < TIMEOUT_MS) @@ -690,6 +690,7 @@ impl Spim { self.csr().base().add(Bank::Rx as usize).add(DmaReg::Saddr.into()).write_volatile(0); self.csr().base().add(Bank::Rx as usize).add(DmaReg::Cfg.into()).write_volatile(0); // clear bit is not self-clearing }; + return Err(xous::Error::Timeout); } Ok(&self.rx_buf()[..pending]) } else {