/*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 <string.h> | |
#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 ); | |
char 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 ); | |
} | |