diff options
| author | Ulf Lilleengen <[email protected]> | 2024-09-04 14:09:17 +0200 |
|---|---|---|
| committer | Ulf Lilleengen <[email protected]> | 2024-09-04 14:09:17 +0200 |
| commit | b4221d75b87664485977d37df28f7319143411fc (patch) | |
| tree | 7002cc6264f300c4d321e9bbece46098157d8194 /embassy-net-nrf91 | |
| parent | 5e27a3e64f46340e50bc6f61e6ef5a89e9f077ab (diff) | |
Make tracing optional and use dedicated task
Diffstat (limited to 'embassy-net-nrf91')
| -rw-r--r-- | embassy-net-nrf91/src/lib.rs | 90 |
1 files changed, 71 insertions, 19 deletions
diff --git a/embassy-net-nrf91/src/lib.rs b/embassy-net-nrf91/src/lib.rs index beed7c65a..673784cb2 100644 --- a/embassy-net-nrf91/src/lib.rs +++ b/embassy-net-nrf91/src/lib.rs | |||
| @@ -19,12 +19,15 @@ use core::task::{Poll, Waker}; | |||
| 19 | 19 | ||
| 20 | use embassy_net_driver_channel as ch; | 20 | use embassy_net_driver_channel as ch; |
| 21 | use embassy_sync::waitqueue::{AtomicWaker, WakerRegistration}; | 21 | use embassy_sync::waitqueue::{AtomicWaker, WakerRegistration}; |
| 22 | use embassy_sync::blocking_mutex::raw::NoopRawMutex; | ||
| 22 | use heapless::Vec; | 23 | use heapless::Vec; |
| 23 | use nrf9160_pac as pac; | 24 | use nrf9160_pac as pac; |
| 24 | use pac::NVIC; | 25 | use pac::NVIC; |
| 26 | use embassy_sync::pipe; | ||
| 25 | 27 | ||
| 26 | const RX_SIZE: usize = 8 * 1024; | 28 | const RX_SIZE: usize = 8 * 1024; |
| 27 | const TRACE_SIZE: usize = 16 * 1024; | 29 | const TRACE_SIZE: usize = 16 * 1024; |
| 30 | const TRACE_BUF: usize = 1024; | ||
| 28 | const MTU: usize = 1500; | 31 | const MTU: usize = 1500; |
| 29 | 32 | ||
| 30 | /// Network driver. | 33 | /// Network driver. |
| @@ -91,11 +94,30 @@ impl<'a> Allocator<'a> { | |||
| 91 | } | 94 | } |
| 92 | 95 | ||
| 93 | /// Create a new nRF91 embassy-net driver. | 96 | /// Create a new nRF91 embassy-net driver. |
| 94 | pub async fn new<'a, TW: embedded_io::Write>( | 97 | pub async fn new<'a>( |
| 95 | state: &'a mut State, | 98 | state: &'a mut State, |
| 96 | shmem: &'a mut [MaybeUninit<u8>], | 99 | shmem: &'a mut [MaybeUninit<u8>], |
| 97 | trace_writer: TW, | 100 | ) -> (NetDriver<'a>, Control<'a>, Runner<'a>) { |
| 98 | ) -> (NetDriver<'a>, Control<'a>, Runner<'a, TW>) { | 101 | let (n, c, r, _) = new_internal(state, shmem, None).await; |
| 102 | (n, c, r) | ||
| 103 | } | ||
| 104 | |||
| 105 | /// Create a new nRF91 embassy-net driver with trace. | ||
| 106 | pub async fn new_with_trace<'a>( | ||
| 107 | state: &'a mut State, | ||
| 108 | shmem: &'a mut [MaybeUninit<u8>], | ||
| 109 | trace_buffer: &'a mut TraceBuffer, | ||
| 110 | ) -> (NetDriver<'a>, Control<'a>, Runner<'a>, TraceReader<'a>) { | ||
| 111 | let (n, c, r, t) = new_internal(state, shmem, Some(trace_buffer)).await; | ||
| 112 | (n, c, r, t.unwrap()) | ||
| 113 | } | ||
| 114 | |||
| 115 | /// Create a new nRF91 embassy-net driver. | ||
| 116 | async fn new_internal<'a>( | ||
| 117 | state: &'a mut State, | ||
| 118 | shmem: &'a mut [MaybeUninit<u8>], | ||
| 119 | trace_buffer: Option<&'a mut TraceBuffer>, | ||
| 120 | ) -> (NetDriver<'a>, Control<'a>, Runner<'a>, Option<TraceReader<'a>>) { | ||
| 99 | let shmem_len = shmem.len(); | 121 | let shmem_len = shmem.len(); |
| 100 | let shmem_ptr = shmem.as_mut_ptr() as *mut u8; | 122 | let shmem_ptr = shmem.as_mut_ptr() as *mut u8; |
| 101 | 123 | ||
| @@ -205,21 +227,49 @@ pub async fn new<'a, TW: embedded_io::Write>( | |||
| 205 | let state_ch = ch_runner.state_runner(); | 227 | let state_ch = ch_runner.state_runner(); |
| 206 | state_ch.set_link_state(ch::driver::LinkState::Up); | 228 | state_ch.set_link_state(ch::driver::LinkState::Up); |
| 207 | 229 | ||
| 230 | let (trace_reader, trace_writer) = if let Some(trace) = trace_buffer { | ||
| 231 | let (r, w) = trace.trace.split(); | ||
| 232 | (Some(r), Some(w)) | ||
| 233 | } else { | ||
| 234 | (None, None) | ||
| 235 | }; | ||
| 236 | |||
| 208 | let runner = Runner { | 237 | let runner = Runner { |
| 209 | ch: ch_runner, | 238 | ch: ch_runner, |
| 210 | state: state_inner, | 239 | state: state_inner, |
| 211 | trace_writer, | 240 | trace_writer, |
| 212 | }; | 241 | }; |
| 213 | 242 | ||
| 214 | (device, control, runner) | 243 | (device, control, runner, trace_reader) |
| 215 | } | 244 | } |
| 216 | 245 | ||
| 217 | /// Shared state for the drivver. | 246 | /// State holding modem traces. |
| 247 | pub struct TraceBuffer { | ||
| 248 | trace: pipe::Pipe<NoopRawMutex, TRACE_BUF>, | ||
| 249 | } | ||
| 250 | |||
| 251 | /// Represents writer half of the trace buffer. | ||
| 252 | pub type TraceWriter<'a> = pipe::Writer<'a, NoopRawMutex, TRACE_BUF>; | ||
| 253 | |||
| 254 | /// Represents the reader half of the trace buffer. | ||
| 255 | pub type TraceReader<'a> = pipe::Reader<'a, NoopRawMutex, TRACE_BUF>; | ||
| 256 | |||
| 257 | impl TraceBuffer { | ||
| 258 | /// Create a new TraceBuffer. | ||
| 259 | pub const fn new() -> Self { | ||
| 260 | Self { | ||
| 261 | trace: pipe::Pipe::new(), | ||
| 262 | } | ||
| 263 | } | ||
| 264 | } | ||
| 265 | |||
| 266 | /// Shared state for the driver. | ||
| 218 | pub struct State { | 267 | pub struct State { |
| 219 | ch: ch::State<MTU, 4, 4>, | 268 | ch: ch::State<MTU, 4, 4>, |
| 220 | inner: MaybeUninit<RefCell<StateInner>>, | 269 | inner: MaybeUninit<RefCell<StateInner>>, |
| 221 | } | 270 | } |
| 222 | 271 | ||
| 272 | |||
| 223 | impl State { | 273 | impl State { |
| 224 | /// Create a new State. | 274 | /// Create a new State. |
| 225 | pub const fn new() -> Self { | 275 | pub const fn new() -> Self { |
| @@ -272,7 +322,7 @@ struct StateInner { | |||
| 272 | } | 322 | } |
| 273 | 323 | ||
| 274 | impl StateInner { | 324 | impl StateInner { |
| 275 | fn poll(&mut self, trace_writer: &mut impl embedded_io::Write, ch: &mut ch::Runner<MTU>) { | 325 | fn poll(&mut self, trace_writer: &mut Option<TraceWriter<'_>>, ch: &mut ch::Runner<MTU>) { |
| 276 | trace!("poll!"); | 326 | trace!("poll!"); |
| 277 | let ipc = unsafe { &*pac::IPC_NS::ptr() }; | 327 | let ipc = unsafe { &*pac::IPC_NS::ptr() }; |
| 278 | 328 | ||
| @@ -399,15 +449,17 @@ impl StateInner { | |||
| 399 | }); | 449 | }); |
| 400 | } | 450 | } |
| 401 | 451 | ||
| 402 | fn handle_trace(writer: &mut impl embedded_io::Write, id: u8, data: &[u8]) { | 452 | fn handle_trace(writer: &mut Option<TraceWriter<'_>>, id: u8, data: &[u8]) { |
| 403 | trace!("trace: {} {}", id, data.len()); | 453 | if let Some(writer) = writer { |
| 404 | let mut header = [0u8; 5]; | 454 | trace!("trace: {} {}", id, data.len()); |
| 405 | header[0] = 0xEF; | 455 | let mut header = [0u8; 5]; |
| 406 | header[1] = 0xBE; | 456 | header[0] = 0xEF; |
| 407 | header[2..4].copy_from_slice(&(data.len() as u16).to_le_bytes()); | 457 | header[1] = 0xBE; |
| 408 | header[4] = id; | 458 | header[2..4].copy_from_slice(&(data.len() as u16).to_le_bytes()); |
| 409 | writer.write_all(&header).unwrap(); | 459 | header[4] = id; |
| 410 | writer.write_all(data).unwrap(); | 460 | writer.try_write(&header).ok(); |
| 461 | writer.try_write(data).ok(); | ||
| 462 | } | ||
| 411 | } | 463 | } |
| 412 | 464 | ||
| 413 | fn process(&mut self, list: *mut List, is_control: bool, ch: &mut ch::Runner<MTU>) -> bool { | 465 | fn process(&mut self, list: *mut List, is_control: bool, ch: &mut ch::Runner<MTU>) -> bool { |
| @@ -794,7 +846,7 @@ impl<'a> Control<'a> { | |||
| 794 | /// Open the raw socket used for sending/receiving IP packets. | 846 | /// Open the raw socket used for sending/receiving IP packets. |
| 795 | /// | 847 | /// |
| 796 | /// This must be done after `AT+CFUN=1` (?) | 848 | /// This must be done after `AT+CFUN=1` (?) |
| 797 | pub async fn open_raw_socket(&self) { | 849 | async fn open_raw_socket(&self) { |
| 798 | let mut msg: Message = unsafe { mem::zeroed() }; | 850 | let mut msg: Message = unsafe { mem::zeroed() }; |
| 799 | msg.channel = 2; // data | 851 | msg.channel = 2; // data |
| 800 | msg.id = 0x7001_0004; // open socket | 852 | msg.id = 0x7001_0004; // open socket |
| @@ -822,13 +874,13 @@ impl<'a> Control<'a> { | |||
| 822 | } | 874 | } |
| 823 | 875 | ||
| 824 | /// Background runner for the driver. | 876 | /// Background runner for the driver. |
| 825 | pub struct Runner<'a, TW: embedded_io::Write> { | 877 | pub struct Runner<'a> { |
| 826 | ch: ch::Runner<'a, MTU>, | 878 | ch: ch::Runner<'a, MTU>, |
| 827 | state: &'a RefCell<StateInner>, | 879 | state: &'a RefCell<StateInner>, |
| 828 | trace_writer: TW, | 880 | trace_writer: Option<TraceWriter<'a>>, |
| 829 | } | 881 | } |
| 830 | 882 | ||
| 831 | impl<'a, TW: embedded_io::Write> Runner<'a, TW> { | 883 | impl<'a> Runner<'a> { |
| 832 | /// Run the driver operation in the background. | 884 | /// Run the driver operation in the background. |
| 833 | /// | 885 | /// |
| 834 | /// You must run this in a background task, concurrently with all network operations. | 886 | /// You must run this in a background task, concurrently with all network operations. |
