Skip to content

Commit 3751fa1

Browse files
committed
Split Eth into EthernetDMA and EthernetMAC
This allows smi and dma to be used safely independently, e.g. smoltcp-nal could get dma access, and it would still be possible to check link status. Signed-off-by: Moritz Scheuren <moritz.scheuren@systec-electronic.com>
1 parent 284079d commit 3751fa1

File tree

7 files changed

+218
-186
lines changed

7 files changed

+218
-186
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use stm32_eth::{
3737
};
3838

3939

40-
use stm32_eth::{Eth, RingEntry};
40+
use stm32_eth::{RingEntry};
4141

4242
fn main() {
4343
let p = Peripherals::take().unwrap();
@@ -65,7 +65,7 @@ fn main() {
6565

6666
let mut rx_ring: [RingEntry<_>; 16] = Default::default();
6767
let mut tx_ring: [RingEntry<_>; 8] = Default::default();
68-
let mut eth = Eth::new(
68+
let (mut eth_dma, _eth_mac) = stm32_eth::new(
6969
p.ETHERNET_MAC,
7070
p.ETHERNET_DMA,
7171
&mut rx_ring[..],
@@ -74,13 +74,13 @@ fn main() {
7474
eth_pins,
7575
)
7676
.unwrap();
77-
eth.enable_interrupt();
77+
eth_dma.enable_interrupt();
7878

7979
if let Ok(pkt) = eth.recv_next() {
8080
// handle received pkt
8181
}
8282

83-
eth.send(size, |buf| {
83+
eth_dma.send(size, |buf| {
8484
// write up to `size` bytes into buf before it is being sent
8585
}).expect("send");
8686
}

examples/arp-smoltcp.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use smoltcp::wire::{
3030
ArpOperation, ArpPacket, ArpRepr, EthernetAddress, EthernetFrame, EthernetProtocol,
3131
EthernetRepr, Ipv4Address,
3232
};
33-
use stm32_eth::{Eth, EthPins, RingEntry, TxError};
33+
use stm32_eth::{EthPins, RingEntry, TxError};
3434

3535
const PHY_REG_BSR: u8 = 0x01;
3636
const PHY_REG_BSR_UP: u16 = 1 << 2;
@@ -75,7 +75,7 @@ fn main() -> ! {
7575

7676
let mut rx_ring: [RingEntry<_>; 16] = Default::default();
7777
let mut tx_ring: [RingEntry<_>; 8] = Default::default();
78-
let mut eth = Eth::new(
78+
let (mut eth_dma, mut eth_mac) = stm32_eth::new(
7979
p.ETHERNET_MAC,
8080
p.ETHERNET_DMA,
8181
&mut rx_ring[..],
@@ -84,12 +84,12 @@ fn main() -> ! {
8484
eth_pins,
8585
)
8686
.unwrap();
87-
eth.enable_interrupt();
87+
eth_dma.enable_interrupt();
8888

8989
let mut last_link_up = false;
9090

9191
loop {
92-
let link_up = link_detected(eth.smi(&mut mdio, &mut mdc));
92+
let link_up = link_detected(eth_mac.smi(&mut mdio, &mut mdc));
9393

9494
if link_up != last_link_up {
9595
if link_up {
@@ -128,7 +128,7 @@ fn main() -> ! {
128128
header.emit(&mut frame);
129129
frame.payload_mut().copy_from_slice(&packet.into_inner());
130130

131-
let r = eth.send(SIZE, |buf| {
131+
let r = eth_dma.send(SIZE, |buf| {
132132
buf[0..SIZE].copy_from_slice(&frame.into_inner());
133133
});
134134

examples/arp.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use stm32_eth::{
2626

2727
use cortex_m_semihosting::hprintln;
2828

29-
use stm32_eth::{Eth, EthPins, RingEntry, TxError};
29+
use stm32_eth::{EthPins, RingEntry, TxError};
3030

3131
const PHY_REG_BSR: u8 = 0x01;
3232
const PHY_REG_BSR_UP: u16 = 1 << 2;
@@ -71,7 +71,7 @@ fn main() -> ! {
7171

7272
let mut rx_ring: [RingEntry<_>; 16] = Default::default();
7373
let mut tx_ring: [RingEntry<_>; 8] = Default::default();
74-
let mut eth = Eth::new(
74+
let (mut eth_dma, mut eth_mac) = stm32_eth::new(
7575
p.ETHERNET_MAC,
7676
p.ETHERNET_DMA,
7777
&mut rx_ring[..],
@@ -80,12 +80,12 @@ fn main() -> ! {
8080
eth_pins,
8181
)
8282
.unwrap();
83-
eth.enable_interrupt();
83+
eth_dma.enable_interrupt();
8484

8585
let mut last_link_up = false;
8686

8787
loop {
88-
let link_up = link_detected(eth.smi(&mut mdio, &mut mdc));
88+
let link_up = link_detected(eth_mac.smi(&mut mdio, &mut mdc));
8989

9090
if link_up != last_link_up {
9191
if link_up {
@@ -111,7 +111,7 @@ fn main() -> ! {
111111
const TARGET_MAC: [u8; 6] = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
112112
const TARGET_IP: [u8; 4] = [0x0A, 0x00, 0x00, 0x02]; // 10.0.0.2
113113

114-
let r = eth.send(SIZE, |buf| {
114+
let r = eth_dma.send(SIZE, |buf| {
115115
buf[0..6].copy_from_slice(&DST_MAC);
116116
buf[6..12].copy_from_slice(&SRC_MAC);
117117
buf[12..14].copy_from_slice(&ETH_TYPE);

examples/ip.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use smoltcp::socket::{TcpSocket, TcpSocketBuffer};
2424
use smoltcp::time::Instant;
2525
use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr, Ipv4Address};
2626

27-
use stm32_eth::{Eth, EthPins, RingEntry};
27+
use stm32_eth::{EthPins, RingEntry};
2828

2929
static mut LOGGER: HioLogger = HioLogger {};
3030

@@ -85,7 +85,7 @@ fn main() -> ! {
8585

8686
let mut rx_ring: [RingEntry<_>; 8] = Default::default();
8787
let mut tx_ring: [RingEntry<_>; 2] = Default::default();
88-
let mut eth = Eth::new(
88+
let (mut eth_dma, _eth_mac) = stm32_eth::new(
8989
p.ETHERNET_MAC,
9090
p.ETHERNET_DMA,
9191
&mut rx_ring[..],
@@ -94,7 +94,7 @@ fn main() -> ! {
9494
eth_pins,
9595
)
9696
.unwrap();
97-
eth.enable_interrupt();
97+
eth_dma.enable_interrupt();
9898

9999
let local_addr = Ipv4Address::new(10, 0, 0, 1);
100100
let ip_addr = IpCidr::new(IpAddress::from(local_addr), 24);
@@ -104,7 +104,7 @@ fn main() -> ! {
104104
let ethernet_addr = EthernetAddress(SRC_MAC);
105105

106106
let mut sockets: [_; 1] = Default::default();
107-
let mut iface = InterfaceBuilder::new(&mut eth, &mut sockets[..])
107+
let mut iface = InterfaceBuilder::new(&mut eth_dma, &mut sockets[..])
108108
.hardware_addr(ethernet_addr.into())
109109
.ip_addrs(&mut ip_addrs[..])
110110
.neighbor_cache(neighbor_cache)

examples/pktgen.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use stm32_eth::{
2424
use core::fmt::Write;
2525
use cortex_m_semihosting::hio;
2626

27-
use stm32_eth::{Eth, EthPins, RingEntry, TxError};
27+
use stm32_eth::{EthPins, RingEntry, TxError};
2828

2929
const SRC_MAC: [u8; 6] = [0x00, 0x00, 0xDE, 0xAD, 0xBE, 0xEF];
3030
const DST_MAC: [u8; 6] = [0x00, 0x00, 0xBE, 0xEF, 0xDE, 0xAD];
@@ -68,7 +68,7 @@ fn main() -> ! {
6868

6969
let mut rx_ring: [RingEntry<_>; 16] = Default::default();
7070
let mut tx_ring: [RingEntry<_>; 8] = Default::default();
71-
let mut eth = Eth::new(
71+
let (mut eth_dma, mut eth_mac) = stm32_eth::new(
7272
p.ETHERNET_MAC,
7373
p.ETHERNET_DMA,
7474
&mut rx_ring[..],
@@ -77,7 +77,7 @@ fn main() -> ! {
7777
eth_pins,
7878
)
7979
.unwrap();
80-
eth.enable_interrupt();
80+
eth_dma.enable_interrupt();
8181

8282
// Main loop
8383
let mut last_stats_time = 0usize;
@@ -112,7 +112,7 @@ fn main() -> ! {
112112
}
113113

114114
// Link change detection
115-
let link_up = link_detected(eth.smi(&mut mdio, &mut mdc));
115+
let link_up = link_detected(eth_mac.smi(&mut mdio, &mut mdc));
116116
if link_up != last_link_up {
117117
if link_up {
118118
writeln!(stdout, "Ethernet: no link detected").unwrap();
@@ -130,7 +130,7 @@ fn main() -> ! {
130130
// handle rx packet
131131
{
132132
let mut recvd = 0usize;
133-
while let Ok(pkt) = eth.recv_next() {
133+
while let Ok(pkt) = eth_dma.recv_next() {
134134
rx_bytes += pkt.len();
135135
rx_pkts += 1;
136136
pkt.free();
@@ -142,15 +142,15 @@ fn main() -> ! {
142142
}
143143
}
144144
}
145-
if !eth.rx_is_running() {
145+
if !eth_dma.rx_is_running() {
146146
writeln!(stdout, "RX stopped").unwrap();
147147
}
148148

149149
// fill tx queue
150150
const SIZE: usize = 1500;
151-
if link_detected(eth.smi(&mut mdio, &mut mdc)) {
151+
if link_detected(eth_mac.smi(&mut mdio, &mut mdc)) {
152152
'egress: loop {
153-
let r = eth.send(SIZE, |buf| {
153+
let r = eth_dma.send(SIZE, |buf| {
154154
buf[0..6].copy_from_slice(&DST_MAC);
155155
buf[6..12].copy_from_slice(&SRC_MAC);
156156
buf[12..14].copy_from_slice(&ETH_TYPE);

0 commit comments

Comments
 (0)