Skip to content

Commit 10f6cc5

Browse files
committed
Set clock range
1 parent 1ca0be0 commit 10f6cc5

File tree

4 files changed

+41
-19
lines changed

4 files changed

+41
-19
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ In `src/main.rs` add:
3232
```rust
3333
use stm32_eth::{
3434
hal::gpio::GpioExt,
35+
hal::rcc::RccExt,
3536
stm32::Peripherals,
3637
};
3738

@@ -54,10 +55,12 @@ fn main() {
5455
// Allocate the ring buffers
5556
let mut rx_ring: [RingEntry<_>; 8] = Default::default();
5657
let mut tx_ring: [RingEntry<_>; 2] = Default::default();
58+
let clocks = p.RCC.constrain().cfgr.freeze();
5759
// Instantiate driver
5860
let mut eth = Eth::new(
5961
p.ETHERNET_MAC, p.ETHERNET_DMA,
60-
&mut rx_ring[..], &mut tx_ring[..]
62+
&mut rx_ring[..], &mut tx_ring[..],
63+
&clocks
6164
);
6265
// If you have a handler, enable interrupts
6366
eth.enable_interrupt(&mut cp.NVIC);

examples/ip.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use cortex_m_rt::{entry, exception};
88
use stm32_eth::{
99
stm32::{interrupt, CorePeripherals, Peripherals, SYST},
1010
hal::gpio::GpioExt,
11+
hal::rcc::RccExt,
1112
};
1213

1314
use core::cell::RefCell;
@@ -74,11 +75,13 @@ fn main() -> ! {
7475

7576
let mut rx_ring: [RingEntry<_>; 8] = Default::default();
7677
let mut tx_ring: [RingEntry<_>; 2] = Default::default();
78+
let clocks = p.RCC.constrain().cfgr.freeze();
7779
let mut eth = Eth::new(
7880
p.ETHERNET_MAC,
7981
p.ETHERNET_DMA,
8082
&mut rx_ring[..],
8183
&mut tx_ring[..],
84+
&clocks,
8285
);
8386
eth.enable_interrupt();
8487

examples/pktgen.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use cortex_m::interrupt::Mutex;
1212
use stm32_eth::{
1313
stm32::{interrupt, CorePeripherals, Peripherals, SYST},
1414
hal::gpio::GpioExt,
15+
hal::rcc::RccExt,
1516
};
1617

1718
use core::fmt::Write;
@@ -48,11 +49,13 @@ fn main() -> ! {
4849

4950
let mut rx_ring: [RingEntry<_>; 16] = Default::default();
5051
let mut tx_ring: [RingEntry<_>; 8] = Default::default();
52+
let clocks = p.RCC.constrain().cfgr.freeze();
5153
let mut eth = Eth::new(
5254
p.ETHERNET_MAC,
5355
p.ETHERNET_DMA,
5456
&mut rx_ring[..],
5557
&mut tx_ring[..],
58+
&clocks,
5659
);
5760
eth.enable_interrupt();
5861

src/lib.rs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ pub use stm32f4xx_hal as hal;
1515
pub use stm32f4xx_hal::stm32;
1616

1717
use stm32::{Interrupt, ETHERNET_DMA, ETHERNET_MAC, NVIC};
18+
use hal::{
19+
rcc::Clocks,
20+
time::U32Ext,
21+
};
1822

1923
use cortex_m::asm;
2024

@@ -46,21 +50,6 @@ const PHY_ADDR: u8 = 0;
4650
/// From the datasheet: *VLAN Frame maxsize = 1522*
4751
const MTU: usize = 1522;
4852

49-
#[allow(dead_code)]
50-
mod consts {
51-
/* For HCLK 60-100 MHz */
52-
pub const ETH_MACMIIAR_CR_HCLK_DIV_42: u8 = 0;
53-
/* For HCLK 100-150 MHz */
54-
pub const ETH_MACMIIAR_CR_HCLK_DIV_62: u8 = 1;
55-
/* For HCLK 20-35 MHz */
56-
pub const ETH_MACMIIAR_CR_HCLK_DIV_16: u8 = 2;
57-
/* For HCLK 35-60 MHz */
58-
pub const ETH_MACMIIAR_CR_HCLK_DIV_26: u8 = 3;
59-
/* For HCLK 150-168 MHz */
60-
pub const ETH_MACMIIAR_CR_HCLK_DIV_102: u8 = 4;
61-
}
62-
use self::consts::*;
63-
6453
/// Ethernet driver for *STM32* chips with a *LAN8742*
6554
/// [`Phy`](phy/struct.Phy.html) like they're found on STM Nucleo-144
6655
/// boards.
@@ -89,24 +78,48 @@ impl<'rx, 'tx> Eth<'rx, 'tx> {
8978
eth_dma: ETHERNET_DMA,
9079
rx_buffer: &'rx mut [RxRingEntry],
9180
tx_buffer: &'tx mut [TxRingEntry],
81+
clocks: &Clocks,
9282
) -> Self {
9383
let mut eth = Eth {
9484
eth_mac,
9585
eth_dma,
9686
rx_ring: RxRing::new(rx_buffer),
9787
tx_ring: TxRing::new(tx_buffer),
9888
};
99-
eth.init();
89+
eth.init(clocks);
10090
eth.rx_ring.start(&eth.eth_dma);
10191
eth.tx_ring.start(&eth.eth_dma);
10292
eth
10393
}
10494

105-
fn init(&mut self) -> &Self {
95+
fn init(&mut self, clocks : &Clocks) -> &Self {
10696
self.reset_dma_and_wait();
10797

98+
/* For HCLK 60-100 MHz */
99+
const ETH_MACMIIAR_CR_HCLK_DIV_42: u8 = 0;
100+
/* For HCLK 100-150 MHz */
101+
const ETH_MACMIIAR_CR_HCLK_DIV_62: u8 = 1;
102+
/* For HCLK 20-35 MHz */
103+
const ETH_MACMIIAR_CR_HCLK_DIV_16: u8 = 2;
104+
/* For HCLK 35-60 MHz */
105+
const ETH_MACMIIAR_CR_HCLK_DIV_26: u8 = 3;
106+
/* For HCLK 150+ MHz */
107+
const ETH_MACMIIAR_CR_HCLK_DIV_102: u8 = 4;
108+
108109
// set clock range in MAC MII address register
109-
let clock_range = ETH_MACMIIAR_CR_HCLK_DIV_26;
110+
let clock_range;
111+
if clocks.hclk() <= 35.mhz().into() {
112+
clock_range = ETH_MACMIIAR_CR_HCLK_DIV_16;
113+
} else if clocks.hclk() <= 60.mhz().into() {
114+
clock_range = ETH_MACMIIAR_CR_HCLK_DIV_26;
115+
} else if clocks.hclk() <= 100.mhz().into() {
116+
clock_range = ETH_MACMIIAR_CR_HCLK_DIV_42;
117+
} else if clocks.hclk() <= 150.mhz().into() {
118+
clock_range = ETH_MACMIIAR_CR_HCLK_DIV_62;
119+
} else {
120+
clock_range = ETH_MACMIIAR_CR_HCLK_DIV_102;
121+
}
122+
110123
self.eth_mac
111124
.macmiiar
112125
.modify(|_, w| unsafe { w.cr().bits(clock_range) });

0 commit comments

Comments
 (0)