@@ -15,6 +15,10 @@ pub use stm32f4xx_hal as hal;
15
15
pub use stm32f4xx_hal:: stm32;
16
16
17
17
use stm32:: { Interrupt , ETHERNET_DMA , ETHERNET_MAC , NVIC } ;
18
+ use hal:: {
19
+ rcc:: Clocks ,
20
+ time:: U32Ext ,
21
+ } ;
18
22
19
23
use cortex_m:: asm;
20
24
@@ -46,21 +50,6 @@ const PHY_ADDR: u8 = 0;
46
50
/// From the datasheet: *VLAN Frame maxsize = 1522*
47
51
const MTU : usize = 1522 ;
48
52
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
-
64
53
/// Ethernet driver for *STM32* chips with a *LAN8742*
65
54
/// [`Phy`](phy/struct.Phy.html) like they're found on STM Nucleo-144
66
55
/// boards.
@@ -89,24 +78,48 @@ impl<'rx, 'tx> Eth<'rx, 'tx> {
89
78
eth_dma : ETHERNET_DMA ,
90
79
rx_buffer : & ' rx mut [ RxRingEntry ] ,
91
80
tx_buffer : & ' tx mut [ TxRingEntry ] ,
81
+ clocks : & Clocks ,
92
82
) -> Self {
93
83
let mut eth = Eth {
94
84
eth_mac,
95
85
eth_dma,
96
86
rx_ring : RxRing :: new ( rx_buffer) ,
97
87
tx_ring : TxRing :: new ( tx_buffer) ,
98
88
} ;
99
- eth. init ( ) ;
89
+ eth. init ( clocks ) ;
100
90
eth. rx_ring . start ( & eth. eth_dma ) ;
101
91
eth. tx_ring . start ( & eth. eth_dma ) ;
102
92
eth
103
93
}
104
94
105
- fn init ( & mut self ) -> & Self {
95
+ fn init ( & mut self , clocks : & Clocks ) -> & Self {
106
96
self . reset_dma_and_wait ( ) ;
107
97
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
+
108
109
// 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
+
110
123
self . eth_mac
111
124
. macmiiar
112
125
. modify ( |_, w| unsafe { w. cr ( ) . bits ( clock_range) } ) ;
0 commit comments