62
62
#define PHY_SCSR_SPEED_100FULL (6 << PHY_SCSR_SPEED_Pos)
63
63
64
64
// ETH DMA RX and TX descriptor definitions
65
- #if defined(STM32H7 )
65
+ #if defined(STM32H5 )
66
+ #define RX_DESCR_3_OWN_Pos (31)
67
+ #define RX_DESCR_3_IOC_Pos (30)
68
+ #define RX_DESCR_3_BUF1V_Pos (24)
69
+ #define RX_DESCR_3_PL_Msk (0x7fff)
70
+
71
+ #define TX_DESCR_3_OWN_Pos (31)
72
+ #define TX_DESCR_3_FD_Pos (29)
73
+ #define TX_DESCR_3_LD_Pos (28)
74
+ #define TX_DESCR_3_CIC_Pos (16)
75
+ #define TX_DESCR_2_B1L_Pos (0)
76
+ #define TX_DESCR_2_B1L_Msk (0x3fff << TX_DESCR_2_B1L_Pos)
77
+ #elif defined(STM32H7 )
66
78
#define RX_DESCR_3_OWN_Pos (31)
67
79
#define RX_DESCR_3_IOC_Pos (30)
68
80
#define RX_DESCR_3_BUF1V_Pos (24)
@@ -135,7 +147,7 @@ STATIC void eth_mac_deinit(eth_t *self);
135
147
STATIC void eth_process_frame (eth_t * self , size_t len , const uint8_t * buf );
136
148
137
149
STATIC void eth_phy_write (uint32_t reg , uint32_t val ) {
138
- #if defined(STM32H7 )
150
+ #if defined(STM32H5 ) || defined( STM32H7 )
139
151
while (ETH -> MACMDIOAR & ETH_MACMDIOAR_MB ) {
140
152
}
141
153
uint32_t ar = ETH -> MACMDIOAR ;
@@ -161,7 +173,7 @@ STATIC void eth_phy_write(uint32_t reg, uint32_t val) {
161
173
}
162
174
163
175
STATIC uint32_t eth_phy_read (uint32_t reg ) {
164
- #if defined(STM32H7 )
176
+ #if defined(STM32H5 ) || defined( STM32H7 )
165
177
while (ETH -> MACMDIOAR & ETH_MACMDIOAR_MB ) {
166
178
}
167
179
uint32_t ar = ETH -> MACMDIOAR ;
@@ -202,7 +214,11 @@ void eth_init(eth_t *self, int mac_idx) {
202
214
mp_hal_pin_config_alt_static (MICROPY_HW_ETH_RMII_TXD1 , MP_HAL_PIN_MODE_ALT , MP_HAL_PIN_PULL_NONE , STATIC_AF_ETH_RMII_TXD1 );
203
215
204
216
// Enable peripheral clock
205
- #if defined(STM32H7 )
217
+ #if defined(STM32H5 )
218
+ __HAL_RCC_ETH_CLK_ENABLE ();
219
+ __HAL_RCC_ETHTX_CLK_ENABLE ();
220
+ __HAL_RCC_ETHRX_CLK_ENABLE ();
221
+ #elif defined(STM32H7 )
206
222
__HAL_RCC_ETH1MAC_CLK_ENABLE ();
207
223
__HAL_RCC_ETH1TX_CLK_ENABLE ();
208
224
__HAL_RCC_ETH1RX_CLK_ENABLE ();
@@ -218,11 +234,20 @@ void eth_set_trace(eth_t *self, uint32_t value) {
218
234
STATIC int eth_mac_init (eth_t * self ) {
219
235
// Configure MPU
220
236
uint32_t irq_state = mpu_config_start ();
237
+ #if defined(STM32H5 )
238
+ mpu_config_region (MPU_REGION_ETH , (uint32_t )& eth_dma , MPU_CONFIG_ETH (16 * 1024 ));
239
+ #else
221
240
mpu_config_region (MPU_REGION_ETH , (uint32_t )& eth_dma , MPU_CONFIG_ETH (MPU_REGION_SIZE_16KB ));
241
+ #endif
222
242
mpu_config_end (irq_state );
223
243
224
244
// Enable peripheral clock
225
- #if defined(STM32H7 )
245
+ #if defined(STM32H5 )
246
+ __HAL_RCC_ETH_CLK_ENABLE ();
247
+ __HAL_RCC_ETHTX_CLK_ENABLE ();
248
+ __HAL_RCC_ETHRX_CLK_ENABLE ();
249
+ __HAL_RCC_ETH_FORCE_RESET ();
250
+ #elif defined(STM32H7 )
226
251
__HAL_RCC_ETH1MAC_CLK_ENABLE ();
227
252
__HAL_RCC_ETH1TX_CLK_ENABLE ();
228
253
__HAL_RCC_ETH1RX_CLK_ENABLE ();
@@ -233,14 +258,23 @@ STATIC int eth_mac_init(eth_t *self) {
233
258
#endif
234
259
235
260
// Select RMII interface
236
- #if defined(STM32H7 )
261
+ #if defined(STM32H5 )
262
+ __HAL_RCC_SBS_CLK_ENABLE ();
263
+ SBS -> PMCR = (SBS -> PMCR & ~SBS_PMCR_ETH_SEL_PHY_Msk ) | SBS_PMCR_ETH_SEL_PHY_2 ;
264
+ #elif defined(STM32H7 )
237
265
SYSCFG -> PMCR = (SYSCFG -> PMCR & ~SYSCFG_PMCR_EPIS_SEL_Msk ) | SYSCFG_PMCR_EPIS_SEL_2 ;
238
266
#else
239
267
__HAL_RCC_SYSCFG_CLK_ENABLE ();
240
268
SYSCFG -> PMC |= SYSCFG_PMC_MII_RMII_SEL ;
241
269
#endif
242
270
243
- #if defined(STM32H7 )
271
+ #if defined(STM32H5 )
272
+ __HAL_RCC_ETH_RELEASE_RESET ();
273
+
274
+ __HAL_RCC_ETH_CLK_SLEEP_ENABLE ();
275
+ __HAL_RCC_ETHTX_CLK_SLEEP_ENABLE ();
276
+ __HAL_RCC_ETHRX_CLK_SLEEP_ENABLE ();
277
+ #elif defined(STM32H7 )
244
278
__HAL_RCC_ETH1MAC_RELEASE_RESET ();
245
279
246
280
__HAL_RCC_ETH1MAC_CLK_SLEEP_ENABLE ();
@@ -255,7 +289,7 @@ STATIC int eth_mac_init(eth_t *self) {
255
289
#endif
256
290
257
291
// Do a soft reset of the MAC core
258
- #if defined(STM32H7 )
292
+ #if defined(STM32H5 ) || defined( STM32H7 )
259
293
#define ETH_SOFT_RESET (eth ) do { eth->DMAMR = ETH_DMAMR_SWR; } while (0)
260
294
#define ETH_IS_RESET (eth ) (eth->DMAMR & ETH_DMAMR_SWR)
261
295
#else
@@ -277,7 +311,23 @@ STATIC int eth_mac_init(eth_t *self) {
277
311
// Set MII clock range
278
312
uint32_t hclk = HAL_RCC_GetHCLKFreq ();
279
313
uint32_t cr_div ;
280
- #if defined(STM32H7 )
314
+ #if defined(STM32H5 )
315
+ cr_div = ETH -> MACMDIOAR & ~ETH_MACMDIOAR_CR ;
316
+ if (hclk < 35000000 ) {
317
+ cr_div |= ETH_MACMDIOAR_CR_DIV16 ;
318
+ } else if (hclk < 60000000 ) {
319
+ cr_div |= ETH_MACMDIOAR_CR_DIV26 ;
320
+ } else if (hclk < 100000000 ) {
321
+ cr_div |= ETH_MACMDIOAR_CR_DIV42 ;
322
+ } else if (hclk < 150000000 ) {
323
+ cr_div |= ETH_MACMDIOAR_CR_DIV62 ;
324
+ } else if (hclk < 250000000 ) {
325
+ cr_div |= ETH_MACMDIOAR_CR_DIV102 ;
326
+ } else {
327
+ cr_div |= ETH_MACMDIOAR_CR_DIV124 ;
328
+ }
329
+ ETH -> MACMDIOAR = cr_div ;
330
+ #elif defined(STM32H7 )
281
331
cr_div = ETH -> MACMDIOAR & ~ETH_MACMDIOAR_CR ;
282
332
if (hclk < 35000000 ) {
283
333
cr_div |= ETH_MACMDIOAR_CR_DIV16 ;
@@ -306,7 +356,7 @@ STATIC int eth_mac_init(eth_t *self) {
306
356
ETH -> MACMIIAR = cr_div ;
307
357
#endif
308
358
309
- #if defined(STM32H7 )
359
+ #if defined(STM32H5 ) || defined( STM32H7 )
310
360
// don't skip 32bit words since our descriptors are continuous in memory
311
361
ETH -> DMACCR &= ~(ETH_DMACCR_DSL_Msk );
312
362
#endif
@@ -351,15 +401,15 @@ STATIC int eth_mac_init(eth_t *self) {
351
401
uint16_t phy_scsr = eth_phy_read (PHY_SCSR );
352
402
353
403
// Burst mode configuration
354
- #if defined(STM32H7 )
404
+ #if defined(STM32H5 ) || defined( STM32H7 )
355
405
ETH -> DMASBMR = ETH -> DMASBMR & ~ETH_DMASBMR_AAL & ~ETH_DMASBMR_FB ;
356
406
#else
357
407
ETH -> DMABMR = 0 ;
358
408
#endif
359
409
mp_hal_delay_ms (2 );
360
410
361
411
// Select DMA interrupts
362
- #if defined(STM32H7 )
412
+ #if defined(STM32H5 ) || defined( STM32H7 )
363
413
ETH -> DMACIER = ETH -> DMACIER
364
414
| ETH_DMACIER_NIE // enable normal interrupts
365
415
| ETH_DMACIER_RIE // enable RX interrupt
@@ -373,7 +423,7 @@ STATIC int eth_mac_init(eth_t *self) {
373
423
374
424
// Configure RX descriptor lists
375
425
for (size_t i = 0 ; i < RX_BUF_NUM ; ++ i ) {
376
- #if defined(STM32H7 )
426
+ #if defined(STM32H5 ) || defined( STM32H7 )
377
427
eth_dma .rx_descr [i ].rdes3 =
378
428
1 << RX_DESCR_3_OWN_Pos
379
429
| (1 << RX_DESCR_3_BUF1V_Pos ) // buf1 address valid
@@ -391,7 +441,7 @@ STATIC int eth_mac_init(eth_t *self) {
391
441
#endif
392
442
}
393
443
394
- #if defined(STM32H7 )
444
+ #if defined(STM32H5 ) || defined( STM32H7 )
395
445
ETH -> DMACRDLAR = (uint32_t )& eth_dma .rx_descr [0 ];
396
446
#else
397
447
ETH -> DMARDLAR = (uint32_t )& eth_dma .rx_descr [0 ];
@@ -400,7 +450,7 @@ STATIC int eth_mac_init(eth_t *self) {
400
450
401
451
// Configure TX descriptor lists
402
452
for (size_t i = 0 ; i < TX_BUF_NUM ; ++ i ) {
403
- #if defined(STM32H7 )
453
+ #if defined(STM32H5 ) || defined( STM32H7 )
404
454
eth_dma .tx_descr [i ].tdes0 = 0 ;
405
455
eth_dma .tx_descr [i ].tdes1 = 0 ;
406
456
eth_dma .tx_descr [i ].tdes2 = TX_BUF_SIZE & TX_DESCR_2_B1L_Msk ;
@@ -413,7 +463,7 @@ STATIC int eth_mac_init(eth_t *self) {
413
463
#endif
414
464
}
415
465
416
- #if defined(STM32H7 )
466
+ #if defined(STM32H5 ) || defined( STM32H7 )
417
467
// set number of descriptors and buffers
418
468
ETH -> DMACTDRLR = TX_BUF_NUM - 1 ;
419
469
ETH -> DMACRDRLR = RX_BUF_NUM - 1 ;
@@ -425,7 +475,7 @@ STATIC int eth_mac_init(eth_t *self) {
425
475
eth_dma .tx_descr_idx = 0 ;
426
476
427
477
// Configure DMA
428
- #if defined(STM32H7 )
478
+ #if defined(STM32H5 ) || defined( STM32H7 )
429
479
// read from RX FIFO only after a full frame is written
430
480
ETH -> MTLRQOMR = ETH_MTLRQOMR_RSF ;
431
481
// transmission starts when a full packet resides in the Tx queue
@@ -439,7 +489,7 @@ STATIC int eth_mac_init(eth_t *self) {
439
489
mp_hal_delay_ms (2 );
440
490
441
491
// Select MAC filtering options
442
- #if defined(STM32H7 )
492
+ #if defined(STM32H5 ) || defined( STM32H7 )
443
493
ETH -> MACPFR = ETH_MACPFR_RA ; // pass all frames up
444
494
#else
445
495
ETH -> MACFFR =
@@ -472,7 +522,7 @@ STATIC int eth_mac_init(eth_t *self) {
472
522
mp_hal_delay_ms (2 );
473
523
474
524
// Start DMA layer
475
- #if defined(STM32H7 )
525
+ #if defined(STM32H5 ) || defined( STM32H7 )
476
526
ETH -> DMACRCR |= ETH_DMACRCR_SR ; // start RX
477
527
ETH -> DMACTCR |= ETH_DMACTCR_ST ; // start TX
478
528
#else
@@ -493,7 +543,11 @@ STATIC int eth_mac_init(eth_t *self) {
493
543
STATIC void eth_mac_deinit (eth_t * self ) {
494
544
(void )self ;
495
545
HAL_NVIC_DisableIRQ (ETH_IRQn );
496
- #if defined(STM32H7 )
546
+ #if defined(STM32H5 )
547
+ __HAL_RCC_ETH_FORCE_RESET ();
548
+ __HAL_RCC_ETH_RELEASE_RESET ();
549
+ __HAL_RCC_ETH_CLK_DISABLE ();
550
+ #elif defined(STM32H7 )
497
551
__HAL_RCC_ETH1MAC_FORCE_RESET ();
498
552
__HAL_RCC_ETH1MAC_RELEASE_RESET ();
499
553
__HAL_RCC_ETH1MAC_CLK_DISABLE ();
@@ -513,7 +567,7 @@ STATIC int eth_tx_buf_get(size_t len, uint8_t **buf) {
513
567
eth_dma_tx_descr_t * tx_descr = & eth_dma .tx_descr [eth_dma .tx_descr_idx ];
514
568
uint32_t t0 = mp_hal_ticks_ms ();
515
569
for (;;) {
516
- #if defined(STM32H7 )
570
+ #if defined(STM32H5 ) || defined( STM32H7 )
517
571
if (!(tx_descr -> tdes3 & (1 << TX_DESCR_3_OWN_Pos ))) {
518
572
break ;
519
573
}
@@ -527,7 +581,7 @@ STATIC int eth_tx_buf_get(size_t len, uint8_t **buf) {
527
581
}
528
582
}
529
583
530
- #if defined(STM32H7 )
584
+ #if defined(STM32H5 ) || defined( STM32H7 )
531
585
// Update TX descriptor with length and buffer pointer
532
586
* buf = & eth_dma .tx_buf [eth_dma .tx_descr_idx * TX_BUF_SIZE ];
533
587
tx_descr -> tdes2 = len & TX_DESCR_2_B1L_Msk ;
@@ -549,7 +603,7 @@ STATIC int eth_tx_buf_send(void) {
549
603
eth_dma .tx_descr_idx = (eth_dma .tx_descr_idx + 1 ) % TX_BUF_NUM ;
550
604
551
605
// Schedule to send next outgoing frame
552
- #if defined(STM32H7 )
606
+ #if defined(STM32H5 ) || defined( STM32H7 )
553
607
tx_descr -> tdes3 =
554
608
1 << TX_DESCR_3_OWN_Pos // owned by DMA
555
609
| 1 << TX_DESCR_3_LD_Pos // last segment
@@ -568,7 +622,7 @@ STATIC int eth_tx_buf_send(void) {
568
622
569
623
// Notify ETH DMA that there is a new TX descriptor for sending
570
624
__DMB ();
571
- #if defined(STM32H7 )
625
+ #if defined(STM32H5 ) || defined( STM32H7 )
572
626
if (ETH -> DMACSR & ETH_DMACSR_TBU ) {
573
627
ETH -> DMACSR = ETH_DMACSR_TBU ;
574
628
}
@@ -590,7 +644,7 @@ STATIC void eth_dma_rx_free(void) {
590
644
eth_dma .rx_descr_idx = (eth_dma .rx_descr_idx + 1 ) % RX_BUF_NUM ;
591
645
592
646
// Schedule to get next incoming frame
593
- #if defined(STM32H7 )
647
+ #if defined(STM32H5 ) || defined( STM32H7 )
594
648
rx_descr -> rdes0 = (uint32_t )buf ;
595
649
rx_descr -> rdes3 = 1 << RX_DESCR_3_OWN_Pos ; // owned by DMA
596
650
rx_descr -> rdes3 |= 1 << RX_DESCR_3_BUF1V_Pos ; // buf 1 address valid
@@ -607,15 +661,15 @@ STATIC void eth_dma_rx_free(void) {
607
661
608
662
// Notify ETH DMA that there is a new RX descriptor available
609
663
__DMB ();
610
- #if defined(STM32H7 )
664
+ #if defined(STM32H5 ) || defined( STM32H7 )
611
665
ETH -> DMACRDTPR = (uint32_t )& rx_descr [eth_dma .rx_descr_idx ];
612
666
#else
613
667
ETH -> DMARPDR = 0 ;
614
668
#endif
615
669
}
616
670
617
671
void ETH_IRQHandler (void ) {
618
- #if defined(STM32H7 )
672
+ #if defined(STM32H5 ) || defined( STM32H7 )
619
673
uint32_t sr = ETH -> DMACSR ;
620
674
ETH -> DMACSR = ETH_DMACSR_NIS ;
621
675
uint32_t rx_interrupt = sr & ETH_DMACSR_RI ;
@@ -625,13 +679,13 @@ void ETH_IRQHandler(void) {
625
679
uint32_t rx_interrupt = sr & ETH_DMASR_RS ;
626
680
#endif
627
681
if (rx_interrupt ) {
628
- #if defined(STM32H7 )
682
+ #if defined(STM32H5 ) || defined( STM32H7 )
629
683
ETH -> DMACSR = ETH_DMACSR_RI ;
630
684
#else
631
685
ETH -> DMASR = ETH_DMASR_RS ;
632
686
#endif
633
687
for (;;) {
634
- #if defined(STM32H7 )
688
+ #if defined(STM32H5 ) || defined( STM32H7 )
635
689
eth_dma_rx_descr_t * rx_descr_l = & eth_dma .rx_descr [eth_dma .rx_descr_idx ];
636
690
if (rx_descr_l -> rdes3 & (1 << RX_DESCR_3_OWN_Pos )) {
637
691
// No more RX descriptors ready to read
@@ -646,13 +700,13 @@ void ETH_IRQHandler(void) {
646
700
#endif
647
701
648
702
// Get RX buffer containing new frame
649
- #if defined(STM32H7 )
703
+ #if defined(STM32H5 ) || defined( STM32H7 )
650
704
size_t len = (rx_descr_l -> rdes3 & RX_DESCR_3_PL_Msk );
651
705
#else
652
706
size_t len = (rx_descr -> rdes0 & RX_DESCR_0_FL_Msk ) >> RX_DESCR_0_FL_Pos ;
653
707
#endif
654
708
len -= 4 ; // discard CRC at end
655
- #if defined(STM32H7 )
709
+ #if defined(STM32H5 ) || defined( STM32H7 )
656
710
uint8_t * buf = & eth_dma .rx_buf [eth_dma .rx_descr_idx * RX_BUF_SIZE ];
657
711
#else
658
712
uint8_t * buf = (uint8_t * )rx_descr -> rdes2 ;
0 commit comments