32 #define TRACE_LEVEL NIC_TRACE_LEVEL
99 TRACE_INFO(
"Initializing PIC32MZ Ethernet MAC...\r\n");
102 nicDriverInterface = interface;
110 ETHCON1CLR = _ETHCON1_ON_MASK | _ETHCON1_TXRTS_POSITION | _ETHCON1_RXEN_MASK;
113 while((ETHSTAT & _ETHSTAT_ETHBUSY_MASK) != 0)
118 ETHCON1SET = _ETHCON1_ON_MASK;
131 EMAC1CFG1SET = _EMAC1CFG1_SOFTRESET_MASK;
132 EMAC1CFG1CLR = _EMAC1CFG1_SOFTRESET_MASK;
135 EMAC1SUPPSET = _EMAC1SUPP_RESETRMII_MASK;
136 EMAC1SUPPCLR = _EMAC1SUPP_RESETRMII_MASK;
139 EMAC1MCFGSET = _EMAC1MCFG_RESETMGMT_MASK;
140 EMAC1MCFGCLR = _EMAC1MCFG_RESETMGMT_MASK;
146 if(interface->phyDriver != NULL)
149 error = interface->phyDriver->init(interface);
151 else if(interface->switchDriver != NULL)
154 error = interface->switchDriver->init(interface);
172 interface->macAddr.w[0] = EMAC1SA2;
173 interface->macAddr.w[1] = EMAC1SA1;
174 interface->macAddr.w[2] = EMAC1SA0;
182 EMAC1SA0 = interface->macAddr.w[2];
183 EMAC1SA1 = interface->macAddr.w[1];
184 EMAC1SA2 = interface->macAddr.w[0];
192 ETHRXFC = _ETHRXFC_HTEN_MASK | _ETHRXFC_CRCOKEN_MASK |
193 _ETHRXFC_RUNTEN_MASK | _ETHRXFC_UCEN_MASK | _ETHRXFC_BCEN_MASK;
196 EMAC1CFG1 = _EMAC1CFG1_RXENABLE_MASK;
198 EMAC1CFG2 = _EMAC1CFG2_PADENABLE_MASK | _EMAC1CFG2_CRCENABLE_MASK;
206 ETHIENSET = _ETHIEN_PKTPENDIE_MASK | _ETHIEN_TXDONEIE_MASK;
214 ETHCON1SET = _ETHCON1_RXEN_MASK;
232 #if defined(USE_PIC32MZ_EC_STARTER_KIT)
234 ANSELJCLR = _ANSELJ_ANSJ8_MASK;
236 ANSELJCLR = _ANSELJ_ANSJ9_MASK;
238 ANSELJCLR = _ANSELJ_ANSJ11_MASK;
240 ANSELHCLR = _ANSELH_ANSH4_MASK;
242 ANSELHCLR = _ANSELH_ANSH5_MASK;
245 #elif defined(USE_PIC32MZ_EF_STARTER_KIT)
247 ANSELJCLR = _ANSELJ_ANSJ8_MASK;
249 ANSELJCLR = _ANSELJ_ANSJ9_MASK;
251 ANSELJCLR = _ANSELJ_ANSJ11_MASK;
253 ANSELHCLR = _ANSELH_ANSH4_MASK;
255 ANSELHCLR = _ANSELH_ANSH5_MASK;
258 TRISHCLR = _TRISH_TRISH11_MASK;
261 LATHCLR = _LATH_LATH11_MASK;
263 LATHSET = _LATH_LATH11_MASK;
267 #elif defined(USE_PIC32MZ_DA_STARTER_KIT)
269 TRISJCLR = _TRISJ_TRISJ15_MASK;
272 LATJCLR = _LATJ_LATJ15_MASK;
274 LATJSET = _LATJ_LATJ15_MASK;
278 #elif defined(USE_PIC32MZ_EF_CURIOSITY)
280 ANSELBCLR = _ANSELB_ANSB11_MASK;
282 ANSELBCLR = _ANSELB_ANSB12_MASK;
284 ANSELBCLR = _ANSELB_ANSB13_MASK;
286 ANSELGCLR = _ANSELG_ANSG8_MASK;
288 ANSELGCLR = _ANSELG_ANSG9_MASK;
291 TRISGCLR = _TRISG_TRISG15_MASK;
293 ANSELGCLR = _ANSELG_ANSG15_MASK;
296 LATGCLR = _LATG_LATG15_MASK;
298 LATGSET = _LATG_LATG15_MASK;
302 #elif defined(USE_PIC32MZ_EF_CURIOSITY_2)
304 ANSELJCLR = _ANSELJ_ANSJ8_MASK;
306 ANSELJCLR = _ANSELJ_ANSJ9_MASK;
308 ANSELJCLR = _ANSELJ_ANSJ11_MASK;
310 ANSELHCLR = _ANSELH_ANSH4_MASK;
312 ANSELHCLR = _ANSELH_ANSH5_MASK;
315 #elif defined(USE_PIC32MZ_DA_CURIOSITY)
317 TRISECLR = _TRISE_TRISE1_MASK;
319 ANSELECLR = _ANSELE_ANSE1_MASK;
322 LATECLR = _LATE_LATE1_MASK;
324 LATESET = _LATE_LATE1_MASK;
328 #elif defined(USE_IOT_ETHERNET_KIT)
330 ANSELECLR = _ANSELE_ANSE4_MASK;
332 ANSELECLR = _ANSELE_ANSE5_MASK;
334 ANSELECLR = _ANSELE_ANSE6_MASK;
336 ANSELECLR = _ANSELE_ANSE7_MASK;
339 TRISBCLR = _TRISB_TRISB14_MASK;
341 ANSELBCLR = _ANSELB_ANSB14_MASK;
344 LATBCLR = _LATB_LATB14_MASK;
346 LATBSET = _LATB_LATB14_MASK;
365 txCurBufferDesc = &txBufferDesc[i];
375 txCurBufferDesc->
next = KVA_TO_PA(&txBufferDesc[i + 1]);
379 txCurBufferDesc->
next = KVA_TO_PA(&txBufferDesc[0]);
381 txCurBufferDesc = &txBufferDesc[0];
387 rxCurBufferDesc = &rxBufferDesc[i];
397 rxCurBufferDesc->
next = KVA_TO_PA(&rxBufferDesc[i + 1]);
401 rxCurBufferDesc->
next = KVA_TO_PA(&rxBufferDesc[0]);
403 rxCurBufferDesc = &rxBufferDesc[0];
406 ETHTXST = KVA_TO_PA(&txBufferDesc[0]);
408 ETHRXST = KVA_TO_PA(&rxBufferDesc[0]);
426 if(interface->phyDriver != NULL)
429 interface->phyDriver->tick(interface);
431 else if(interface->switchDriver != NULL)
434 interface->switchDriver->tick(interface);
454 if(interface->phyDriver != NULL)
457 interface->phyDriver->enableIrq(interface);
459 else if(interface->switchDriver != NULL)
462 interface->switchDriver->enableIrq(interface);
482 if(interface->phyDriver != NULL)
485 interface->phyDriver->disableIrq(interface);
487 else if(interface->switchDriver != NULL)
490 interface->switchDriver->disableIrq(interface);
518 if((status & _ETHIRQ_TXDONE_MASK) != 0)
521 ETHIRQCLR = _ETHIRQ_TXDONE_MASK;
532 if((status & _ETHIRQ_PKTPEND_MASK) != 0)
535 ETHIENCLR = _ETHIEN_PKTPENDIE_MASK;
538 nicDriverInterface->nicEvent =
TRUE;
561 if((ETHIRQ & _ETHIRQ_PKTPEND_MASK) != 0)
574 ETHIENSET = _ETHIEN_PKTPENDIE_MASK;
623 ETHCON1SET = _ETHCON1_TXRTS_MASK;
626 txCurBufferDesc = PA_TO_KVA1(txCurBufferDesc->
next);
696 rxCurBufferDesc = PA_TO_KVA1(rxCurBufferDesc->
next);
700 ETHCON1SET = _ETHCON1_BUFCDEC_MASK;
724 uint32_t hashTable[2];
739 entry = &interface->macAddrFilter[i];
747 k = (crc >> 23) & 0x3F;
749 hashTable[k / 32] |= (1 << (k % 32));
754 ETHHT0 = hashTable[0];
755 ETHHT1 = hashTable[1];
758 TRACE_DEBUG(
" ETHHT0 = %08" PRIX32
"\r\n", ETHHT0);
759 TRACE_DEBUG(
" ETHHT1 = %08" PRIX32
"\r\n", ETHHT1);
778 EMAC1SUPPSET = _EMAC1SUPP_SPEEDRMII_MASK;
783 EMAC1SUPPCLR = _EMAC1SUPP_SPEEDRMII_MASK;
790 EMAC1CFG2SET = _EMAC1CFG2_FULLDPLX_MASK;
797 EMAC1CFG2CLR = _EMAC1CFG2_FULLDPLX_MASK;
824 EMAC1MADR = (phyAddr << _EMAC1MADR_PHYADDR_POSITION) |
regAddr;
826 EMAC1MWTD =
data & _EMAC1MWTD_MWTD_MASK;
829 for(i = 0; i < 16; i++)
831 __asm__ __volatile__ (
"nop;");
835 while((EMAC1MIND & _EMAC1MIND_MIIMBUSY_MASK) != 0)
864 EMAC1MADR = (phyAddr << _EMAC1MADR_PHYADDR_POSITION) |
regAddr;
866 EMAC1MCMD = _EMAC1MCMD_READ_MASK;
869 for(i = 0; i < 16; i++)
871 __asm__ __volatile__ (
"nop;");
875 while((EMAC1MIND & _EMAC1MIND_MIIMBUSY_MASK) != 0)
882 data = EMAC1MRDD & _EMAC1MRDD_MRDD_MASK;
910 p = (uint8_t *)
data;
915 for(i = 0; i <
length; i++)
918 for(j = 0; j < 8; j++)
921 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
923 crc = (crc << 1) ^ 0x04C11DB7;