aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-net-driver-channel/src/lib.rs26
-rw-r--r--embassy-usb/src/class/cdc_ncm/embassy_net.rs6
2 files changed, 20 insertions, 12 deletions
diff --git a/embassy-net-driver-channel/src/lib.rs b/embassy-net-driver-channel/src/lib.rs
index 073edb41a..0c8dcc22b 100644
--- a/embassy-net-driver-channel/src/lib.rs
+++ b/embassy-net-driver-channel/src/lib.rs
@@ -50,9 +50,13 @@ pub struct Runner<'d, const MTU: usize> {
50 shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, 50 shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
51} 51}
52 52
53#[derive(Clone, Copy)]
54pub struct StateRunner<'d> {
55 shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
56}
57
53pub struct RxRunner<'d, const MTU: usize> { 58pub struct RxRunner<'d, const MTU: usize> {
54 rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, 59 rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
55 shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
56} 60}
57 61
58pub struct TxRunner<'d, const MTU: usize> { 62pub struct TxRunner<'d, const MTU: usize> {
@@ -60,16 +64,18 @@ pub struct TxRunner<'d, const MTU: usize> {
60} 64}
61 65
62impl<'d, const MTU: usize> Runner<'d, MTU> { 66impl<'d, const MTU: usize> Runner<'d, MTU> {
63 pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { 67 pub fn split(self) -> (StateRunner<'d>, RxRunner<'d, MTU>, TxRunner<'d, MTU>) {
64 ( 68 (
65 RxRunner { 69 StateRunner { shared: self.shared },
66 shared: self.shared, 70 RxRunner { rx_chan: self.rx_chan },
67 rx_chan: self.rx_chan,
68 },
69 TxRunner { tx_chan: self.tx_chan }, 71 TxRunner { tx_chan: self.tx_chan },
70 ) 72 )
71 } 73 }
72 74
75 pub fn state_runner(&self) -> StateRunner<'d> {
76 StateRunner { shared: self.shared }
77 }
78
73 pub fn set_link_state(&mut self, state: LinkState) { 79 pub fn set_link_state(&mut self, state: LinkState) {
74 self.shared.lock(|s| { 80 self.shared.lock(|s| {
75 let s = &mut *s.borrow_mut(); 81 let s = &mut *s.borrow_mut();
@@ -131,8 +137,8 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
131 } 137 }
132} 138}
133 139
134impl<'d, const MTU: usize> RxRunner<'d, MTU> { 140impl<'d> StateRunner<'d> {
135 pub fn set_link_state(&mut self, state: LinkState) { 141 pub fn set_link_state(&self, state: LinkState) {
136 self.shared.lock(|s| { 142 self.shared.lock(|s| {
137 let s = &mut *s.borrow_mut(); 143 let s = &mut *s.borrow_mut();
138 s.link_state = state; 144 s.link_state = state;
@@ -140,14 +146,16 @@ impl<'d, const MTU: usize> RxRunner<'d, MTU> {
140 }); 146 });
141 } 147 }
142 148
143 pub fn set_ethernet_address(&mut self, address: [u8; 6]) { 149 pub fn set_ethernet_address(&self, address: [u8; 6]) {
144 self.shared.lock(|s| { 150 self.shared.lock(|s| {
145 let s = &mut *s.borrow_mut(); 151 let s = &mut *s.borrow_mut();
146 s.ethernet_address = address; 152 s.ethernet_address = address;
147 s.waker.wake(); 153 s.waker.wake();
148 }); 154 });
149 } 155 }
156}
150 157
158impl<'d, const MTU: usize> RxRunner<'d, MTU> {
151 pub async fn rx_buf(&mut self) -> &mut [u8] { 159 pub async fn rx_buf(&mut self) -> &mut [u8] {
152 let p = self.rx_chan.send().await; 160 let p = self.rx_chan.send().await;
153 &mut p.buf 161 &mut p.buf
diff --git a/embassy-usb/src/class/cdc_ncm/embassy_net.rs b/embassy-usb/src/class/cdc_ncm/embassy_net.rs
index 7ecf693d2..501df2d8c 100644
--- a/embassy-usb/src/class/cdc_ncm/embassy_net.rs
+++ b/embassy-usb/src/class/cdc_ncm/embassy_net.rs
@@ -25,16 +25,16 @@ pub struct Runner<'d, D: Driver<'d>, const MTU: usize> {
25 25
26impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> { 26impl<'d, D: Driver<'d>, const MTU: usize> Runner<'d, D, MTU> {
27 pub async fn run(mut self) -> ! { 27 pub async fn run(mut self) -> ! {
28 let (mut rx_chan, mut tx_chan) = self.ch.split(); 28 let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split();
29 let rx_fut = async move { 29 let rx_fut = async move {
30 loop { 30 loop {
31 trace!("WAITING for connection"); 31 trace!("WAITING for connection");
32 rx_chan.set_link_state(LinkState::Down); 32 state_chan.set_link_state(LinkState::Down);
33 33
34 self.rx_usb.wait_connection().await.unwrap(); 34 self.rx_usb.wait_connection().await.unwrap();
35 35
36 trace!("Connected"); 36 trace!("Connected");
37 rx_chan.set_link_state(LinkState::Up); 37 state_chan.set_link_state(LinkState::Up);
38 38
39 loop { 39 loop {
40 let p = rx_chan.rx_buf().await; 40 let p = rx_chan.rx_buf().await;