int rt_hw_luminaryif_init(void) { rt_err_t result; unsigned long ulUser0, ulUser1; /* Enable and Reset the Ethernet Controller. */ SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH); SysCtlPeripheralReset(SYSCTL_PERIPH_ETH); /* Enable Port F for Ethernet LEDs. LED0 Bit 3 Output LED1 Bit 2 Output */ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); /* GPIODirModeSet and GPIOPadConfigSet */ GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3); GPIOPinConfigure(GPIO_PF2_LED1); GPIOPinConfigure(GPIO_PF3_LED0); FlashUserSet(0x00371200, 0x00563412); /* OUI:00-12-37 (hex) Texas Instruments, only for test */ /* Configure the hardware MAC address */ FlashUserGet(&ulUser0, &ulUser1); if((ulUser0 == 0xffffffff) || (ulUser1 == 0xffffffff)) { rt_kprintf("Fatal error in geting MAC address\n"); } /* init rt-thread device interface */ luminaryif_dev_entry.parent.parent.init = luminaryif_init; luminaryif_dev_entry.parent.parent.open = luminaryif_open; luminaryif_dev_entry.parent.parent.close = luminaryif_close; luminaryif_dev_entry.parent.parent.read = luminaryif_read; luminaryif_dev_entry.parent.parent.write = luminaryif_write; luminaryif_dev_entry.parent.parent.control = luminaryif_control; luminaryif_dev_entry.parent.eth_rx = luminaryif_rx; luminaryif_dev_entry.parent.eth_tx = luminaryif_tx; /* Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC address needed to program the hardware registers, then program the MAC address into the Ethernet Controller registers. */ luminaryif_dev_entry.dev_addr[0] = ((ulUser0 >> 0) & 0xff); luminaryif_dev_entry.dev_addr[1] = ((ulUser0 >> 8) & 0xff); luminaryif_dev_entry.dev_addr[2] = ((ulUser0 >> 16) & 0xff); luminaryif_dev_entry.dev_addr[3] = ((ulUser1 >> 0) & 0xff); luminaryif_dev_entry.dev_addr[4] = ((ulUser1 >> 8) & 0xff); luminaryif_dev_entry.dev_addr[5] = ((ulUser1 >> 16) & 0xff); /* Program the hardware with it's MAC address (for filtering). */ EthernetMACAddrSet(ETH_BASE, luminaryif_dev_entry.dev_addr); rt_sem_init(&tx_sem, "emac", 1, RT_IPC_FLAG_FIFO); result = eth_device_init(&(luminaryif_dev->parent), "E0"); return result; }
//***************************************************************************** // // Initialize the Ethernet client // // This function initializes all the Ethernet components to not configured. // This tells the SysTick interrupt which timer modules to call. // // \return None. // //***************************************************************************** void EthClientInit(tEventFunction pfnEvent) { uint32_t ui32User0, ui32User1; // // Initialize all the Ethernet components to not configured. This tells // the SysTick interrupt which timer modules to call. // HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN) = 0; HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DNS_EN) = 0; HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_TCP_EN) = 0; g_sEnet.eState = iEthNoConnection; g_sEnet.pfnEvent = pfnEvent; // // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC // address needed to program the hardware registers, then program the MAC // address into the Ethernet Controller registers. // FlashUserGet(&ui32User0, &ui32User1); g_sEnet.pui8MACAddr[0] = ((ui32User0 >> 0) & 0xff); g_sEnet.pui8MACAddr[1] = ((ui32User0 >> 8) & 0xff); g_sEnet.pui8MACAddr[2] = ((ui32User0 >> 16) & 0xff); g_sEnet.pui8MACAddr[3] = ((ui32User1 >> 0) & 0xff); g_sEnet.pui8MACAddr[4] = ((ui32User1 >> 8) & 0xff); g_sEnet.pui8MACAddr[5] = ((ui32User1 >> 16) & 0xff); lwIPInit(g_ui32SysClock, g_sEnet.pui8MACAddr, 0, 0, 0, IPADDR_USE_DHCP); // // Start lwIP tick interrupt. // HWREGBITW(&g_sEnet.ui32Flags, FLAG_TIMER_DHCP_EN) = 1; }
//***************************************************************************** // // This example demonstrates the use of the Ethernet Controller with the uIP // TCP/IP stack. // //***************************************************************************** int main(void) { uip_ipaddr_t ipaddr; static struct uip_eth_addr sTempAddr; long lPeriodicTimer, lARPTimer, lPacketLength; unsigned long ulUser0, ulUser1; unsigned long ulTemp; // // Set the clocking to run directly from the crystal. // SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); // // Initialize the OLED display. // RIT128x96x4Init(1000000); RIT128x96x4StringDraw("Ethernet with uIP", 12, 0, 15); // // Enable and Reset the Ethernet Controller. // SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH); SysCtlPeripheralReset(SYSCTL_PERIPH_ETH); // // Enable Port F for Ethernet LEDs. // LED0 Bit 3 Output // LED1 Bit 2 Output // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3); // // Configure SysTick for a periodic interrupt. // SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ); SysTickEnable(); SysTickIntEnable(); // // Intialize the Ethernet Controller and disable all Ethernet Controller // interrupt sources. // EthernetIntDisable(ETH_BASE, (ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); ulTemp = EthernetIntStatus(ETH_BASE, false); EthernetIntClear(ETH_BASE, ulTemp); // // Initialize the Ethernet Controller for operation. // EthernetInitExpClk(ETH_BASE, SysCtlClockGet()); // // Configure the Ethernet Controller for normal operation. // - Full Duplex // - TX CRC Auto Generation // - TX Padding Enabled // EthernetConfigSet(ETH_BASE, (ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN)); // // Wait for the link to become active. // RIT128x96x4StringDraw("Waiting for Link", 12, 8, 15); ulTemp = EthernetPHYRead(ETH_BASE, PHY_MR1); while((ulTemp & 0x0004) == 0) { ulTemp = EthernetPHYRead(ETH_BASE, PHY_MR1); } RIT128x96x4StringDraw("Link Established", 12, 16, 15); // // Enable the Ethernet Controller. // EthernetEnable(ETH_BASE); // // Enable the Ethernet interrupt. // IntEnable(INT_ETH); // // Enable the Ethernet RX Packet interrupt source. // EthernetIntEnable(ETH_BASE, ETH_INT_RX); // // Enable all processor interrupts. // IntMasterEnable(); // // Initialize the uIP TCP/IP stack. // uip_init(); #ifdef USE_STATIC_IP uip_ipaddr(ipaddr, DEFAULT_IPADDR0, DEFAULT_IPADDR1, DEFAULT_IPADDR2, DEFAULT_IPADDR3); uip_sethostaddr(ipaddr); DisplayIPAddress(ipaddr, 18, 24); uip_ipaddr(ipaddr, DEFAULT_NETMASK0, DEFAULT_NETMASK1, DEFAULT_NETMASK2, DEFAULT_NETMASK3); uip_setnetmask(ipaddr); #else uip_ipaddr(ipaddr, 0, 0, 0, 0); uip_sethostaddr(ipaddr); DisplayIPAddress(ipaddr, 18, 24); uip_ipaddr(ipaddr, 0, 0, 0, 0); uip_setnetmask(ipaddr); #endif // // Configure the hardware MAC address for Ethernet Controller filtering of // incoming packets. // // For the Ethernet Eval Kits, the MAC address will be stored in the // non-volatile USER0 and USER1 registers. These registers can be read // using the FlashUserGet function, as illustrated below. // FlashUserGet(&ulUser0, &ulUser1); if((ulUser0 == 0xffffffff) || (ulUser1 == 0xffffffff)) { // // We should never get here. This is an error if the MAC address has // not been programmed into the device. Exit the program. // RIT128x96x4StringDraw("MAC Address", 0, 16, 15); RIT128x96x4StringDraw("Not Programmed!", 0, 24, 15); while(1) { } } // // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC // address needed to program the hardware registers, then program the MAC // address into the Ethernet Controller registers. // sTempAddr.addr[0] = ((ulUser0 >> 0) & 0xff); sTempAddr.addr[1] = ((ulUser0 >> 8) & 0xff); sTempAddr.addr[2] = ((ulUser0 >> 16) & 0xff); sTempAddr.addr[3] = ((ulUser1 >> 0) & 0xff); sTempAddr.addr[4] = ((ulUser1 >> 8) & 0xff); sTempAddr.addr[5] = ((ulUser1 >> 16) & 0xff); // // Program the hardware with it's MAC address (for filtering). // EthernetMACAddrSet(ETH_BASE, (unsigned char *)&sTempAddr); uip_setethaddr(sTempAddr); // // Initialize the TCP/IP Application (e.g. web server). // httpd_init(); #ifndef USE_STATIC_IP // // Initialize the DHCP Client Application. // dhcpc_init(&sTempAddr.addr[0], 6); dhcpc_request(); #endif // // Main Application Loop. // lPeriodicTimer = 0; lARPTimer = 0; while(true) { // // Wait for an event to occur. This can be either a System Tick event, // or an RX Packet event. // while(!g_ulFlags) { } // // If SysTick, Clear the SysTick interrupt flag and increment the // timers. // if(HWREGBITW(&g_ulFlags, FLAG_SYSTICK) == 1) { HWREGBITW(&g_ulFlags, FLAG_SYSTICK) = 0; lPeriodicTimer += SYSTICKMS; lARPTimer += SYSTICKMS; } // // Check for an RX Packet and read it. // lPacketLength = EthernetPacketGetNonBlocking(ETH_BASE, uip_buf, sizeof(uip_buf)); if(lPacketLength > 0) { // // Set uip_len for uIP stack usage. // uip_len = (unsigned short)lPacketLength; // // Clear the RX Packet event and renable RX Packet interrupts. // if(HWREGBITW(&g_ulFlags, FLAG_RXPKT) == 1) { HWREGBITW(&g_ulFlags, FLAG_RXPKT) = 0; EthernetIntEnable(ETH_BASE, ETH_INT_RX); } // // Process incoming IP packets here. // if(BUF->type == htons(UIP_ETHTYPE_IP)) { uip_arp_ipin(); uip_input(); // // If the above function invocation resulted in data that // should be sent out on the network, the global variable // uip_len is set to a value > 0. // if(uip_len > 0) { uip_arp_out(); EthernetPacketPut(ETH_BASE, uip_buf, uip_len); uip_len = 0; } } // // Process incoming ARP packets here. // else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); // // If the above function invocation resulted in data that // should be sent out on the network, the global variable // uip_len is set to a value > 0. // if(uip_len > 0) { EthernetPacketPut(ETH_BASE, uip_buf, uip_len); uip_len = 0; } } } // // Process TCP/IP Periodic Timer here. // if(lPeriodicTimer > UIP_PERIODIC_TIMER_MS) { lPeriodicTimer = 0; for(ulTemp = 0; ulTemp < UIP_CONNS; ulTemp++) { uip_periodic(ulTemp); // // If the above function invocation resulted in data that // should be sent out on the network, the global variable // uip_len is set to a value > 0. // if(uip_len > 0) { uip_arp_out(); EthernetPacketPut(ETH_BASE, uip_buf, uip_len); uip_len = 0; } } #if UIP_UDP for(ulTemp = 0; ulTemp < UIP_UDP_CONNS; ulTemp++) { uip_udp_periodic(ulTemp); // // If the above function invocation resulted in data that // should be sent out on the network, the global variable // uip_len is set to a value > 0. // if(uip_len > 0) { uip_arp_out(); EthernetPacketPut(ETH_BASE, uip_buf, uip_len); uip_len = 0; } } #endif // UIP_UDP } // // Process ARP Timer here. // if(lARPTimer > UIP_ARP_TIMER_MS) { lARPTimer = 0; uip_arp_timer(); } } }
//***************************************************************************** // // Set the SimpliciTI device address as the least significant 4 digits of the // device Ethernet MAC address. This ensures that the address is unique across // Stellaris devices. If the MAC address has not been set, we return false to // indicate failure. // //***************************************************************************** tBoolean SetSimpliciTIAddress(void) { unsigned long ulUser0, ulUser1; addr_t sAddr; // // Make sure we are using 4 byte addressing. // ASSERT(NET_ADDR_SIZE == 4); // // Get the MAC address from the non-volatile user registers. // FlashUserGet(&ulUser0, &ulUser1); // // Has the MAC address been programmed? // if((ulUser0 == 0xffffffff) || (ulUser1 == 0xffffffff)) { // // No - we don't have an address so return a failure. // UpdateStatus(false, "Flash user registers are clear"); UpdateStatus(true, "Error - address not set!"); return(false); } else { // // The MAC address is stored with 3 bytes in each of the 2 flash user // registers. Extract the least significant 4 MAC bytes for use as the // SimpliciTI device address. // sAddr.addr[0] = ((ulUser1 >> 16) & 0xff); sAddr.addr[1] = ((ulUser1 >> 8) & 0xff); sAddr.addr[2] = ((ulUser1 >> 0) & 0xff); sAddr.addr[3] = ((ulUser0 >> 16) & 0xff); // // SimpliciTI requires that the first byte of the device address is // never either 0x00 or 0xFF so we check for these cases and invert the // first bit if either is detected. This does result in the // possibility of two devices having the same address but, for example // purposes, is likely to be fine. // if((sAddr.addr[0] == 0x00) || (sAddr.addr[0] == 0xFF)) { sAddr.addr[0] ^= 0x80; } // // Tell the SimpliciTI stack which device address we want to use. // SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &sAddr); } // // If we get here, all is well. // return(true); }