32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "inc/hw_ethernet.h"
36 #include "inc/hw_ints.h"
37 #include "inc/hw_memmap.h"
38 #include "inc/hw_types.h"
39 #include "driverlib/gpio.h"
40 #include "driverlib/interrupt.h"
41 #include "driverlib/sysctl.h"
50 #if defined(__ICCARM__)
53 #pragma data_alignment = 4
56 #pragma data_alignment = 4
105 #ifdef ti_sysbios_BIOS___VERS
106 Hwi_Params hwiParams;
110 TRACE_INFO(
"Initializing F28M35x Ethernet MAC driver...\r\n");
113 nicDriverInterface = interface;
116 SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
118 SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);
124 div = SysCtlClockGet(20000000) / (2 * 2500000) - 1;
129 if(interface->phyDriver != NULL)
132 error = interface->phyDriver->init(interface);
134 else if(interface->switchDriver != NULL)
137 error = interface->switchDriver->init(interface);
152 MAC_IA0_R = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
156 MAC_TCTL_R = MAC_TCTL_DUPLEX | MAC_TCTL_CRC | MAC_TCTL_PADEN;
158 MAC_RCTL_R = MAC_RCTL_RSTFIFO | MAC_RCTL_BADCRC;
161 MAC_IM_R = MAC_IM_TXEMPM | MAC_IM_RXINTM;
163 #ifdef ti_sysbios_BIOS___VERS
165 Hwi_Params_init(&hwiParams);
166 hwiParams.enableInt =
FALSE;
202 #if defined(USE_TMDSCNCDH52C1)
204 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
205 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
206 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
207 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
208 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
209 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
212 GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_DIR_MODE_HW);
213 GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_PIN_TYPE_STD);
214 GPIOPinConfigure(GPIO_PC4_MIITXD3);
217 GPIODirModeSet(GPIO_PORTE_BASE, GPIO_PIN_6, GPIO_DIR_MODE_HW);
218 GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_6, GPIO_PIN_TYPE_STD);
219 GPIOPinConfigure(GPIO_PE6_MIIMDIO);
222 GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_DIR_MODE_HW);
223 GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_PIN_TYPE_STD);
224 GPIOPinConfigure(GPIO_PF5_MIIRXD3);
227 GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_0, GPIO_DIR_MODE_HW);
228 GPIOPadConfigSet(GPIO_PORTG_BASE, GPIO_PIN_0, GPIO_PIN_TYPE_STD);
229 GPIOPinConfigure(GPIO_PG0_MIIRXD2);
232 GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_1, GPIO_DIR_MODE_HW);
233 GPIOPadConfigSet(GPIO_PORTG_BASE, GPIO_PIN_1, GPIO_PIN_TYPE_STD);
234 GPIOPinConfigure(GPIO_PG1_MIIRXD1);
237 GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_3, GPIO_DIR_MODE_HW);
238 GPIOPadConfigSet(GPIO_PORTG_BASE, GPIO_PIN_3, GPIO_PIN_TYPE_STD);
239 GPIOPinConfigure(GPIO_PG3_MIIRXDV);
242 GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_7, GPIO_DIR_MODE_HW);
243 GPIOPadConfigSet(GPIO_PORTG_BASE, GPIO_PIN_7, GPIO_PIN_TYPE_STD);
244 GPIOPinConfigure(GPIO_PG7_MIITXER);
247 GPIODirModeSet(GPIO_PORTH_BASE, GPIO_PIN_1, GPIO_DIR_MODE_HW);
248 GPIOPadConfigSet(GPIO_PORTH_BASE, GPIO_PIN_1, GPIO_PIN_TYPE_STD);
249 GPIOPinConfigure(GPIO_PH1_MIIRXD0);
252 GPIODirModeSet(GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_DIR_MODE_HW);
253 GPIOPadConfigSet(GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_PIN_TYPE_STD);
254 GPIOPinConfigure(GPIO_PH3_MIITXD2);
257 GPIODirModeSet(GPIO_PORTH_BASE, GPIO_PIN_4, GPIO_DIR_MODE_HW);
258 GPIOPadConfigSet(GPIO_PORTH_BASE, GPIO_PIN_4, GPIO_PIN_TYPE_STD);
259 GPIOPinConfigure(GPIO_PH4_MIITXD1);
262 GPIODirModeSet(GPIO_PORTH_BASE, GPIO_PIN_5, GPIO_DIR_MODE_HW);
263 GPIOPadConfigSet(GPIO_PORTH_BASE, GPIO_PIN_5, GPIO_PIN_TYPE_STD);
264 GPIOPinConfigure(GPIO_PH5_MIITXD0);
267 GPIODirModeSet(GPIO_PORTH_BASE, GPIO_PIN_6, GPIO_DIR_MODE_HW);
268 GPIOPadConfigSet(GPIO_PORTH_BASE, GPIO_PIN_6, GPIO_PIN_TYPE_STD);
269 GPIOPinConfigure(GPIO_PH6_MIITXEN);
272 GPIODirModeSet(GPIO_PORTH_BASE, GPIO_PIN_7, GPIO_DIR_MODE_HW);
273 GPIOPadConfigSet(GPIO_PORTH_BASE, GPIO_PIN_7, GPIO_PIN_TYPE_STD);
274 GPIOPinConfigure(GPIO_PH7_MIITXCK);
277 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_0, GPIO_DIR_MODE_HW);
278 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_0, GPIO_PIN_TYPE_STD);
279 GPIOPinConfigure(GPIO_PJ0_MIIRXER);
282 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_2, GPIO_DIR_MODE_HW);
283 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_2, GPIO_PIN_TYPE_STD);
284 GPIOPinConfigure(GPIO_PJ2_MIIRXCK);
287 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_3, GPIO_DIR_MODE_HW);
288 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_3, GPIO_PIN_TYPE_STD);
289 GPIOPinConfigure(GPIO_PJ3_MIIMDC);
292 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_4, GPIO_DIR_MODE_HW);
293 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_4, GPIO_PIN_TYPE_STD);
294 GPIOPinConfigure(GPIO_PJ4_MIICOL);
297 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_5, GPIO_DIR_MODE_HW);
298 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_5, GPIO_PIN_TYPE_STD);
299 GPIOPinConfigure(GPIO_PJ5_MIICRS);
302 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_6, GPIO_DIR_MODE_HW);
303 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_6, GPIO_PIN_TYPE_STD);
304 GPIOPinConfigure(GPIO_PJ6_MIIPHYINTRn);
307 GPIODirModeSet(GPIO_PORTJ_BASE, GPIO_PIN_7, GPIO_DIR_MODE_HW);
308 GPIOPadConfigSet(GPIO_PORTJ_BASE, GPIO_PIN_7, GPIO_PIN_TYPE_STD);
309 GPIOPinConfigure(GPIO_PJ7_MIIPHYRSTn);
326 if(interface->phyDriver != NULL)
329 interface->phyDriver->tick(interface);
331 else if(interface->switchDriver != NULL)
334 interface->switchDriver->tick(interface);
350 #ifdef ti_sysbios_BIOS___VERS
352 Hwi_enableInterrupt(INT_ETH);
359 if(interface->phyDriver != NULL)
362 interface->phyDriver->enableIrq(interface);
364 else if(interface->switchDriver != NULL)
367 interface->switchDriver->enableIrq(interface);
383 #ifdef ti_sysbios_BIOS___VERS
385 Hwi_disableInterrupt(INT_ETH);
392 if(interface->phyDriver != NULL)
395 interface->phyDriver->disableIrq(interface);
397 else if(interface->switchDriver != NULL)
400 interface->switchDriver->disableIrq(interface);
428 if((status & MAC_RIS_TXEMP) != 0)
442 if((status & MAC_RIS_RXINT) != 0)
448 nicDriverInterface->nicEvent =
TRUE;
472 while((
MAC_NP_R & MAC_NP_NPR_M) != 0)
480 MAC_IM_R = MAC_IM_TXEMPM | MAC_IM_RXINTM;
532 for(i = 0; i <
length; i++)
582 *(
p++) = (uint16_t) (
data >> 16);
586 for(i = 2; i <
n; i += 4)
591 *(
p++) = (uint16_t)
data;
592 *(
p++) = (uint16_t) (
data >> 16);
658 MAC_IA0_R = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
662 acceptMulticast =
FALSE;
669 if(interface->macAddrFilter[i].refCount > 0)
672 acceptMulticast =
TRUE;