32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "stm32h5xx.h"
36 #include "stm32h5xx_hal.h"
45 #if defined(__ICCARM__)
48 #pragma data_alignment = 4
51 #pragma data_alignment = 4
54 #pragma data_alignment = 4
57 #pragma data_alignment = 4
121 TRACE_INFO(
"Initializing STM32H5 Ethernet MAC...\r\n");
124 nicDriverInterface = interface;
130 __HAL_RCC_ETH_CLK_ENABLE();
131 __HAL_RCC_ETHTX_CLK_ENABLE();
132 __HAL_RCC_ETHRX_CLK_ENABLE();
135 __HAL_RCC_ETH_FORCE_RESET();
136 __HAL_RCC_ETH_RELEASE_RESET();
139 ETH->DMAMR |= ETH_DMAMR_SWR;
141 while((ETH->DMAMR & ETH_DMAMR_SWR) != 0)
146 ETH->MACMDIOAR = ETH_MACMDIOAR_CR_DIV124;
149 if(interface->phyDriver != NULL)
152 error = interface->phyDriver->init(interface);
154 else if(interface->switchDriver != NULL)
157 error = interface->switchDriver->init(interface);
175 temp = ETH->MACECR & ~ETH_MACECR_GPSL;
186 ETH->DMAMR = ETH_DMAMR_INTM_0 | ETH_DMAMR_PR_1_1;
188 ETH->DMASBMR |= ETH_DMASBMR_AAL;
190 ETH->DMACCR = ETH_DMACCR_DSL_0BIT;
193 ETH->DMACTCR = ETH_DMACTCR_TPBL_32PBL;
196 ETH->DMACRCR = ETH_DMACRCR_RPBL_32PBL;
200 ETH->MTLTQOMR |= ETH_MTLTQOMR_TSF;
201 ETH->MTLRQOMR |= ETH_MTLRQOMR_RSF;
208 ETH->MMCTIMR = ETH_MMCTIMR_TXLPITRCIM | ETH_MMCTIMR_TXLPIUSCIM |
209 ETH_MMCTIMR_TXGPKTIM | ETH_MMCTIMR_TXMCOLGPIM | ETH_MMCTIMR_TXSCOLGPIM;
213 ETH->MMCRIMR = ETH_MMCRIMR_RXLPITRCIM | ETH_MMCRIMR_RXLPIUSCIM |
214 ETH_MMCRIMR_RXUCGPIM | ETH_MMCRIMR_RXALGNERPIM | ETH_MMCRIMR_RXCRCERPIM;
219 ETH->DMACIER = ETH_DMACIER_NIE | ETH_DMACIER_RIE | ETH_DMACIER_TIE;
229 ETH->MACCR |= ETH_MACCR_TE | ETH_MACCR_RE;
232 ETH->DMACTCR |= ETH_DMACTCR_ST;
233 ETH->DMACRCR |= ETH_DMACRCR_SR;
251 #if defined(USE_NUCLEO_H563ZI)
252 GPIO_InitTypeDef GPIO_InitStructure;
255 __HAL_RCC_SBS_CLK_ENABLE();
258 __HAL_RCC_GPIOA_CLK_ENABLE();
259 __HAL_RCC_GPIOB_CLK_ENABLE();
260 __HAL_RCC_GPIOC_CLK_ENABLE();
261 __HAL_RCC_GPIOG_CLK_ENABLE();
264 HAL_SBS_ETHInterfaceSelect(SBS_ETH_RMII);
267 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
268 GPIO_InitStructure.Pull = GPIO_NOPULL;
269 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
270 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
273 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
274 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
277 GPIO_InitStructure.Pin = GPIO_PIN_15;
278 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
281 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
282 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
285 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13;
286 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
289 #elif defined(USE_NUCLEO_H5E5ZJ)
290 GPIO_InitTypeDef GPIO_InitStructure;
293 __HAL_RCC_SBS_CLK_ENABLE();
296 __HAL_RCC_GPIOA_CLK_ENABLE();
297 __HAL_RCC_GPIOB_CLK_ENABLE();
298 __HAL_RCC_GPIOC_CLK_ENABLE();
299 __HAL_RCC_GPIOD_CLK_ENABLE();
300 __HAL_RCC_GPIOG_CLK_ENABLE();
303 HAL_SBS_ETHInterfaceSelect(SBS_ETH_RMII);
306 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
307 GPIO_InitStructure.Pull = GPIO_NOPULL;
308 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
309 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
312 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_5;
313 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
316 GPIO_InitStructure.Pin = GPIO_PIN_12;
317 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
320 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
321 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
324 GPIO_InitStructure.Pin = GPIO_PIN_1;
325 HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
328 GPIO_InitStructure.Pin = GPIO_PIN_12;
329 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
332 #elif defined(USE_STM32H573I_DK)
333 GPIO_InitTypeDef GPIO_InitStructure;
336 __HAL_RCC_SBS_CLK_ENABLE();
339 __HAL_RCC_GPIOA_CLK_ENABLE();
340 __HAL_RCC_GPIOC_CLK_ENABLE();
341 __HAL_RCC_GPIOG_CLK_ENABLE();
344 HAL_SBS_ETHInterfaceSelect(SBS_ETH_RMII);
347 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
348 GPIO_InitStructure.Pull = GPIO_NOPULL;
349 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
350 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
353 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
354 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
357 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
358 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
361 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
362 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
365 #elif defined(USE_STM32H5F5J_DK)
366 GPIO_InitTypeDef GPIO_InitStructure;
369 __HAL_RCC_SBS_CLK_ENABLE();
372 __HAL_RCC_GPIOA_CLK_ENABLE();
373 __HAL_RCC_GPIOB_CLK_ENABLE();
374 __HAL_RCC_GPIOC_CLK_ENABLE();
375 __HAL_RCC_GPIOD_CLK_ENABLE();
376 __HAL_RCC_GPIOE_CLK_ENABLE();
377 __HAL_RCC_GPIOG_CLK_ENABLE();
378 __HAL_RCC_GPIOJ_CLK_ENABLE();
381 HAL_SBS_ETHInterfaceSelect(SBS_ETH_RMII);
384 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
385 GPIO_InitStructure.Pull = GPIO_NOPULL;
386 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
387 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
390 GPIO_InitStructure.Pin = GPIO_PIN_1;
391 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
394 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_12;
395 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
398 GPIO_InitStructure.Pin = GPIO_PIN_4;
399 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
402 GPIO_InitStructure.Pin = GPIO_PIN_1;
403 HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
406 GPIO_InitStructure.Pin = GPIO_PIN_5;
407 HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
410 GPIO_InitStructure.Pin = GPIO_PIN_12;
411 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
414 GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
415 HAL_GPIO_Init(GPIOJ, &GPIO_InitStructure);
456 ETH->DMACTDLAR = (uint32_t) &
txDmaDesc[0];
461 ETH->DMACRDLAR = (uint32_t) &
rxDmaDesc[0];
479 if(interface->phyDriver != NULL)
482 interface->phyDriver->tick(interface);
484 else if(interface->switchDriver != NULL)
487 interface->switchDriver->tick(interface);
504 NVIC_EnableIRQ(ETH_IRQn);
507 if(interface->phyDriver != NULL)
510 interface->phyDriver->enableIrq(interface);
512 else if(interface->switchDriver != NULL)
515 interface->switchDriver->enableIrq(interface);
532 NVIC_DisableIRQ(ETH_IRQn);
535 if(interface->phyDriver != NULL)
538 interface->phyDriver->disableIrq(interface);
540 else if(interface->switchDriver != NULL)
543 interface->switchDriver->disableIrq(interface);
568 status = ETH->DMACSR;
571 if((status & ETH_DMACSR_TI) != 0)
574 ETH->DMACSR = ETH_DMACSR_TI;
585 if((status & ETH_DMACSR_RI) != 0)
588 ETH->DMACSR = ETH_DMACSR_RI;
591 nicDriverInterface->nicEvent =
TRUE;
597 ETH->DMACSR = ETH_DMACSR_NIS;
671 ETH->DMACSR = ETH_DMACSR_TBU;
718 if((SBS->PMCR & SBS_PMCR_ETH_SEL_PHY) != SBS_ETH_MII)
770 ETH->DMACSR = ETH_DMACSR_RBU;
791 uint32_t hashTable[2];
799 if(interface->promiscuous)
802 ETH->MACPFR = ETH_MACPFR_PR;
807 ETH->MACA0LR = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
808 ETH->MACA0HR = interface->macAddr.w[2];
824 entry = &interface->macAddrFilter[i];
837 k = (crc >> 26) & 0x3F;
840 hashTable[k / 32] |= (1 << (k % 32));
848 unicastMacAddr[j++] = entry->
addr;
858 ETH->MACA1LR = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
859 ETH->MACA1HR = unicastMacAddr[0].w[2] | ETH_MACAHR_AE;
872 ETH->MACA2LR = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
873 ETH->MACA2HR = unicastMacAddr[1].w[2] | ETH_MACAHR_AE;
886 ETH->MACA3LR = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
887 ETH->MACA3HR = unicastMacAddr[2].w[2] | ETH_MACAHR_AE;
898 if(interface->acceptAllMulticast)
901 ETH->MACPFR = ETH_MACPFR_HPF | ETH_MACPFR_PM;
906 ETH->MACPFR = ETH_MACPFR_HPF | ETH_MACPFR_HMC;
909 ETH->MACHT0R = hashTable[0];
910 ETH->MACHT1R = hashTable[1];
913 TRACE_DEBUG(
" MACHT0R = 0x%08" PRIX32
"\r\n", ETH->MACHT0R);
914 TRACE_DEBUG(
" MACHT1R = 0x%08" PRIX32
"\r\n", ETH->MACHT1R);
939 config |= ETH_MACCR_FES;
943 config &= ~ETH_MACCR_FES;
949 config |= ETH_MACCR_DM;
953 config &= ~ETH_MACCR_DM;
981 temp = ETH->MACMDIOAR & ETH_MACMDIOAR_CR;
983 temp |= ETH_MACMDIOAR_MOC_WR | ETH_MACMDIOAR_MB;
985 temp |= (phyAddr << 21) & ETH_MACMDIOAR_PA;
987 temp |= (
regAddr << 16) & ETH_MACMDIOAR_RDA;
990 ETH->MACMDIODR =
data & ETH_MACMDIODR_MD;
993 ETH->MACMDIOAR = temp;
995 while((ETH->MACMDIOAR & ETH_MACMDIOAR_MB) != 0)
1024 temp = ETH->MACMDIOAR & ETH_MACMDIOAR_CR;
1026 temp |= ETH_MACMDIOAR_MOC_RD | ETH_MACMDIOAR_MB;
1028 temp |= (phyAddr << 21) & ETH_MACMDIOAR_PA;
1030 temp |= (
regAddr << 16) & ETH_MACMDIOAR_RDA;
1033 ETH->MACMDIOAR = temp;
1035 while((ETH->MACMDIOAR & ETH_MACMDIOAR_MB) != 0)
1040 data = ETH->MACMDIODR & ETH_MACMDIODR_MD;
1068 p = (uint8_t *)
data;
1073 for(i = 0; i <
length; i++)
1076 for(j = 0; j < 8; j++)
1079 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
1081 crc = (crc << 1) ^ 0x04C11DB7;