32 #define TRACE_LEVEL NIC_TRACE_LEVEL
45 #if defined(__ICCARM__)
48 #pragma data_alignment = 8
51 #pragma data_alignment = 8
54 #pragma data_alignment = 4
57 #pragma data_alignment = 4
79 static uint_t txBufferIndex;
81 static uint_t rxBufferIndex;
118 volatile uint32_t status;
121 TRACE_INFO(
"Initializing SAM4E Ethernet MAC...\r\n");
124 nicDriverInterface = interface;
127 PMC->PMC_PCER1 = (1 << (ID_GMAC - 32));
136 GMAC->GMAC_NCFGR = GMAC_NCFGR_CLK_MCK_96;
138 GMAC->GMAC_NCR |= GMAC_NCR_MPE;
141 if(interface->phyDriver != NULL)
144 error = interface->phyDriver->init(interface);
146 else if(interface->switchDriver != NULL)
149 error = interface->switchDriver->init(interface);
164 GMAC->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
165 GMAC->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
168 GMAC->GMAC_SA[1].GMAC_SAB = 0;
169 GMAC->GMAC_SA[2].GMAC_SAB = 0;
170 GMAC->GMAC_SA[3].GMAC_SAB = 0;
177 GMAC->GMAC_NCFGR |= GMAC_NCFGR_MAXFS | GMAC_NCFGR_MTIHEN;
183 GMAC->GMAC_TSR = GMAC_TSR_HRESP | GMAC_TSR_UND | GMAC_TSR_TXCOMP |
184 GMAC_TSR_TFC | GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL |
188 GMAC->GMAC_RSR = GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC |
192 GMAC->GMAC_IDR = 0xFFFFFFFF;
195 GMAC->GMAC_IER = GMAC_IER_HRESP | GMAC_IER_ROVR | GMAC_IER_TCOMP |
196 GMAC_IER_TFC | GMAC_IER_RLEX | GMAC_IER_TUR | GMAC_IER_RXUBR |
200 status = GMAC->GMAC_ISR;
211 GMAC->GMAC_NCR |= GMAC_NCR_TXEN | GMAC_NCR_RXEN;
229 #if defined(USE_SAM4E_EK) || defined(USE_SAM4E_XPLAINED_PRO)
233 PMC->PMC_PCER0 = (1 << ID_PIOD);
236 mask = PIO_PD16A_GTX3 | PIO_PD15A_GTX2 | PIO_PD14A_GRXCK | PIO_PD13A_GCOL |
237 PIO_PD12A_GRX3 | PIO_PD11A_GRX2 | PIO_PD10A_GCRS | PIO_PD9A_GMDIO |
238 PIO_PD8A_GMDC | PIO_PD7A_GRXER |
PIO_PD6A_GRX1 | PIO_PD5A_GRX0 |
239 PIO_PD4A_GRXDV | PIO_PD3A_GTX1 | PIO_PD2A_GTX0 | PIO_PD1A_GTXEN |
243 PIOD->PIO_PUDR =
mask;
245 PIOD->PIO_IDR =
mask;
247 PIOD->PIO_ABCDSR[0] &= ~
mask;
248 PIOD->PIO_ABCDSR[1] &= ~
mask;
250 PIOD->PIO_PDR =
mask;
253 GMAC->GMAC_UR = GMAC_UR_RMIIMII;
292 rxBufferDesc[i].
status = 0;
301 GMAC->GMAC_TBQB = (uint32_t) txBufferDesc;
303 GMAC->GMAC_RBQB = (uint32_t) rxBufferDesc;
319 if(interface->phyDriver != NULL)
322 interface->phyDriver->tick(interface);
324 else if(interface->switchDriver != NULL)
327 interface->switchDriver->tick(interface);
347 if(interface->phyDriver != NULL)
350 interface->phyDriver->enableIrq(interface);
352 else if(interface->switchDriver != NULL)
355 interface->switchDriver->enableIrq(interface);
375 if(interface->phyDriver != NULL)
378 interface->phyDriver->disableIrq(interface);
380 else if(interface->switchDriver != NULL)
383 interface->switchDriver->disableIrq(interface);
399 volatile uint32_t isr;
400 volatile uint32_t tsr;
401 volatile uint32_t rsr;
411 isr = GMAC->GMAC_ISR;
412 tsr = GMAC->GMAC_TSR;
413 rsr = GMAC->GMAC_RSR;
417 if((tsr & (GMAC_TSR_HRESP | GMAC_TSR_UND | GMAC_TSR_TXCOMP | GMAC_TSR_TFC |
418 GMAC_TSR_TXGO | GMAC_TSR_RLE | GMAC_TSR_COL | GMAC_TSR_UBR)) != 0)
421 GMAC->GMAC_TSR = tsr;
424 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
432 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
435 nicDriverInterface->nicEvent =
TRUE;
456 rsr = GMAC->GMAC_RSR;
459 if((rsr & (GMAC_RSR_HNO | GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA)) != 0)
462 GMAC->GMAC_RSR = rsr;
504 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) == 0)
533 GMAC->GMAC_NCR |= GMAC_NCR_TSTART;
536 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
574 j = rxBufferIndex + i;
597 if((rxBufferDesc[j].status &
GMAC_RX_EOF) != 0 && sofIndex != UINT_MAX)
611 if(eofIndex != UINT_MAX)
615 else if(sofIndex != UINT_MAX)
628 for(i = 0; i < j; i++)
631 if(eofIndex != UINT_MAX && i >= sofIndex && i <= eofIndex)
691 uint32_t hashTable[2];
699 GMAC->GMAC_SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
700 GMAC->GMAC_SA[0].GMAC_SAT = interface->macAddr.w[2];
716 entry = &interface->macAddrFilter[i];
728 k = (
p[0] >> 6) ^
p[0];
729 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
730 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
731 k ^= (
p[3] >> 6) ^
p[3];
732 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
733 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
739 hashTable[k / 32] |= (1 << (k % 32));
747 unicastMacAddr[j++] = entry->
addr;
757 GMAC->GMAC_SA[1].GMAC_SAB = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
758 GMAC->GMAC_SA[1].GMAC_SAT = unicastMacAddr[0].w[2];
763 GMAC->GMAC_SA[1].GMAC_SAB = 0;
770 GMAC->GMAC_SA[2].GMAC_SAB = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
771 GMAC->GMAC_SA[2].GMAC_SAT = unicastMacAddr[1].w[2];
776 GMAC->GMAC_SA[2].GMAC_SAB = 0;
783 GMAC->GMAC_SA[3].GMAC_SAB = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
784 GMAC->GMAC_SA[3].GMAC_SAT = unicastMacAddr[2].w[2];
789 GMAC->GMAC_SA[3].GMAC_SAB = 0;
793 GMAC->GMAC_HRB = hashTable[0];
794 GMAC->GMAC_HRT = hashTable[1];
797 TRACE_DEBUG(
" HRB = %08" PRIX32
"\r\n", GMAC->GMAC_HRB);
798 TRACE_DEBUG(
" HRT = %08" PRIX32
"\r\n", GMAC->GMAC_HRT);
816 config = GMAC->GMAC_NCFGR;
821 config |= GMAC_NCFGR_SPD;
825 config &= ~GMAC_NCFGR_SPD;
831 config |= GMAC_NCFGR_FD;
835 config &= ~GMAC_NCFGR_FD;
839 GMAC->GMAC_NCFGR = config;
872 GMAC->GMAC_MAN = temp;
874 while((GMAC->GMAC_NSR & GMAC_NSR_IDLE) == 0)
910 GMAC->GMAC_MAN = temp;
912 while((GMAC->GMAC_NSR & GMAC_NSR_IDLE) == 0)