/*This file has been prepared for Doxygen automatic documentation generation.*/ /*! \file ********************************************************************* * * \brief ethernet management for AVR32 UC3. * * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 * - Supported devices: All AVR32 devices can be used. * - AppNote: * * \author Atmel Corporation: http://www.atmel.com \n * Support and FAQ: http://support.atmel.no/ * *****************************************************************************/ /* Copyright (c) 2007, Atmel Corporation All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of ATMEL may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "conf_eth.h" /* Scheduler include files. */ #include "FreeRTOS.h" #include "task.h" /* Demo program include files. */ #include "partest.h" #include "serial.h" /* ethernet includes */ #include "ethernet.h" #include "conf_eth.h" #include "macb.h" #include "gpio.h" #if (HTTP_USED == 1) #include "BasicWEB.h" #endif #if (TFTP_USED == 1) #include "BasicTFTP.h" #endif #if (SMTP_USED == 1) #include "BasicSMTP.h" #endif /* lwIP includes */ #include "lwip/sys.h" #include "lwip/api.h" #include "lwip/tcpip.h" #include "lwip/memp.h" #include "lwip/stats.h" #include "netif/loopif.h" //_____ M A C R O S ________________________________________________________ //_____ D E F I N I T I O N S ______________________________________________ /* global variable containing MAC Config (hw addr, IP, GW, ...) */ struct netif MACB_if; //_____ D E C L A R A T I O N S ____________________________________________ /* Initialisation required by lwIP. */ static void prvlwIPInit( void ); /* Initialisation of ethernet interfaces by reading config file */ static void prvEthernetConfigureInterface(void * param); /*! \brief create ethernet task, for ethernet management. * * \param uxPriority Input. priority for the task, it should be low * */ void vStartEthernetTask( unsigned portBASE_TYPE uxPriority ) { static const gpio_map_t MACB_GPIO_MAP = { {AVR32_MACB_MDC_0_PIN, AVR32_MACB_MDC_0_FUNCTION }, {AVR32_MACB_MDIO_0_PIN, AVR32_MACB_MDIO_0_FUNCTION }, {AVR32_MACB_RXD_0_PIN, AVR32_MACB_RXD_0_FUNCTION }, {AVR32_MACB_TXD_0_PIN, AVR32_MACB_TXD_0_FUNCTION }, {AVR32_MACB_RXD_1_PIN, AVR32_MACB_RXD_1_FUNCTION }, {AVR32_MACB_TXD_1_PIN, AVR32_MACB_TXD_1_FUNCTION }, {AVR32_MACB_TX_EN_0_PIN, AVR32_MACB_TX_EN_0_FUNCTION }, {AVR32_MACB_RX_ER_0_PIN, AVR32_MACB_RX_ER_0_FUNCTION }, {AVR32_MACB_RX_DV_0_PIN, AVR32_MACB_RX_DV_0_FUNCTION }, {AVR32_MACB_TX_CLK_0_PIN, AVR32_MACB_TX_CLK_0_FUNCTION} }; // Assign GPIO to MACB gpio_enable_module(MACB_GPIO_MAP, sizeof(MACB_GPIO_MAP) / sizeof(MACB_GPIO_MAP[0])); /* Setup lwIP. */ prvlwIPInit(); #if (HTTP_USED == 1) /* Create the WEB server task. This uses the lwIP RTOS abstraction layer.*/ sys_thread_new( vBasicWEBServer, ( void * ) NULL, ethWEBSERVER_PRIORITY ); #endif #if (TFTP_USED == 1) /* Create the TFTP server task. This uses the lwIP RTOS abstraction layer.*/ sys_thread_new( vBasicTFTPServer, ( void * ) NULL, ethTFTPSERVER_PRIORITY ); #endif #if (SMTP_USED == 1) /* Create the SMTP Client task. This uses the lwIP RTOS abstraction layer.*/ sys_thread_new( vBasicSMTPClient, ( void * ) NULL, ethSMTPCLIENT_PRIORITY ); #endif } /*! * \brief start lwIP layer. */ static void prvlwIPInit( void ) { /* Initialize lwIP and its interface layer. */ #if LWIP_STATS stats_init(); #endif sys_init(); mem_init(); memp_init(); pbuf_init(); netif_init(); /* once TCP stack has been initalized, set hw and IP parameters, initialize MACB too */ tcpip_init( prvEthernetConfigureInterface, NULL ); } /*! * \brief set ethernet config */ static void prvEthernetConfigureInterface(void * param) { struct ip_addr xIpAddr, xNetMask, xGateway; extern err_t ethernetif_init( struct netif *netif ); portCHAR MacAddress[6]; /* Default MAC addr. */ MacAddress[0] = ETHERNET_CONF_ETHADDR0; MacAddress[1] = ETHERNET_CONF_ETHADDR1; MacAddress[2] = ETHERNET_CONF_ETHADDR2; MacAddress[3] = ETHERNET_CONF_ETHADDR3; MacAddress[4] = ETHERNET_CONF_ETHADDR4; MacAddress[5] = ETHERNET_CONF_ETHADDR5; /* pass the MAC address to MACB module */ vMACBSetMACAddress( MacAddress ); /* set MAC hardware address length to be used by lwIP */ MACB_if.hwaddr_len = 6; /* set MAC hardware address to be used by lwIP */ memcpy( MACB_if.hwaddr, MacAddress, MACB_if.hwaddr_len ); /* Default ip addr. */ IP4_ADDR( &xIpAddr,ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3 ); /* Default Subnet mask. */ IP4_ADDR( &xNetMask,ETHERNET_CONF_NET_MASK0,ETHERNET_CONF_NET_MASK1,ETHERNET_CONF_NET_MASK2,ETHERNET_CONF_NET_MASK3 ); /* Default Gw addr. */ IP4_ADDR( &xGateway,ETHERNET_CONF_GATEWAY_ADDR0,ETHERNET_CONF_GATEWAY_ADDR1,ETHERNET_CONF_GATEWAY_ADDR2,ETHERNET_CONF_GATEWAY_ADDR3 ); /* add data to netif */ netif_add( &MACB_if, &xIpAddr, &xNetMask, &xGateway, NULL, ethernetif_init, tcpip_input ); /* make it the default interface */ netif_set_default( &MACB_if ); /* bring it up */ netif_set_up( &MACB_if ); }