32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "stm32f4xx.h"
37 #ifndef USE_STDPERIPH_DRIVER
38 #include "stm32f4xx_hal.h"
49 #if defined(__ICCARM__)
52 #pragma data_alignment = 4
55 #pragma data_alignment = 4
58 #pragma data_alignment = 4
61 #pragma data_alignment = 4
124 TRACE_INFO(
"Initializing STM32F4 Ethernet MAC...\r\n");
127 nicDriverInterface = interface;
132 #ifdef USE_STDPERIPH_DRIVER
134 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |
135 RCC_AHB1Periph_ETH_MAC_Tx | RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
138 RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE);
139 RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE);
142 __HAL_RCC_ETHMAC_CLK_ENABLE();
143 __HAL_RCC_ETHMACTX_CLK_ENABLE();
144 __HAL_RCC_ETHMACRX_CLK_ENABLE();
147 __HAL_RCC_ETHMAC_FORCE_RESET();
148 __HAL_RCC_ETHMAC_RELEASE_RESET();
152 ETH->DMABMR |= ETH_DMABMR_SR;
154 while((ETH->DMABMR & ETH_DMABMR_SR) != 0)
159 ETH->MACMIIAR = ETH_MACMIIAR_CR_Div102;
162 if(interface->phyDriver != NULL)
165 error = interface->phyDriver->init(interface);
167 else if(interface->switchDriver != NULL)
170 error = interface->switchDriver->init(interface);
193 ETH->DMAOMR = ETH_DMAOMR_RSF | ETH_DMAOMR_TSF;
196 ETH->DMABMR = ETH_DMABMR_AAB | ETH_DMABMR_USP | ETH_DMABMR_RDP_32Beat |
197 ETH_DMABMR_RTPR_1_1 | ETH_DMABMR_PBL_32Beat | ETH_DMABMR_EDE;
204 ETH->MMCTIMR = ETH_MMCTIMR_TGFM | ETH_MMCTIMR_TGFMSCM | ETH_MMCTIMR_TGFSCM;
208 ETH->MMCRIMR = ETH_MMCRIMR_RGUFM | ETH_MMCRIMR_RFAEM | ETH_MMCRIMR_RFCEM;
211 ETH->MACIMR = ETH_MACIMR_TSTIM | ETH_MACIMR_PMTIM;
213 ETH->DMAIER = ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE;
223 ETH->MACCR |= ETH_MACCR_TE | ETH_MACCR_RE;
225 ETH->DMAOMR |= ETH_DMAOMR_ST | ETH_DMAOMR_SR;
243 #if defined(USE_STM32F4XX_NUCLEO_144)
244 GPIO_InitTypeDef GPIO_InitStructure;
247 __HAL_RCC_SYSCFG_CLK_ENABLE();
250 __HAL_RCC_GPIOA_CLK_ENABLE();
251 __HAL_RCC_GPIOB_CLK_ENABLE();
252 __HAL_RCC_GPIOC_CLK_ENABLE();
253 __HAL_RCC_GPIOG_CLK_ENABLE();
256 SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;
259 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
260 GPIO_InitStructure.Pull = GPIO_NOPULL;
261 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
262 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
265 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
266 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
269 GPIO_InitStructure.Pin = GPIO_PIN_13;
270 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
273 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
274 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
277 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13;
278 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
281 #elif defined(USE_STM32F4_DISCO)
282 GPIO_InitTypeDef GPIO_InitStructure;
285 __HAL_RCC_SYSCFG_CLK_ENABLE();
288 __HAL_RCC_GPIOA_CLK_ENABLE();
289 __HAL_RCC_GPIOB_CLK_ENABLE();
290 __HAL_RCC_GPIOC_CLK_ENABLE();
291 __HAL_RCC_GPIOE_CLK_ENABLE();
294 SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;
297 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
298 GPIO_InitStructure.Pull = GPIO_NOPULL;
299 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
300 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
303 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
304 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
307 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
308 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
311 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
312 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
315 GPIO_InitStructure.Pin = GPIO_PIN_2;
316 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
317 GPIO_InitStructure.Pull = GPIO_NOPULL;
318 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
319 HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
322 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_RESET);
324 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET);
328 #elif defined(USE_STM324xG_EVAL)
329 GPIO_InitTypeDef GPIO_InitStructure;
332 __HAL_RCC_SYSCFG_CLK_ENABLE();
335 __HAL_RCC_GPIOA_CLK_ENABLE();
336 __HAL_RCC_GPIOB_CLK_ENABLE();
337 __HAL_RCC_GPIOC_CLK_ENABLE();
338 __HAL_RCC_GPIOG_CLK_ENABLE();
339 __HAL_RCC_GPIOH_CLK_ENABLE();
340 __HAL_RCC_GPIOI_CLK_ENABLE();
343 GPIO_InitStructure.Pin = GPIO_PIN_8;
344 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
345 GPIO_InitStructure.Pull = GPIO_NOPULL;
346 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
347 GPIO_InitStructure.Alternate = GPIO_AF0_MCO;
348 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
351 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
354 SYSCFG->PMC &= ~SYSCFG_PMC_MII_RMII_SEL;
357 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
358 GPIO_InitStructure.Pull = GPIO_NOPULL;
359 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
360 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
363 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
364 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
367 GPIO_InitStructure.Pin = GPIO_PIN_8;
368 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
372 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
373 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
376 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
377 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
381 GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_7;
382 HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
385 GPIO_InitStructure.Pin = GPIO_PIN_10;
386 HAL_GPIO_Init(GPIOI, &GPIO_InitStructure);
389 #elif defined(USE_STM324x9I_EVAL)
390 GPIO_InitTypeDef GPIO_InitStructure;
393 __HAL_RCC_SYSCFG_CLK_ENABLE();
396 __HAL_RCC_GPIOA_CLK_ENABLE();
397 __HAL_RCC_GPIOB_CLK_ENABLE();
398 __HAL_RCC_GPIOC_CLK_ENABLE();
399 __HAL_RCC_GPIOG_CLK_ENABLE();
400 __HAL_RCC_GPIOH_CLK_ENABLE();
401 __HAL_RCC_GPIOI_CLK_ENABLE();
404 GPIO_InitStructure.Pin = GPIO_PIN_8;
405 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
406 GPIO_InitStructure.Pull = GPIO_NOPULL;
407 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
408 GPIO_InitStructure.Alternate = GPIO_AF0_MCO;
409 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
412 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
415 SYSCFG->PMC &= ~SYSCFG_PMC_MII_RMII_SEL;
418 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
419 GPIO_InitStructure.Pull = GPIO_NOPULL;
420 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
421 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
428 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
429 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
432 GPIO_InitStructure.Pin = GPIO_PIN_8;
433 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
437 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
438 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
441 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
442 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
449 GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
450 HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
457 #elif defined(USE_STM32F469I_EVAL)
458 GPIO_InitTypeDef GPIO_InitStructure;
461 __HAL_RCC_SYSCFG_CLK_ENABLE();
464 __HAL_RCC_GPIOA_CLK_ENABLE();
465 __HAL_RCC_GPIOC_CLK_ENABLE();
466 __HAL_RCC_GPIOE_CLK_ENABLE();
467 __HAL_RCC_GPIOG_CLK_ENABLE();
468 __HAL_RCC_GPIOH_CLK_ENABLE();
469 __HAL_RCC_GPIOI_CLK_ENABLE();
472 GPIO_InitStructure.Pin = GPIO_PIN_8;
473 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
474 GPIO_InitStructure.Pull = GPIO_NOPULL;
475 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
476 GPIO_InitStructure.Alternate = GPIO_AF0_MCO;
477 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
480 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
483 SYSCFG->PMC &= ~SYSCFG_PMC_MII_RMII_SEL;
486 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
487 GPIO_InitStructure.Pull = GPIO_NOPULL;
488 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
489 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
496 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
497 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
501 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5;
502 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
505 GPIO_InitStructure.Pin = GPIO_PIN_2;
506 HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
509 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
510 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
517 GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
518 HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
525 #elif defined(USE_MCBSTM32F400)
526 GPIO_InitTypeDef GPIO_InitStructure;
529 __HAL_RCC_SYSCFG_CLK_ENABLE();
532 __HAL_RCC_GPIOA_CLK_ENABLE();
533 __HAL_RCC_GPIOC_CLK_ENABLE();
534 __HAL_RCC_GPIOG_CLK_ENABLE();
537 SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;
540 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
541 GPIO_InitStructure.Pull = GPIO_NOPULL;
542 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
543 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
546 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
547 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
550 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
551 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
554 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
555 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
558 #elif defined(USE_STM32_E407)
559 GPIO_InitTypeDef GPIO_InitStructure;
562 __HAL_RCC_SYSCFG_CLK_ENABLE();
565 __HAL_RCC_GPIOA_CLK_ENABLE();
566 __HAL_RCC_GPIOC_CLK_ENABLE();
567 __HAL_RCC_GPIOG_CLK_ENABLE();
570 SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;
573 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
574 GPIO_InitStructure.Pull = GPIO_NOPULL;
575 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
576 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
579 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
580 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
583 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
584 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
587 GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_14;
588 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
591 GPIO_InitStructure.Pin = GPIO_PIN_6;
592 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
593 GPIO_InitStructure.Pull = GPIO_NOPULL;
594 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
595 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
598 HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET);
600 HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_SET);
604 #elif defined(USE_STM32_P407)
605 GPIO_InitTypeDef GPIO_InitStructure;
608 __HAL_RCC_SYSCFG_CLK_ENABLE();
611 __HAL_RCC_GPIOA_CLK_ENABLE();
612 __HAL_RCC_GPIOB_CLK_ENABLE();
613 __HAL_RCC_GPIOC_CLK_ENABLE();
614 __HAL_RCC_GPIOG_CLK_ENABLE();
617 SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;
620 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
621 GPIO_InitStructure.Pull = GPIO_NOPULL;
622 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
623 GPIO_InitStructure.Alternate = GPIO_AF11_ETH;
626 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;
627 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
630 GPIO_InitStructure.Pin = GPIO_PIN_11;
631 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
634 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;
635 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
638 GPIO_InitStructure.Pin = GPIO_PIN_13 | GPIO_PIN_14;
639 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
721 if(interface->phyDriver != NULL)
724 interface->phyDriver->tick(interface);
726 else if(interface->switchDriver != NULL)
729 interface->switchDriver->tick(interface);
746 NVIC_EnableIRQ(ETH_IRQn);
749 if(interface->phyDriver != NULL)
752 interface->phyDriver->enableIrq(interface);
754 else if(interface->switchDriver != NULL)
757 interface->switchDriver->enableIrq(interface);
774 NVIC_DisableIRQ(ETH_IRQn);
777 if(interface->phyDriver != NULL)
780 interface->phyDriver->disableIrq(interface);
782 else if(interface->switchDriver != NULL)
785 interface->switchDriver->disableIrq(interface);
813 if((status & ETH_DMASR_TS) != 0)
816 ETH->DMASR = ETH_DMASR_TS;
827 if((status & ETH_DMASR_RS) != 0)
830 ETH->DMASR = ETH_DMASR_RS;
833 nicDriverInterface->nicEvent =
TRUE;
839 ETH->DMASR = ETH_DMASR_NIS;
910 ETH->DMASR = ETH_DMASR_TBUS;
990 ETH->DMASR = ETH_DMASR_RBUS;
1011 uint32_t hashTable[2];
1019 if(interface->promiscuous)
1022 ETH->MACFFR = ETH_MACFFR_PM;
1027 ETH->MACA0LR = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
1028 ETH->MACA0HR = interface->macAddr.w[2];
1044 entry = &interface->macAddrFilter[i];
1057 k = (crc >> 26) & 0x3F;
1060 hashTable[k / 32] |= (1 << (k % 32));
1068 unicastMacAddr[j++] = entry->
addr;
1078 ETH->MACA1LR = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
1079 ETH->MACA1HR = unicastMacAddr[0].w[2] | ETH_MACA1HR_AE;
1092 ETH->MACA2LR = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
1093 ETH->MACA2HR = unicastMacAddr[1].w[2] | ETH_MACA2HR_AE;
1106 ETH->MACA3LR = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
1107 ETH->MACA3HR = unicastMacAddr[2].w[2] | ETH_MACA3HR_AE;
1118 if(interface->acceptAllMulticast)
1121 ETH->MACFFR = ETH_MACFFR_HPF | ETH_MACFFR_PAM;
1126 ETH->MACFFR = ETH_MACFFR_HPF | ETH_MACFFR_HM;
1129 ETH->MACHTLR = hashTable[0];
1130 ETH->MACHTHR = hashTable[1];
1133 TRACE_DEBUG(
" MACHTLR = %08" PRIX32
"\r\n", ETH->MACHTLR);
1134 TRACE_DEBUG(
" MACHTHR = %08" PRIX32
"\r\n", ETH->MACHTHR);
1154 config = ETH->MACCR;
1159 config |= ETH_MACCR_FES;
1163 config &= ~ETH_MACCR_FES;
1169 config |= ETH_MACCR_DM;
1173 config &= ~ETH_MACCR_DM;
1177 ETH->MACCR = config;
1201 temp = ETH->MACMIIAR & ETH_MACMIIAR_CR;
1203 temp |= ETH_MACMIIAR_MW | ETH_MACMIIAR_MB;
1205 temp |= (phyAddr << 11) & ETH_MACMIIAR_PA;
1207 temp |= (
regAddr << 6) & ETH_MACMIIAR_MR;
1210 ETH->MACMIIDR =
data & ETH_MACMIIDR_MD;
1213 ETH->MACMIIAR = temp;
1215 while((ETH->MACMIIAR & ETH_MACMIIAR_MB) != 0)
1244 temp = ETH->MACMIIAR & ETH_MACMIIAR_CR;
1246 temp |= ETH_MACMIIAR_MB;
1248 temp |= (phyAddr << 11) & ETH_MACMIIAR_PA;
1250 temp |= (
regAddr << 6) & ETH_MACMIIAR_MR;
1253 ETH->MACMIIAR = temp;
1255 while((ETH->MACMIIAR & ETH_MACMIIAR_MB) != 0)
1260 data = ETH->MACMIIDR & ETH_MACMIIDR_MD;
1288 p = (uint8_t *)
data;
1293 for(i = 0; i <
length; i++)
1296 for(j = 0; j < 8; j++)
1299 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
1301 crc = (crc << 1) ^ 0x04C11DB7;