40
40
#include "lwip/dhcp.h"
41
41
#include "netif/ethernet.h"
42
42
43
- // ETH PHY register definitions (for LAN8742)
44
-
43
+ // ETH PHY register definitions (for LAN8742 and LAN8720/LAN8710)
45
44
#undef PHY_BCR
46
45
#define PHY_BCR (0x0000)
47
46
#define PHY_BCR_SOFT_RESET (0x8000)
@@ -137,6 +136,7 @@ typedef struct _eth_t {
137
136
uint32_t trace_flags ;
138
137
struct netif netif ;
139
138
struct dhcp dhcp_struct ;
139
+ uint32_t phy_addr ;
140
140
} eth_t ;
141
141
142
142
static eth_dma_t eth_dma __attribute__((aligned (16384 )));
@@ -146,11 +146,13 @@ eth_t eth_instance;
146
146
STATIC void eth_mac_deinit (eth_t * self );
147
147
STATIC void eth_process_frame (eth_t * self , size_t len , const uint8_t * buf );
8000
148
148
149
- STATIC void eth_phy_write (uint32_t reg , uint32_t val ) {
149
+ STATIC void eth_phy_write (uint32_t phy_addr , uint32_t reg , uint32_t val ) {
150
150
#if defined(STM32H5 ) || defined(STM32H7 )
151
151
while (ETH -> MACMDIOAR & ETH_MACMDIOAR_MB ) {
152
152
}
153
153
uint32_t ar = ETH -> MACMDIOAR ;
154
+ ar &= ~ETH_MACMDIOAR_PA_Msk ;
155
+ ar |= (phy_addr << ETH_MACMDIOAR_PA_Pos );
154
156
ar &= ~ETH_MACMDIOAR_RDA_Msk ;
155
157
ar |= reg << ETH_MACMDIOAR_RDA_Pos ;
156
158
ar &= ~ETH_MACMDIOAR_MOC_Msk ;
@@ -165,18 +167,20 @@ STATIC void eth_phy_write(uint32_t reg, uint32_t val) {
165
167
}
166
168
ETH -> MACMIIDR = val ;
167
169
uint32_t ar = ETH -> MACMIIAR ;
168
- ar = reg << ETH_MACMIIAR_MR_Pos | (ar & ETH_MACMIIAR_CR_Msk ) | ETH_MACMIIAR_MW | ETH_MACMIIAR_MB ;
170
+ ar = ( phy_addr << ETH_MACMIIAR_PA_Pos ) | ( reg << ETH_MACMIIAR_MR_Pos ) | (ar & ETH_MACMIIAR_CR_Msk ) | ETH_MACMIIAR_MW | ETH_MACMIIAR_MB ;
169
171
ETH -> MACMIIAR = ar ;
170
172
while (ETH -> MACMIIAR & ETH_MACMIIAR_MB ) {
171
173
}
172
174
#endif
173
175
<
8000
div class="diff-text-inner">}
174
176
175
- STATIC uint32_t eth_phy_read (uint32_t reg ) {
177
+ STATIC uint32_t eth_phy_read (uint32_t phy_addr , uint32_t reg ) {
176
178
#if defined(STM32H5 ) || defined(STM32H7 )
177
179
while (ETH -> MACMDIOAR & ETH_MACMDIOAR_MB ) {
178
180
}
179
181
uint32_t ar = ETH -> MACMDIOAR ;
182
+ ar &= ~ETH_MACMDIOAR_PA_Msk ;
183
+ ar |= (phy_addr << ETH_MACMDIOAR_PA_Pos );
180
184
ar &= ~ETH_MACMDIOAR_RDA_Msk ;
181
185
ar |= reg << ETH_MACMDIOAR_RDA_Pos ;
182
186
ar &= ~ETH_MACMDIOAR_MOC_Msk ;
@@ -190,17 +194,18 @@ STATIC uint32_t eth_phy_read(uint32_t reg) {
190
194
while (ETH -> MACMIIAR & ETH_MACMIIAR_MB ) {
191
195
}
192
196
uint32_t ar = ETH -> MACMIIAR ;
193
- ar = reg << ETH_MACMIIAR_MR_Pos | (ar & ETH_MACMIIAR_CR_Msk ) | ETH_MACMIIAR_MB ;
197
+ ar = ( phy_addr << ETH_MACMIIAR_PA_Pos ) | ( reg << ETH_MACMIIAR_MR_Pos ) | (ar & ETH_MACMIIAR_CR_Msk ) | ETH_MACMIIAR_MB ;
194
198
ETH -> MACMIIAR = ar ;
195
199
while (ETH -> MACMIIAR & ETH_MACMIIAR_MB ) {
196
200
}
197
201
return ETH -> MACMIIDR ;
198
202
#endif
199
203
}
200
204
201
- void eth_init (eth_t * self , int mac_idx ) {
205
+ void eth_init (eth_t * self , int mac_idx , uint32_t phy_addr , int phy_type ) {
202
206
mp_hal_get_mac (mac_idx , & self -> netif .hwaddr [0 ]);
203
207
self -> netif .hwaddr_len = 6 ;
208
+ self -> phy_addr = phy_addr ;
204
209
205
210
// Configure GPIO
206
211
mp_hal_pin_config_alt_static (MICROPY_HW_ETH_MDC , MP_HAL_PIN_MODE_ALT , MP_HAL_PIN_PULL_NONE , STATIC_AF_ETH_MDC );
@@ -362,7 +367,7 @@ STATIC int eth_mac_init(eth_t *self) {
362
367
#endif
363
368
364
369
// Reset the PHY
365
- eth_phy_write (PHY_BCR , PHY_BCR_SOFT_RESET );
370
+ eth_phy_write (self -> phy_addr , PHY_BCR , PHY_BCR_SOFT_RESET );
366
371
mp_hal_delay_ms (50 );
367
372
368
373
// Wait for the PHY link to be established
@@ -373,8 +378,8 @@ STATIC int eth_mac_init(eth_t *self) {
373
378
eth_mac_deinit (self );
374
379
return - MP_ETIMEDOUT ;
375
380
}
376
- uint16_t bcr = eth_phy_read (0 );
377
- uint16_t bsr = eth_phy_read (1 );
381
+ uint16_t bcr = eth_phy_read (self -> phy_addr , PHY_BCR );
382
+ uint16_t bsr = eth_phy_read (self -> phy_addr , PHY_BSR );
378
383
switch (phy_state ) {
379
384
case 0 :
380
385
if (!(bcr & PHY_BCR_SOFT_RESET )) {
@@ -383,7 +388,7 @@ STATIC int eth_mac_init(eth_t *self) {
383
388
break ;
384
389
case 1 :
385
390
if (bsr & PHY_BSR_LINK_STATUS ) {
386
- eth_phy_write (PHY_BCR , PHY_BCR_AUTONEG_EN );
391
+ eth_phy_write (self -> phy_addr , PHY_BCR , PHY_BCR_AUTONEG_EN );
387
392
phy_state = 2 ;
388
393
}
389
394
break ;
@@ -398,7 +403,7 @@ STATIC int eth_mac_init(eth_t *self) {
398
403
}
399
404
400
405
// Get register with link status
401
- uint16_t phy_scsr = eth_phy_read (PHY_SCSR );
406
+ uint16_t phy_scsr = eth_phy_read (self -> phy_addr , PHY_SCSR );
402
407
403
408
// Burst mode configuration
404
409
#if defined(STM32H5 ) || defined(STM32H7 )
@@ -845,7 +850,7 @@ int eth_link_status(eth_t *self) {
845
850
return 2 ; // link no-ip;
846
851
}
847
852
} else {
848
- if (eth_phy_read (PHY_BSR ) & PHY_BSR_LINK_STATUS ) {
853
+ if (eth_phy_read (self -> phy_addr , PHY_BSR ) & PHY_BSR_LINK_STATUS ) {
849
854
return 1 ; // link up
850
855
} else {
851
856
return 0 ; // link down
@@ -883,10 +888,10 @@ void eth_low_power_mode(eth_t *self, bool enable) {
883
888
__HAL_RCC_ETH_CLK_ENABLE ();
884
889
#endif
885
890
886
- uint16_t bcr = eth_phy_read (PHY_BCR );
891
+ uint16_t bcr = eth_phy_read (self -> phy_addr , PHY_BCR );
887
892
if (enable ) {
888
893
// Enable low-power mode.
889
- eth_phy_write (PHY_BCR , bcr | PHY_BCR_POWER_DOWN );
894
+ eth_phy_write (self -> phy_addr , PHY_BCR , bcr | PHY_BCR_POWER_DOWN );
890
895
// Disable eth clock.
891
896
#if defined(STM32H7 )
892
897
__HAL_RCC_ETH1MAC_CLK_DISABLE ();
@@ -895,7 +900,7 @@ void eth_low_power_mode(eth_t *self, bool enable) {
895
900
#endif
896
901
} else {
897
902
// Disable low-power mode.
898
- eth_phy_write (PHY_BCR , bcr & (~PHY_BCR_POWER_DOWN ));
903
+ eth_phy_write (self -> phy_addr , PHY_BCR , bcr & (~PHY_BCR_POWER_DOWN ));
899
904
}
900
905
}
901
906
#endif // defined(MICROPY_HW_ETH_MDC)
0 commit comments