aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobert.jeutter <[email protected]>2025-06-05 06:48:44 +0200
committerDario Nieuwenhuis <[email protected]>2025-07-10 20:19:53 +0200
commita8e905f14ecf238675b343c037d20700ab6f4881 (patch)
tree1261c784c22ac89c431cbe33b9f03d0727521ac6
parent7f1f2377022757a50fb8d23197baef6b576bffb3 (diff)
net-nrf91: add nrf9151 support.
-rwxr-xr-x.github/ci/doc.sh1
-rw-r--r--embassy-net-nrf91/src/lib.rs51
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
42docserver-builder -i ./embassy-usb-synopsys-otg -o webroot/crates/embassy-usb-synopsys-otg/git.zup 42docserver-builder -i ./embassy-usb-synopsys-otg -o webroot/crates/embassy-usb-synopsys-otg/git.zup
43 43
44docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup 44docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup
45docserver-builder -i ./embassy-net-nrf91 -o webroot/crates/embassy-net-nrf91/git.zup
45docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup 46docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup
46docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup 47docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup
47docserver-builder -i ./embassy-net-wiznet -o webroot/crates/embassy-net-wiznet/git.zup 48docserver-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>(
119 let shmem_ptr = shmem.as_mut_ptr() as *mut u8; 119 let shmem_ptr = shmem.as_mut_ptr() as *mut u8;
120 120
121 const SPU_REGION_SIZE: usize = 8192; // 8kb 121 const SPU_REGION_SIZE: usize = 8192; // 8kb
122 assert!(shmem_len != 0); 122 trace!(" shmem_ptr = {}, shmem_len = {}", shmem_ptr, shmem_len);
123
124 assert!(shmem_len != 0, "shmem length must not be zero");
123 assert!( 125 assert!(
124 shmem_len % SPU_REGION_SIZE == 0, 126 shmem_len % SPU_REGION_SIZE == 0,
125 "shmem length must be a multiple of 8kb" 127 "shmem length must be a multiple of 8kb"
126 ); 128 );
127 assert!( 129 assert!(
128 (shmem_ptr as usize) % SPU_REGION_SIZE == 0, 130 (shmem_ptr as usize) % SPU_REGION_SIZE == 0,
129 "shmem length must be a multiple of 8kb" 131 "shmem pointer must be 8kb-aligned"
130 ); 132 );
131 assert!( 133 assert!(
132 (shmem_ptr as usize + shmem_len) < 0x2002_0000, 134 (shmem_ptr as usize + shmem_len) < 0x2002_0000,
@@ -135,8 +137,15 @@ async fn new_internal<'a>(
135 137
136 let spu = pac::SPU_S; 138 let spu = pac::SPU_S;
137 debug!("Setting IPC RAM as nonsecure..."); 139 debug!("Setting IPC RAM as nonsecure...");
140 trace!(
141 " SPU_REGION_SIZE={}, shmem_ptr=0x{:08X}, shmem_len={}",
142 SPU_REGION_SIZE,
143 shmem_ptr as usize,
144 shmem_len
145 );
138 let region_start = (shmem_ptr as usize - 0x2000_0000) / SPU_REGION_SIZE; 146 let region_start = (shmem_ptr as usize - 0x2000_0000) / SPU_REGION_SIZE;
139 let region_end = region_start + shmem_len / SPU_REGION_SIZE; 147 let region_end = region_start + shmem_len / SPU_REGION_SIZE;
148 trace!(" region_start={}, region_end={}", region_start, region_end);
140 for i in region_start..region_end { 149 for i in region_start..region_end {
141 spu.ramregion(i).perm().write(|w| { 150 spu.ramregion(i).perm().write(|w| {
142 w.set_execute(true); 151 w.set_execute(true);
@@ -154,13 +163,18 @@ async fn new_internal<'a>(
154 end: unsafe { shmem_ptr.add(shmem_len) }, 163 end: unsafe { shmem_ptr.add(shmem_len) },
155 _phantom: PhantomData, 164 _phantom: PhantomData,
156 }; 165 };
157 166 trace!(
158 let ipc = pac::IPC_NS; 167 " Allocator: start=0x{:08X}, end=0x{:08X}",
159 let power = pac::POWER_S; 168 alloc.start as usize,
169 alloc.end as usize
170 );
160 171
161 let cb: &mut ControlBlock = alloc.alloc().write(unsafe { mem::zeroed() }); 172 let cb: &mut ControlBlock = alloc.alloc().write(unsafe { mem::zeroed() });
173
162 let rx = alloc.alloc_bytes(RX_SIZE); 174 let rx = alloc.alloc_bytes(RX_SIZE);
175 trace!(" RX buffer at {}, size={}", rx.as_ptr(), RX_SIZE);
163 let trace = alloc.alloc_bytes(TRACE_SIZE); 176 let trace = alloc.alloc_bytes(TRACE_SIZE);
177 trace!(" Trace buffer at {}, size={}", trace.as_ptr(), TRACE_SIZE);
164 178
165 cb.version = 0x00010000; 179 cb.version = 0x00010000;
166 cb.rx_base = rx.as_mut_ptr() as _; 180 cb.rx_base = rx.as_mut_ptr() as _;
@@ -174,8 +188,10 @@ async fn new_internal<'a>(
174 cb.trace.base = trace.as_mut_ptr() as _; 188 cb.trace.base = trace.as_mut_ptr() as _;
175 cb.trace.size = TRACE_SIZE; 189 cb.trace.size = TRACE_SIZE;
176 190
191 let ipc = pac::IPC_NS;
177 ipc.gpmem(0).write_value(cb as *mut _ as u32); 192 ipc.gpmem(0).write_value(cb as *mut _ as u32);
178 ipc.gpmem(1).write_value(0); 193 ipc.gpmem(1).write_value(0);
194 trace!(" GPMEM[0]={:#X}, GPMEM[1]={}", cb as *mut _ as u32, 0);
179 195
180 // connect task/event i to channel i 196 // connect task/event i to channel i
181 for i in 0..8 { 197 for i in 0..8 {
@@ -185,8 +201,9 @@ async fn new_internal<'a>(
185 201
186 compiler_fence(Ordering::SeqCst); 202 compiler_fence(Ordering::SeqCst);
187 203
204 let power = pac::POWER_S;
188 // POWER.LTEMODEM.STARTN = 0 205 // POWER.LTEMODEM.STARTN = 0
189 // The reg is missing in the PAC?? 206 // TODO: The reg is missing in the PAC??
190 let startn = unsafe { (power.as_ptr() as *mut u32).add(0x610 / 4) }; 207 let startn = unsafe { (power.as_ptr() as *mut u32).add(0x610 / 4) };
191 unsafe { startn.write_volatile(0) } 208 unsafe { startn.write_volatile(0) }
192 209
@@ -202,6 +219,8 @@ async fn new_internal<'a>(
202 219
203 rx_control_list: ptr::null_mut(), 220 rx_control_list: ptr::null_mut(),
204 rx_data_list: ptr::null_mut(), 221 rx_data_list: ptr::null_mut(),
222 rx_control_len: 0,
223 rx_data_len: 0,
205 rx_seq_no: 0, 224 rx_seq_no: 0,
206 rx_check: PointerChecker { 225 rx_check: PointerChecker {
207 start: rx.as_mut_ptr() as *mut u8, 226 start: rx.as_mut_ptr() as *mut u8,
@@ -310,6 +329,10 @@ struct StateInner {
310 329
311 rx_control_list: *mut List, 330 rx_control_list: *mut List,
312 rx_data_list: *mut List, 331 rx_data_list: *mut List,
332 /// Number of entries in the control list
333 rx_control_len: usize,
334 /// Number of entries in the data list
335 rx_data_len: usize,
313 rx_seq_no: u16, 336 rx_seq_no: u16,
314 rx_check: PointerChecker, 337 rx_check: PointerChecker,
315 338
@@ -346,8 +369,11 @@ impl StateInner {
346 self.rx_data_list = desc.data_list_ptr; 369 self.rx_data_list = desc.data_list_ptr;
347 let rx_control_len = unsafe { addr_of!((*self.rx_control_list).len).read_volatile() }; 370 let rx_control_len = unsafe { addr_of!((*self.rx_control_list).len).read_volatile() };
348 let rx_data_len = unsafe { addr_of!((*self.rx_data_list).len).read_volatile() }; 371 let rx_data_len = unsafe { addr_of!((*self.rx_data_list).len).read_volatile() };
349 assert_eq!(rx_control_len, LIST_LEN); 372
350 assert_eq!(rx_data_len, LIST_LEN); 373 trace!("modem control list length: {}", rx_control_len);
374 trace!("modem data list length: {}", rx_data_len);
375 self.rx_control_len = rx_control_len;
376 self.rx_data_len = rx_data_len;
351 self.init = true; 377 self.init = true;
352 378
353 debug!("IPC initialized OK!"); 379 debug!("IPC initialized OK!");
@@ -463,7 +489,12 @@ impl StateInner {
463 489
464 fn process(&mut self, list: *mut List, is_control: bool, ch: &mut ch::Runner<MTU>) -> bool { 490 fn process(&mut self, list: *mut List, is_control: bool, ch: &mut ch::Runner<MTU>) -> bool {
465 let mut did_work = false; 491 let mut did_work = false;
466 for i in 0..LIST_LEN { 492 let max = if is_control {
493 self.rx_control_len
494 } else {
495 self.rx_data_len
496 };
497 for i in 0..max {
467 let item_ptr = unsafe { addr_of_mut!((*list).items[i]) }; 498 let item_ptr = unsafe { addr_of_mut!((*list).items[i]) };
468 let preamble = unsafe { addr_of!((*item_ptr).state).read_volatile() }; 499 let preamble = unsafe { addr_of!((*item_ptr).state).read_volatile() };
469 if preamble & 0xFF == 0x01 && preamble >> 16 == self.rx_seq_no as u32 { 500 if preamble & 0xFF == 0x01 && preamble >> 16 == self.rx_seq_no as u32 {
@@ -947,7 +978,7 @@ impl<'a> Runner<'a> {
947 } 978 }
948} 979}
949 980
950const LIST_LEN: usize = 16; 981const LIST_LEN: usize = 32;
951 982
952#[repr(C)] 983#[repr(C)]
953struct ControlBlock { 984struct ControlBlock {