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 PIC32CX Ethernet MAC...\r\n");
124 nicDriverInterface = interface;
126 #if defined(__PIC32CX2051BZ62132__) || defined(__PIC32CX2051BZ62132__)
129 MCLK_REGS->MCLK_APBCMASK |= MCLK_APBCMASK_GMAC_Msk;
130 MCLK_REGS->MCLK_AHBMASK |= MCLK_AHBMASK_GMAC_Msk;
145 if(interface->phyDriver != NULL)
148 error = interface->phyDriver->init(interface);
150 else if(interface->switchDriver != NULL)
153 error = interface->switchDriver->init(interface);
168 GMAC_REGS->SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
169 GMAC_REGS->SA[0].GMAC_SAT = interface->macAddr.w[2];
233 #if defined(USE_PIC32CX_SG41_CURIOSITY_ULTRA) || \
234 defined(USE_PIC32CX_SG61_CURIOSITY_ULTRA)
238 MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;
241 PORT_REGS->GROUP[0].PORT_PINCFG[12] |= PORT_PINCFG_PMUXEN_Msk;
242 temp = PORT_REGS->GROUP[0].PORT_PMUX[6] & ~PORT_PMUX_PMUXE_Msk;
243 PORT_REGS->GROUP[0].PORT_PMUX[6] = temp | PORT_PMUX_PMUXE(MUX_PA12L_GMAC_GRX1);
246 PORT_REGS->GROUP[0].PORT_PINCFG[13] |= PORT_PINCFG_PMUXEN_Msk;
247 temp = PORT_REGS->GROUP[0].PORT_PMUX[6] & ~PORT_PMUX_PMUXO_Msk;
248 PORT_REGS->GROUP[0].PORT_PMUX[6] = temp | PORT_PMUX_PMUXO(MUX_PA13L_GMAC_GRX0);
251 PORT_REGS->GROUP[0].PORT_PINCFG[14] |= PORT_PINCFG_PMUXEN_Msk;
252 temp = PORT_REGS->GROUP[0].PORT_PMUX[7] & ~PORT_PMUX_PMUXE_Msk;
253 PORT_REGS->GROUP[0].PORT_PMUX[7] = temp | PORT_PMUX_PMUXE(MUX_PA14L_GMAC_GTXCK);
256 PORT_REGS->GROUP[0].PORT_PINCFG[15] |= PORT_PINCFG_PMUXEN_Msk;
257 temp = PORT_REGS->GROUP[0].PORT_PMUX[7] & ~PORT_PMUX_PMUXO_Msk;
258 PORT_REGS->GROUP[0].PORT_PMUX[7] = temp | PORT_PMUX_PMUXO(MUX_PA15L_GMAC_GRXER);
261 PORT_REGS->GROUP[0].PORT_PINCFG[17] |= PORT_PINCFG_DRVSTR_Msk;
262 PORT_REGS->GROUP[0].PORT_PINCFG[17] |= PORT_PINCFG_PMUXEN_Msk;
263 temp = PORT_REGS->GROUP[0].PORT_PMUX[8] & ~PORT_PMUX_PMUXO_Msk;
264 PORT_REGS->GROUP[0].PORT_PMUX[8] = temp | PORT_PMUX_PMUXO(MUX_PA17L_GMAC_GTXEN);
267 PORT_REGS->GROUP[0].PORT_PINCFG[18] |= PORT_PINCFG_DRVSTR_Msk;
268 PORT_REGS->GROUP[0].PORT_PINCFG[18] |= PORT_PINCFG_PMUXEN_Msk;
269 temp = PORT_REGS->GROUP[0].PORT_PMUX[9] & ~PORT_PMUX_PMUXE_Msk;
270 PORT_REGS->GROUP[0].PORT_PMUX[9] = temp | PORT_PMUX_PMUXE(MUX_PA18L_GMAC_GTX0);
273 PORT_REGS->GROUP[0].PORT_PINCFG[19] |= PORT_PINCFG_DRVSTR_Msk;
274 PORT_REGS->GROUP[0].PORT_PINCFG[19] |= PORT_PINCFG_PMUXEN_Msk;
275 temp = PORT_REGS->GROUP[0].PORT_PMUX[9] & ~PORT_PMUX_PMUXO_Msk;
276 PORT_REGS->GROUP[0].PORT_PMUX[9] = temp | PORT_PMUX_PMUXO(MUX_PA19L_GMAC_GTX1);
279 PORT_REGS->GROUP[2].PORT_PINCFG[20] |= PORT_PINCFG_PMUXEN_Msk;
280 temp = PORT_REGS->GROUP[2].PORT_PMUX[10] & ~PORT_PMUX_PMUXE_Msk;
281 PORT_REGS->GROUP[2].PORT_PMUX[10] = temp | PORT_PMUX_PMUXE(MUX_PC20L_GMAC_GRXDV);
284 PORT_REGS->GROUP[2].PORT_PINCFG[22] |= PORT_PINCFG_PMUXEN_Msk;
285 temp = PORT_REGS->GROUP[2].PORT_PMUX[11] & ~PORT_PMUX_PMUXE_Msk;
286 PORT_REGS->GROUP[2].PORT_PMUX[11] = temp | PORT_PMUX_PMUXE(MUX_PC22L_GMAC_GMDC);
289 PORT_REGS->GROUP[2].PORT_PINCFG[23] |= PORT_PINCFG_PMUXEN_Msk;
290 temp = PORT_REGS->GROUP[2].PORT_PMUX[11] & ~PORT_PMUX_PMUXO_Msk;
291 PORT_REGS->GROUP[2].PORT_PMUX[11] = temp | PORT_PMUX_PMUXO(MUX_PC23L_GMAC_GMDIO);
297 PORT_REGS->GROUP[2].PORT_DIRSET = PORT_PC18;
300 PORT_REGS->GROUP[2].PORT_OUTCLR = PORT_PC18;
302 PORT_REGS->GROUP[2].PORT_OUTSET = PORT_PC18;
342 rxBufferDesc[i].
status = 0;
351 GMAC_REGS->GMAC_TBQB = (uint32_t) txBufferDesc;
353 GMAC_REGS->GMAC_RBQB = (uint32_t) rxBufferDesc;
369 if(interface->phyDriver != NULL)
372 interface->phyDriver->tick(interface);
374 else if(interface->switchDriver != NULL)
377 interface->switchDriver->tick(interface);
397 if(interface->phyDriver != NULL)
400 interface->phyDriver->enableIrq(interface);
402 else if(interface->switchDriver != NULL)
405 interface->switchDriver->enableIrq(interface);
425 if(interface->phyDriver != NULL)
428 interface->phyDriver->disableIrq(interface);
430 else if(interface->switchDriver != NULL)
433 interface->switchDriver->disableIrq(interface);
449 volatile uint32_t isr;
450 volatile uint32_t tsr;
451 volatile uint32_t rsr;
475 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
487 nicDriverInterface->nicEvent =
TRUE;
557 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) == 0)
592 if((txBufferDesc[txBufferIndex].status &
GMAC_TX_USED) != 0)
630 j = rxBufferIndex + i;
653 if((rxBufferDesc[j].status &
GMAC_RX_EOF) != 0 && sofIndex != UINT_MAX)
667 if(eofIndex != UINT_MAX)
671 else if(sofIndex != UINT_MAX)
684 for(i = 0; i < j; i++)
687 if(eofIndex != UINT_MAX && i >= sofIndex && i <= eofIndex)
747 uint32_t hashTable[2];
755 GMAC_REGS->SA[0].GMAC_SAB = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
756 GMAC_REGS->SA[0].GMAC_SAT = interface->macAddr.w[2];
772 entry = &interface->macAddrFilter[i];
784 k = (
p[0] >> 6) ^
p[0];
785 k ^= (
p[1] >> 4) ^ (
p[1] << 2);
786 k ^= (
p[2] >> 2) ^ (
p[2] << 4);
787 k ^= (
p[3] >> 6) ^
p[3];
788 k ^= (
p[4] >> 4) ^ (
p[4] << 2);
789 k ^= (
p[5] >> 2) ^ (
p[5] << 4);
795 hashTable[k / 32] |= (1 << (k % 32));
803 unicastMacAddr[j++] = entry->
addr;
813 GMAC_REGS->SA[1].GMAC_SAB = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
814 GMAC_REGS->SA[1].GMAC_SAT = unicastMacAddr[0].w[2];
826 GMAC_REGS->SA[2].GMAC_SAB = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
827 GMAC_REGS->SA[2].GMAC_SAT = unicastMacAddr[1].w[2];
839 GMAC_REGS->SA[3].GMAC_SAB = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
840 GMAC_REGS->SA[3].GMAC_SAT = unicastMacAddr[2].w[2];