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 SAM3X Ethernet MAC...\r\n");
124 nicDriverInterface = interface;
127 PMC->PMC_PCER1 = (1 << (ID_EMAC - 32));
136 EMAC->EMAC_NCFGR = EMAC_NCFGR_CLK_MCK_64;
138 EMAC->EMAC_NCR |= EMAC_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 EMAC->EMAC_SA[0].EMAC_SAxB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
165 EMAC->EMAC_SA[0].EMAC_SAxT = interface->macAddr.w[2];
168 EMAC->EMAC_SA[1].EMAC_SAxB = 0;
169 EMAC->EMAC_SA[2].EMAC_SAxB = 0;
170 EMAC->EMAC_SA[3].EMAC_SAxB = 0;
177 EMAC->EMAC_NCFGR |= EMAC_NCFGR_BIG | EMAC_NCFGR_MTI;
183 EMAC->EMAC_TSR = EMAC_TSR_UND | EMAC_TSR_COMP | EMAC_TSR_BEX |
184 EMAC_TSR_TGO | EMAC_TSR_RLES | EMAC_TSR_COL | EMAC_TSR_UBR;
186 EMAC->EMAC_RSR = EMAC_RSR_OVR | EMAC_RSR_REC | EMAC_RSR_BNA;
189 EMAC->EMAC_IDR = 0xFFFFFFFF;
191 EMAC->EMAC_IER = EMAC_IER_ROVR | EMAC_IER_TCOMP | EMAC_IER_TXERR |
192 EMAC_IER_RLE | EMAC_IER_TUND | EMAC_IER_RXUBR | EMAC_IER_RCOMP;
195 status = EMAC->EMAC_ISR;
206 EMAC->EMAC_NCR |= EMAC_NCR_TE | EMAC_NCR_RE;
224 #if defined(USE_SAM3X_EK)
226 PMC->PMC_PCER0 = (1 << ID_PIOB);
238 EMAC->EMAC_USRIO = EMAC_USRIO_CLKEN | EMAC_USRIO_RMII;
277 rxBufferDesc[i].
status = 0;
286 EMAC->EMAC_TBQP = (uint32_t) txBufferDesc;
288 EMAC->EMAC_RBQP = (uint32_t) rxBufferDesc;
304 if(interface->phyDriver != NULL)
307 interface->phyDriver->tick(interface);
309 else if(interface->switchDriver != NULL)
312 interface->switchDriver->tick(interface);
329 NVIC_EnableIRQ(EMAC_IRQn);
332 if(interface->phyDriver != NULL)
335 interface->phyDriver->enableIrq(interface);
337 else if(interface->switchDriver != NULL)
340 interface->switchDriver->enableIrq(interface);
357 NVIC_DisableIRQ(EMAC_IRQn);
360 if(interface->phyDriver != NULL)
363 interface->phyDriver->disableIrq(interface);
365 else if(interface->switchDriver != NULL)
368 interface->switchDriver->disableIrq(interface);
384 volatile uint32_t isr;
385 volatile uint32_t tsr;
386 volatile uint32_t rsr;
396 isr = EMAC->EMAC_ISR;
397 tsr = EMAC->EMAC_TSR;
398 rsr = EMAC->EMAC_RSR;
402 if((tsr & (EMAC_TSR_UND | EMAC_TSR_COMP | EMAC_TSR_BEX |
403 EMAC_TSR_TGO | EMAC_TSR_RLES | EMAC_TSR_COL | EMAC_TSR_UBR)) != 0)
406 EMAC->EMAC_TSR = tsr;
409 if((txBufferDesc[txBufferIndex].status &
EMAC_TX_USED) != 0)
417 if((rsr & (EMAC_RSR_OVR | EMAC_RSR_REC | EMAC_RSR_BNA)) != 0)
420 nicDriverInterface->nicEvent =
TRUE;
441 rsr = EMAC->EMAC_RSR;
444 if((rsr & (EMAC_RSR_OVR | EMAC_RSR_REC | EMAC_RSR_BNA)) != 0)
447 EMAC->EMAC_RSR = rsr;
489 if((txBufferDesc[txBufferIndex].status &
EMAC_TX_USED) == 0)
518 EMAC->EMAC_NCR |= EMAC_NCR_TSTART;
521 if((txBufferDesc[txBufferIndex].status &
EMAC_TX_USED) != 0)
559 j = rxBufferIndex + i;
582 if((rxBufferDesc[j].status &
EMAC_RX_EOF) != 0 && sofIndex != UINT_MAX)
596 if(eofIndex != UINT_MAX)
600 else if(sofIndex != UINT_MAX)
613 for(i = 0; i < j; i++)
616 if(eofIndex != UINT_MAX && i >= sofIndex && i <= eofIndex)
676 uint32_t hashTable[2];
684 EMAC->EMAC_SA[0].EMAC_SAxB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
685 EMAC->EMAC_SA[0].EMAC_SAxT = interface->macAddr.w[2];
701 entry = &interface->macAddrFilter[i];
713 k = (
p[0] >> 6) ^
p[0];
714 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
715 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
716 k ^= (
p[3] >> 6) ^
p[3];
717 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
718 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
724 hashTable[k / 32] |= (1 << (k % 32));
732 unicastMacAddr[j++] = entry->
addr;
742 EMAC->EMAC_SA[1].EMAC_SAxB = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
743 EMAC->EMAC_SA[1].EMAC_SAxT = unicastMacAddr[0].w[2];
748 EMAC->EMAC_SA[1].EMAC_SAxB = 0;
755 EMAC->EMAC_SA[2].EMAC_SAxB = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
756 EMAC->EMAC_SA[2].EMAC_SAxT = unicastMacAddr[1].w[2];
761 EMAC->EMAC_SA[2].EMAC_SAxB = 0;
768 EMAC->EMAC_SA[3].EMAC_SAxB = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
769 EMAC->EMAC_SA[3].EMAC_SAxT = unicastMacAddr[2].w[2];
774 EMAC->EMAC_SA[3].EMAC_SAxB = 0;
778 EMAC->EMAC_HRB = hashTable[0];
779 EMAC->EMAC_HRT = hashTable[1];
782 TRACE_DEBUG(
" HRB = %08" PRIX32
"\r\n", EMAC->EMAC_HRB);
783 TRACE_DEBUG(
" HRT = %08" PRIX32
"\r\n", EMAC->EMAC_HRT);
801 config = EMAC->EMAC_NCFGR;
806 config |= EMAC_NCFGR_SPD;
810 config &= ~EMAC_NCFGR_SPD;
816 config |= EMAC_NCFGR_FD;
820 config &= ~EMAC_NCFGR_FD;
824 EMAC->EMAC_NCFGR = config;
848 temp = EMAC_MAN_SOF(1) | EMAC_MAN_RW(1) | EMAC_MAN_CODE(2);
850 temp |= EMAC_MAN_PHYA(phyAddr);
852 temp |= EMAC_MAN_REGA(
regAddr);
854 temp |= EMAC_MAN_DATA(
data);
857 EMAC->EMAC_MAN = temp;
859 while((EMAC->EMAC_NSR & EMAC_NSR_IDLE) == 0)
888 temp = EMAC_MAN_SOF(1) | EMAC_MAN_RW(2) | EMAC_MAN_CODE(2);
890 temp |= EMAC_MAN_PHYA(phyAddr);
892 temp |= EMAC_MAN_REGA(
regAddr);
895 EMAC->EMAC_MAN = temp;
897 while((EMAC->EMAC_NSR & EMAC_NSR_IDLE) == 0)
902 data = EMAC->EMAC_MAN & EMAC_MAN_DATA_Msk;