diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-07-10 18:35:15 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-10 18:35:15 +0000 |
| commit | c511d166cdde76fc985f6531eae2bf1ffb461589 (patch) | |
| tree | 6c3437e2cdd9a2c5ca62a907209d4d8531ea1f26 | |
| parent | 20ce4d7deb3b16ff32bd68f7adae9066ddd40e94 (diff) | |
| parent | a8e905f14ecf238675b343c037d20700ab6f4881 (diff) | |
Merge pull request #4098 from wieerwill/support-nrf9151-modem
[embassy-net-nrf91] patch greater rx_data_len size
| -rwxr-xr-x | .github/ci/doc.sh | 1 | ||||
| -rw-r--r-- | 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 | |||
| 42 | docserver-builder -i ./embassy-usb-synopsys-otg -o webroot/crates/embassy-usb-synopsys-otg/git.zup | 42 | docserver-builder -i ./embassy-usb-synopsys-otg -o webroot/crates/embassy-usb-synopsys-otg/git.zup |
| 43 | 43 | ||
| 44 | docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup | 44 | docserver-builder -i ./embassy-net -o webroot/crates/embassy-net/git.zup |
| 45 | docserver-builder -i ./embassy-net-nrf91 -o webroot/crates/embassy-net-nrf91/git.zup | ||
| 45 | docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup | 46 | docserver-builder -i ./embassy-net-driver -o webroot/crates/embassy-net-driver/git.zup |
| 46 | docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup | 47 | docserver-builder -i ./embassy-net-driver-channel -o webroot/crates/embassy-net-driver-channel/git.zup |
| 47 | docserver-builder -i ./embassy-net-wiznet -o webroot/crates/embassy-net-wiznet/git.zup | 48 | 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>( | |||
| 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 | ||
| 950 | const LIST_LEN: usize = 16; | 981 | const LIST_LEN: usize = 32; |
| 951 | 982 | ||
| 952 | #[repr(C)] | 983 | #[repr(C)] |
| 953 | struct ControlBlock { | 984 | struct ControlBlock { |
