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_TMDXCNCDH52C1)
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);
360 if(interface->phyDriver != NULL)
363 interface->phyDriver->enableIrq(interface);
365 else if(interface->switchDriver != NULL)
368 interface->switchDriver->enableIrq(interface);
384 #ifdef ti_sysbios_BIOS___VERS
386 Hwi_disableInterrupt(INT_ETH);
394 if(interface->phyDriver != NULL)
397 interface->phyDriver->disableIrq(interface);
399 else if(interface->switchDriver != NULL)
402 interface->switchDriver->disableIrq(interface);
430 if((status & MAC_RIS_TXEMP) != 0)
444 if((status & MAC_RIS_RXINT) != 0)
450 nicDriverInterface->nicEvent =
TRUE;
474 while((
MAC_NP_R & MAC_NP_NPR_M) != 0)
482 MAC_IM_R = MAC_IM_TXEMPM | MAC_IM_RXINTM;
534 for(i = 0; i <
length; i++)
584 *(
p++) = (uint16_t) (
data >> 16);
588 for(i = 2; i <
n; i += 4)
593 *(
p++) = (uint16_t)
data;
594 *(
p++) = (uint16_t) (
data >> 16);
660 MAC_IA0_R = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
664 acceptMulticast =
FALSE;
671 if(interface->macAddrFilter[i].refCount > 0)
674 acceptMulticast =
TRUE;
__attribute__((naked))
AVR32 Ethernet MAC interrupt wrapper.
@ ERROR_FAILURE
Generic error code.
#define ETH_MAX_FRAME_SIZE
#define MAC_ADDR_FILTER_SIZE
void f28m35xEthDisableIrq(NetInterface *interface)
Disable interrupts.
uint16_t f28m35xEthReadPhyReg(uint8_t opcode, uint8_t phyAddr, uint8_t regAddr)
Read PHY register.
const NicDriver f28m35xEthDriver
F28M35x Ethernet MAC driver.
void f28m35xEthEnableIrq(NetInterface *interface)
Enable interrupts.
error_t f28m35xEthUpdateMacAddrFilter(NetInterface *interface)
Configure MAC address filtering.
void f28m35xEthIrqHandler(void)
F28M35x Ethernet MAC interrupt service routine.
error_t f28m35xEthSendPacket(NetInterface *interface, const NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary)
Send a packet.
__weak_func void f28m35xEthInitGpio(NetInterface *interface)
GPIO configuration.
error_t f28m35xEthReceivePacket(NetInterface *interface)
Receive a packet.
void f28m35xEthTick(NetInterface *interface)
F28M35x Ethernet MAC timer handler.
error_t f28m35xEthInit(NetInterface *interface)
F28M35x Ethernet MAC driver initialization.
void f28m35xEthWritePhyReg(uint8_t opcode, uint8_t phyAddr, uint8_t regAddr, uint16_t data)
Write PHY register.
void f28m35xEthEventHandler(NetInterface *interface)
F28M35x Ethernet MAC event handler.
error_t f28m35xEthUpdateMacConfig(NetInterface *interface)
Adjust MAC configuration parameters for proper operation.
F28M35x Ethernet MAC driver.
#define F28M35X_ETH_IRQ_PRIORITY_GROUPING
#define F28M35X_ETH_IRQ_PRIORITY
size_t netBufferGetLength(const NetBuffer *buffer)
Get the actual length of a multi-part buffer.
size_t netBufferRead(void *dest, const NetBuffer *src, size_t srcOffset, size_t length)
Read data from a multi-part buffer.
const NetRxAncillary NET_DEFAULT_RX_ANCILLARY
void nicProcessPacket(NetInterface *interface, uint8_t *packet, size_t length, NetRxAncillary *ancillary)
Handle a packet received by the network controller.
@ NIC_TYPE_ETHERNET
Ethernet interface.
bool_t osSetEventFromIsr(OsEvent *event)
Set an event object to the signaled state from an interrupt service routine.
void osSetEvent(OsEvent *event)
Set the specified event object to the signaled state.
Structure describing a buffer that spans multiple chunks.