32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "stm32n6xx.h"
36 #include "stm32n6xx_hal.h"
45 #if defined(__ICCARM__)
48 #pragma data_alignment = 4
49 #pragma location = STM32N6XX_ETH_RAM_SECTION
52 #pragma data_alignment = 4
53 #pragma location = STM32N6XX_ETH_RAM_SECTION
56 #pragma data_alignment = 8
57 #pragma location = STM32N6XX_ETH_RAM_SECTION
60 #pragma data_alignment = 8
61 #pragma location = STM32N6XX_ETH_RAM_SECTION
125 TRACE_INFO(
"Initializing STM32N6 Ethernet MAC...\r\n");
128 nicDriverInterface = interface;
134 __HAL_RCC_ETH1_CLK_ENABLE();
135 __HAL_RCC_ETH1MAC_CLK_ENABLE();
136 __HAL_RCC_ETH1TX_CLK_ENABLE();
137 __HAL_RCC_ETH1RX_CLK_ENABLE();
140 __HAL_RCC_ETH1_FORCE_RESET();
141 __HAL_RCC_ETH1_RELEASE_RESET();
144 ETH1->DMAMR |= ETH_DMAMR_SWR;
146 while((ETH1->DMAMR & ETH_DMAMR_SWR) != 0)
154 if(interface->phyDriver != NULL)
157 error = interface->phyDriver->init(interface);
159 else if(interface->switchDriver != NULL)
162 error = interface->switchDriver->init(interface);
177 ETH1->MACCR = ETH_MACCR_GPSLCE | ETH_MACCR_DO;
180 temp = ETH1->MACECR & ~ETH_MACECR_GPSL;
187 ETH1->MACQ0TXFCR = 0;
196 ETH1->DMASBMR |= ETH_DMASBMR_AAL;
219 ETH1->MMCTIMR = ETH_MMCTIMR_TXLPITRCIM | ETH_MMCTIMR_TXLPIUSCIM |
220 ETH_MMCTIMR_TXGPKTIM | ETH_MMCTIMR_TXMCOLGPIM | ETH_MMCTIMR_TXSCOLGPIM;
224 ETH1->MMCRIMR = ETH_MMCRIMR_RXLPITRCIM | ETH_MMCRIMR_RXLPIUSCIM |
225 ETH_MMCRIMR_RXUCGPIM | ETH_MMCRIMR_RXALGNERPIM | ETH_MMCRIMR_RXCRCERPIM;
230 ETH1->DMA_CH[0].DMACIER = ETH_DMACxIER_NIE | ETH_DMACxIER_RIE | ETH_DMACxIER_TIE;
240 ETH1->MACCR |= ETH_MACCR_TE | ETH_MACCR_RE;
243 ETH1->DMA_CH[0].DMACTXCR |= ETH_DMACxTXCR_ST;
244 ETH1->DMA_CH[0].DMACRXCR |= ETH_DMACxRXCR_SR;
262 #if defined(USE_STM32N6xx_NUCLEO)
263 GPIO_InitTypeDef GPIO_InitStructure;
266 __HAL_RCC_GPIOF_CLK_ENABLE();
267 __HAL_RCC_GPIOG_CLK_ENABLE();
270 SET_BIT(RCC->CCIPR2, RCC_ETH1PHYIF_RMII);
273 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
274 GPIO_InitStructure.Pull = GPIO_NOPULL;
275 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
276 GPIO_InitStructure.Alternate = GPIO_AF11_ETH1;
281 GPIO_InitStructure.Pin = GPIO_PIN_4 | GPIO_PIN_7 | GPIO_PIN_10 |
282 GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
283 HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
286 GPIO_InitStructure.Pin = GPIO_PIN_11;
287 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
290 #elif defined(USE_STM32N6570_DK)
291 GPIO_InitTypeDef GPIO_InitStructure;
292 GPIO_DelayTypeDef GPIO_DelayStructure;
295 __HAL_RCC_GPIOD_CLK_ENABLE();
296 __HAL_RCC_GPIOF_CLK_ENABLE();
297 __HAL_RCC_GPIOG_CLK_ENABLE();
300 SET_BIT(RCC->CCIPR2, RCC_ETH1PHYIF_RGMII);
303 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
304 GPIO_InitStructure.Pull = GPIO_NOPULL;
305 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
306 GPIO_InitStructure.Alternate = GPIO_AF11_ETH1;
309 GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_12;
310 HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
316 GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 |
317 GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |
319 HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
322 GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_4;
323 HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
326 GPIO_InitStructure.Pin = GPIO_PIN_0;
327 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM;
328 GPIO_InitStructure.Alternate = GPIO_AF12_ETH1;
329 HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);
332 GPIO_DelayStructure.Delay = GPIO_DELAY_PS_500;
333 GPIO_DelayStructure.Path = GPIO_PATH_IN;
334 HAL_GPIO_SetDelay(GPIOF, GPIO_PIN_7, &GPIO_DelayStructure);
375 ETH1->DMA_CH[0].DMACTXDLAR = (uint32_t) &
txDmaDesc[0];
380 ETH1->DMA_CH[0].DMACRXDLAR = (uint32_t) &
rxDmaDesc[0];
398 if(interface->phyDriver != NULL)
401 interface->phyDriver->tick(interface);
403 else if(interface->switchDriver != NULL)
406 interface->switchDriver->tick(interface);
423 NVIC_EnableIRQ(ETH1_IRQn);
426 if(interface->phyDriver != NULL)
429 interface->phyDriver->enableIrq(interface);
431 else if(interface->switchDriver != NULL)
434 interface->switchDriver->enableIrq(interface);
451 NVIC_DisableIRQ(ETH1_IRQn);
454 if(interface->phyDriver != NULL)
457 interface->phyDriver->disableIrq(interface);
459 else if(interface->switchDriver != NULL)
462 interface->switchDriver->disableIrq(interface);
487 status = ETH1->DMA_CH[0].DMACSR;
490 if((status & ETH_DMACxSR_TI) != 0)
493 ETH1->DMA_CH[0].DMACSR = ETH_DMACxSR_TI;
504 if((status & ETH_DMACxSR_RI) != 0)
507 ETH1->DMA_CH[0].DMACSR = ETH_DMACxSR_RI;
510 nicDriverInterface->nicEvent =
TRUE;
516 ETH1->DMA_CH[0].DMACSR = ETH_DMACxSR_NIS;
590 ETH1->DMA_CH[0].DMACSR = ETH_DMACxSR_TBU;
592 ETH1->DMA_CH[0].DMACTXDTPR = 0;
678 ETH1->DMA_CH[0].DMACSR = ETH_DMACxSR_RBU;
680 ETH1->DMA_CH[0].DMACRXDTPR = 0;
699 uint32_t hashTable[2];
707 if(interface->promiscuous)
710 ETH1->MACPFR = ETH_MACPFR_PR;
715 ETH1->MACA0LR = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
716 ETH1->MACA0HR = interface->macAddr.w[2];
732 entry = &interface->macAddrFilter[i];
745 k = (crc >> 26) & 0x3F;
748 hashTable[k / 32] |= (1 << (k % 32));
756 unicastMacAddr[j++] = entry->
addr;
766 ETH1->MACA1LR = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
767 ETH1->MACA1HR = unicastMacAddr[0].w[2] | ETH_MACAxHR_AE;
780 ETH1->MACA2LR = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
781 ETH1->MACA2HR = unicastMacAddr[1].w[2] | ETH_MACAxHR_AE;
794 ETH1->MACA3LR = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
795 ETH1->MACA3HR = unicastMacAddr[2].w[2] | ETH_MACAxHR_AE;
806 if(interface->acceptAllMulticast)
809 ETH1->MACPFR = ETH_MACPFR_HPF | ETH_MACPFR_PM;
814 ETH1->MACPFR = ETH_MACPFR_HPF | ETH_MACPFR_HMC;
817 ETH1->MACHT0R = hashTable[0];
818 ETH1->MACHT1R = hashTable[1];
821 TRACE_DEBUG(
" MACHT0R = %08" PRIX32
"\r\n", ETH1->MACHT0R);
822 TRACE_DEBUG(
" MACHT1R = %08" PRIX32
"\r\n", ETH1->MACHT1R);
842 config = ETH1->MACCR;
847 config &= ~ETH_MACCR_PS;
848 config &= ~ETH_MACCR_FES;
853 config |= ETH_MACCR_PS;
854 config |= ETH_MACCR_FES;
859 config |= ETH_MACCR_PS;
860 config &= ~ETH_MACCR_FES;
866 config |= ETH_MACCR_DM;
870 config &= ~ETH_MACCR_DM;
874 ETH1->MACCR = config;
898 temp = ETH1->MACMDIOAR & ETH_MACMDIOAR_CR;
902 temp |= (phyAddr << 21) & ETH_MACMDIOAR_PA;
904 temp |= (
regAddr << 16) & ETH_MACMDIOAR_RDA;
907 ETH1->MACMDIODR =
data & ETH_MACMDIODR_GD;
910 ETH1->MACMDIOAR = temp;
912 while((ETH1->MACMDIOAR & ETH_MACMDIOAR_GB) != 0)
941 temp = ETH1->MACMDIOAR & ETH_MACMDIOAR_CR;
945 temp |= (phyAddr << 21) & ETH_MACMDIOAR_PA;
947 temp |= (
regAddr << 16) & ETH_MACMDIOAR_RDA;
950 ETH1->MACMDIOAR = temp;
952 while((ETH1->MACMDIOAR & ETH_MACMDIOAR_GB) != 0)
957 data = ETH1->MACMDIODR & ETH_MACMDIODR_GD;
985 p = (uint8_t *)
data;
990 for(i = 0; i <
length; i++)
993 for(j = 0; j < 8; j++)
996 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
998 crc = (crc << 1) ^ 0x04C11DB7;