From a8e905f14ecf238675b343c037d20700ab6f4881 Mon Sep 17 00:00:00 2001 From: "robert.jeutter" Date: Thu, 5 Jun 2025 06:48:44 +0200 Subject: net-nrf91: add nrf9151 support. --- .github/ci/doc.sh | 1 + embassy-net-nrf91/src/lib.rs | 51 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/.github/ci/doc.sh b/.github/ci/doc.sh index 58ffe5f2e..06c61f8c0 100755 --- a/.github/ci/doc.sh +++ b/.github/ci/doc.sh @@ -42,6 +42,7 @@ docserver-builder -i ./embassy-usb-logger -o webroot/crates/embassy-usb-logger/g docserver-builder -i ./embassy-usb-synopsys-otg -o webroot/crates/embassy-usb-synopsys-otg/git.zup docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup +docserver-builder -i ./embassy-net-nrf91 -o webroot/crates/embassy-net-nrf91/git.zup docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup docserver-builder -i ./embassy-net-wiznet -o webroot/crates/embassy-net-wiznet/git.zup diff --git a/embassy-net-nrf91/src/lib.rs b/embassy-net-nrf91/src/lib.rs index 61fcaea1f..0bd9be0d9 100644 --- a/embassy-net-nrf91/src/lib.rs +++ b/embassy-net-nrf91/src/lib.rs @@ -119,14 +119,16 @@ async fn new_internal<'a>( let shmem_ptr = shmem.as_mut_ptr() as *mut u8; const SPU_REGION_SIZE: usize = 8192; // 8kb - assert!(shmem_len != 0); + trace!(" shmem_ptr = {}, shmem_len = {}", shmem_ptr, shmem_len); + + assert!(shmem_len != 0, "shmem length must not be zero"); assert!( shmem_len % SPU_REGION_SIZE == 0, "shmem length must be a multiple of 8kb" ); assert!( (shmem_ptr as usize) % SPU_REGION_SIZE == 0, - "shmem length must be a multiple of 8kb" + "shmem pointer must be 8kb-aligned" ); assert!( (shmem_ptr as usize + shmem_len) < 0x2002_0000, @@ -135,8 +137,15 @@ async fn new_internal<'a>( let spu = pac::SPU_S; debug!("Setting IPC RAM as nonsecure..."); + trace!( + " SPU_REGION_SIZE={}, shmem_ptr=0x{:08X}, shmem_len={}", + SPU_REGION_SIZE, + shmem_ptr as usize, + shmem_len + ); let region_start = (shmem_ptr as usize - 0x2000_0000) / SPU_REGION_SIZE; let region_end = region_start + shmem_len / SPU_REGION_SIZE; + trace!(" region_start={}, region_end={}", region_start, region_end); for i in region_start..region_end { spu.ramregion(i).perm().write(|w| { w.set_execute(true); @@ -154,13 +163,18 @@ async fn new_internal<'a>( end: unsafe { shmem_ptr.add(shmem_len) }, _phantom: PhantomData, }; - - let ipc = pac::IPC_NS; - let power = pac::POWER_S; + trace!( + " Allocator: start=0x{:08X}, end=0x{:08X}", + alloc.start as usize, + alloc.end as usize + ); let cb: &mut ControlBlock = alloc.alloc().write(unsafe { mem::zeroed() }); + let rx = alloc.alloc_bytes(RX_SIZE); + trace!(" RX buffer at {}, size={}", rx.as_ptr(), RX_SIZE); let trace = alloc.alloc_bytes(TRACE_SIZE); + trace!(" Trace buffer at {}, size={}", trace.as_ptr(), TRACE_SIZE); cb.version = 0x00010000; cb.rx_base = rx.as_mut_ptr() as _; @@ -174,8 +188,10 @@ async fn new_internal<'a>( cb.trace.base = trace.as_mut_ptr() as _; cb.trace.size = TRACE_SIZE; + let ipc = pac::IPC_NS; ipc.gpmem(0).write_value(cb as *mut _ as u32); ipc.gpmem(1).write_value(0); + trace!(" GPMEM[0]={:#X}, GPMEM[1]={}", cb as *mut _ as u32, 0); // connect task/event i to channel i for i in 0..8 { @@ -185,8 +201,9 @@ async fn new_internal<'a>( compiler_fence(Ordering::SeqCst); + let power = pac::POWER_S; // POWER.LTEMODEM.STARTN = 0 - // The reg is missing in the PAC?? + // TODO: The reg is missing in the PAC?? let startn = unsafe { (power.as_ptr() as *mut u32).add(0x610 / 4) }; unsafe { startn.write_volatile(0) } @@ -202,6 +219,8 @@ async fn new_internal<'a>( rx_control_list: ptr::null_mut(), rx_data_list: ptr::null_mut(), + rx_control_len: 0, + rx_data_len: 0, rx_seq_no: 0, rx_check: PointerChecker { start: rx.as_mut_ptr() as *mut u8, @@ -310,6 +329,10 @@ struct StateInner { rx_control_list: *mut List, rx_data_list: *mut List, + /// Number of entries in the control list + rx_control_len: usize, + /// Number of entries in the data list + rx_data_len: usize, rx_seq_no: u16, rx_check: PointerChecker, @@ -346,8 +369,11 @@ impl StateInner { self.rx_data_list = desc.data_list_ptr; let rx_control_len = unsafe { addr_of!((*self.rx_control_list).len).read_volatile() }; let rx_data_len = unsafe { addr_of!((*self.rx_data_list).len).read_volatile() }; - assert_eq!(rx_control_len, LIST_LEN); - assert_eq!(rx_data_len, LIST_LEN); + + trace!("modem control list length: {}", rx_control_len); + trace!("modem data list length: {}", rx_data_len); + self.rx_control_len = rx_control_len; + self.rx_data_len = rx_data_len; self.init = true; debug!("IPC initialized OK!"); @@ -463,7 +489,12 @@ impl StateInner { fn process(&mut self, list: *mut List, is_control: bool, ch: &mut ch::Runner) -> bool { let mut did_work = false; - for i in 0..LIST_LEN { + let max = if is_control { + self.rx_control_len + } else { + self.rx_data_len + }; + for i in 0..max { let item_ptr = unsafe { addr_of_mut!((*list).items[i]) }; let preamble = unsafe { addr_of!((*item_ptr).state).read_volatile() }; if preamble & 0xFF == 0x01 && preamble >> 16 == self.rx_seq_no as u32 { @@ -947,7 +978,7 @@ impl<'a> Runner<'a> { } } -const LIST_LEN: usize = 16; +const LIST_LEN: usize = 32; #[repr(C)] struct ControlBlock { -- cgit