SAMV71 Xplained Ultra Software Package 1.5

main.c

Go to the documentation of this file.
00001 /* ---------------------------------------------------------------------------- */
00002 /*                  Atmel Microcontroller Software Support                      */
00003 /*                       SAM Software Package License                           */
00004 /* ---------------------------------------------------------------------------- */
00005 /* Copyright (c) 2015, Atmel Corporation                                        */
00006 /*                                                                              */
00007 /* All rights reserved.                                                         */
00008 /*                                                                              */
00009 /* Redistribution and use in source and binary forms, with or without           */
00010 /* modification, are permitted provided that the following condition is met:    */
00011 /*                                                                              */
00012 /* - Redistributions of source code must retain the above copyright notice,     */
00013 /* this list of conditions and the disclaimer below.                            */
00014 /*                                                                              */
00015 /* Atmel's name may not be used to endorse or promote products derived from     */
00016 /* this software without specific prior written permission.                     */
00017 /*                                                                              */
00018 /* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */
00019 /* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
00020 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */
00021 /* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */
00022 /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
00023 /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */
00024 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
00025 /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */
00026 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
00027 /* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */
00028 /* ---------------------------------------------------------------------------- */
00029 
00030 /**
00031  *  \page gmac_uip_telnetd GMAC Telnetd Example
00032  *
00033  *  \section Purpose
00034  *
00035  *  This project implements a telnet server example of the uIP TCP/IP stack.
00036  *  It enables the device to act as a simple telnetd server.
00037  *
00038  *  \section Requirements
00039  *
00040  * This package can be used with SAMV71 Xplained Ultra board or SAME70 Xplained board.
00041  *
00042  *  \section Description
00043  *
00044  * Please refer to the uIP documentation for more information
00045  * about the TCP/IP stack, the telnetd example.
00046  *
00047  * By default, the example does not use DHCP.
00048  * If you want to use DHCP, please:
00049  * - Open file uip-conf.h and don't comment the line "#define UIP_DHCP_on".
00050  * - Include uip/apps/dhcps to compile.
00051  *
00052  *  \section Usage
00053  *
00054  *  -# Build the program and download it inside the board.
00055  *     Please refer to the Getting Started with SAM V71/E70 Microcontrollers.pdf
00056  *  -# On the computer, open and configure a terminal application
00057  *     (e.g. HyperTerminal on Microsoft Windows) with these settings:
00058  *    - 115200 baud rate
00059  *    - 8 bits of data
00060  *    - No parity
00061  *    - 1 stop bit
00062  *    - No flow control
00063  *  -# Connect an Ethernet cable between the evaluation board and the network.
00064  *      The board may be connected directly to a computer; in this case,
00065  *      make sure to use a cross/twisted wired cable such as the one provided
00066  *      with the evaluation kit.
00067  *  -# Start the application. It will display the following message on the terminal:
00068  *    \code
00069  *    -- GMAC uIP Telnetd Example xxx --
00070  *    -- xxxxxx-xx
00071  *    -- Compiled: xxx xx xxxx xx:xx:xx --
00072  *    - MAC 3a:1f:34:08:54:05
00073  *    - Host IP 10.217.12.223
00074  *    - Router IP 10.217.12.1
00075  *    - Net Mask 255.255.255.0
00076  *    \endcode
00077  *  -# Connect to the %device IP address using telnet on port 23:
00078  *    \code
00079  *    telnet 10.217.12.223 23
00080  *    \endcode
00081  *    A telnet terminal will appear:
00082  *    \code
00083  *    uIP command shell
00084  *    Type '?' and return for help
00085  *    uIP 1.0>
00086  *    \endcode
00087  * \note
00088  * Make sure the IP address of the device(EK board) and the computer are in the same network.
00089  *
00090  *  \section References
00091  *  - gmac_uip_telnetd/main.c
00092  *  - gmacb.h
00093  *  - gmacd.h
00094  *  - gmac.h
00095  *  - uip.h
00096  */
00097 
00098 /** \file
00099  *
00100  *  This file contains all the specific code for the gmac_uip_telnetd example.
00101  *
00102  */
00103 
00104 /*----------------------------------------------------------------------------
00105  *        Headers
00106  *----------------------------------------------------------------------------*/
00107 
00108 #include "board.h"
00109 
00110 #include "uip.h"
00111 #include "uip_arp.h"
00112 #include "gmac_tapdev.h"
00113 #include "timer.h"
00114 
00115 /*---------------------------------------------------------------------------
00116  *         Variables
00117  *---------------------------------------------------------------------------*/
00118 
00119 /** TWI clock frequency in Hz. */
00120 #define TWCK            400000
00121 /** Slave address of twi_eeprom AT24MAC.*/
00122 #define AT24MAC_SERIAL_NUM_ADD  0x5F
00123 /** Page size of an AT24MAC402 chip (in bytes)*/
00124 #define PAGE_SIZE       16
00125 /** Page numbers of an AT24MAC402 chip */
00126 #define EEPROM_PAGES    16
00127 /** EEPROM Pins definition */
00128 #define BOARD_PINS_TWI_EEPROM PINS_TWI0
00129 /** TWI0 peripheral ID for EEPROM device*/
00130 #define BOARD_ID_TWI_EEPROM   ID_TWIHS0
00131 /** TWI0 base address for EEPROM device */
00132 #define BOARD_BASE_TWI_EEPROM TWIHS0
00133 
00134 /* uIP buffer : The ETH header */
00135 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
00136 
00137 /** TWI driver instance.*/
00138 static Twid twid;
00139 
00140 /** The PINs for TWI*/
00141 static const Pin twiPins[]      = BOARD_PINS_TWI_EEPROM;
00142 
00143 /* The MAC address used for demo */
00144 static struct uip_eth_addr GMacAddress = {{0x3a, 0x1f, 0x34, 0x08, 0x54, 0x54}};
00145 
00146 /* The IP address used for demo (ping ...) */
00147 static uint8_t HostIpAddress[4] = {192, 168, 1, 3 };
00148 
00149 /* Set the default router's IP address. */
00150 static const uint8_t RoutIpAddress[4] = {192, 168, 1, 2 };
00151 
00152 /* The NetMask address */
00153 static const uint8_t NetMask[4] = {255, 255, 255, 0};
00154 
00155 /*----------------------------------------------------------------------------
00156  *        Local functions
00157  *----------------------------------------------------------------------------*/
00158 
00159 /**
00160  * Initialize demo application
00161  */
00162 static void _app_init(void)
00163 {
00164     printf("P: telnetd application init\n\r");
00165     telnetd_init();
00166 
00167 #ifdef __DHCPC_H__
00168     printf("P: DHCPC Init\n\r");
00169     dhcpc_init(MacAddress.addr, 6);
00170 #endif
00171 }
00172 
00173 /*----------------------------------------------------------------------------
00174  *        Exported functions
00175  *----------------------------------------------------------------------------*/
00176 
00177 /**
00178  * uip_log: Global function for uIP to use.
00179  * \param m Pointer to string that logged
00180  */
00181 void uip_log(char *m)
00182 {
00183     TRACE_INFO("-uIP log- %s\n\r", m);
00184 }
00185 
00186 #ifdef __DHCPC_H__
00187 /**
00188  * dhcpc_configured: Global function for uIP DHCPC to use,
00189  * notification of DHCP configuration.
00190  * \param s Pointer to DHCP state instance
00191  */
00192 void dhcpc_configured(const struct dhcpc_state *s)
00193 {
00194     u8_t *pAddr;
00195 
00196     printf("\n\r");
00197     printf("=== DHCP Configurations ===\n\r");
00198     pAddr = (u8_t *)s->ipaddr;
00199     printf("- IP   : %d.%d.%d.%d\n\r",
00200             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00201     pAddr = (u8_t *)s->netmask;
00202     printf("- Mask : %d.%d.%d.%d\n\r",
00203             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00204     pAddr = (u8_t *)s->default_router;
00205     printf("- GW   : %d.%d.%d.%d\n\r",
00206             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00207     pAddr = (u8_t *)s->dnsaddr;
00208     printf("- DNS  : %d.%d.%d.%d\n\r",
00209             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00210     printf("===========================\n\r\n");
00211     uip_sethostaddr(s->ipaddr);
00212     uip_setnetmask(s->netmask);
00213     uip_setdraddr(s->default_router);
00214 
00215 #ifdef __RESOLV_H__
00216     resolv_conf(s->dnsaddr);
00217 #else
00218     printf("DNS NOT enabled in the demo\n\r");
00219 #endif
00220 }
00221 #endif
00222 
00223 /**
00224  *  \brief gmac_uip_telnetd example entry point.
00225  *
00226  *  \return Unused (ANSI-C compatibility).
00227  */
00228 int main(void)
00229 {
00230     uip_ipaddr_t ipaddr;
00231     struct timer periodic_timer, arp_timer;
00232     uint32_t i;
00233     struct uip_eth_addr OrigiGMacAddr;
00234 
00235     /* Disable watchdog */
00236     WDT_Disable(WDT);
00237 
00238     SCB_EnableICache();
00239     SCB_EnableDCache();
00240 
00241     TimeTick_Configure();
00242     printf("-- GMAC uIP Telnetd Example %s --\n\r", SOFTPACK_VERSION);
00243     printf("-- %s\n\r", BOARD_NAME);
00244     printf("-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__ ,
00245             COMPILER_NAME);
00246 
00247     /* Configure systick for 1 ms. */
00248     TimeTick_Configure();
00249     /* Configure TWI pins. */
00250     PIO_Configure(twiPins, PIO_LISTSIZE(twiPins));
00251     /* Enable TWI */
00252     PMC_EnablePeripheral(BOARD_ID_TWI_EEPROM);
00253     TWI_ConfigureMaster(BOARD_BASE_TWI_EEPROM, TWCK, BOARD_MCK);
00254     TWID_Initialize(&twid, BOARD_BASE_TWI_EEPROM);
00255     /* Display MAC & IP settings */
00256     TWID_Read(&twid, AT24MAC_SERIAL_NUM_ADD, 0x9A, 1, OrigiGMacAddr.addr, PAGE_SIZE,
00257                 0);
00258 
00259     if ((OrigiGMacAddr.addr[0] == 0xFC) && (OrigiGMacAddr.addr[1] == 0xC2)
00260         && (OrigiGMacAddr.addr[2] == 0x3D)) {
00261         for (i = 0; i < 6; i++)
00262             GMacAddress.addr[i] = OrigiGMacAddr.addr[i];
00263     }
00264 
00265     printf("-- MAC %x:%x:%x:%x:%x:%x\n\r",
00266             GMacAddress.addr[0], GMacAddress.addr[1], GMacAddress.addr[2],
00267             GMacAddress.addr[3], GMacAddress.addr[4], GMacAddress.addr[5]);
00268 
00269 #ifndef __DHCPC_H__
00270     printf(" - Host IP  %d.%d.%d.%d\n\r",
00271             HostIpAddress[0], HostIpAddress[1], HostIpAddress[2], HostIpAddress[3]);
00272     printf(" - Router IP  %d.%d.%d.%d\n\r",
00273             RoutIpAddress[0], RoutIpAddress[1], RoutIpAddress[2], RoutIpAddress[3]);
00274     printf(" - Net Mask  %d.%d.%d.%d\n\r",
00275             NetMask[0], NetMask[1], NetMask[2], NetMask[3]);
00276 #endif
00277 
00278     /* System devices initialize */
00279     gmac_tapdev_setmac((uint8_t *)GMacAddress.addr);
00280     gmac_tapdev_init();
00281     clock_init();
00282     timer_set(&periodic_timer, CLOCK_SECOND / 2);
00283     timer_set(&arp_timer, CLOCK_SECOND * 10);
00284 
00285     /* Init uIP */
00286     uip_init();
00287 
00288 #ifdef __DHCPC_H__
00289     printf("P: DHCP Supported\n\r");
00290     uip_ipaddr(ipaddr, 0, 0, 0, 0);
00291     uip_sethostaddr(ipaddr);
00292     uip_ipaddr(ipaddr, 0, 0, 0, 0);
00293     uip_setdraddr(ipaddr);
00294     uip_ipaddr(ipaddr, 0, 0, 0, 0);
00295     uip_setnetmask(ipaddr);
00296 #else
00297     /* Set the IP address of this host */
00298     uip_ipaddr(ipaddr, HostIpAddress[0], HostIpAddress[1],
00299                 HostIpAddress[2], HostIpAddress[3]);
00300     uip_sethostaddr(ipaddr);
00301 
00302     uip_ipaddr(ipaddr, RoutIpAddress[0], RoutIpAddress[1],
00303                 RoutIpAddress[2], RoutIpAddress[3]);
00304     uip_setdraddr(ipaddr);
00305 
00306     uip_ipaddr(ipaddr, NetMask[0], NetMask[1], NetMask[2], NetMask[3]);
00307     uip_setnetmask(ipaddr);
00308 #endif
00309     uip_setethaddr(GMacAddress);
00310     _app_init();
00311 
00312     while (1) {
00313         uip_len = gmac_tapdev_read();
00314 
00315         if (uip_len > 0) {
00316             if (BUF->type == htons(UIP_ETHTYPE_IP)) {
00317                 uip_arp_ipin();
00318                 uip_input();
00319 
00320                 /* If the above function invocation resulted in data that
00321                     should be sent out on the network, the global variable
00322                     uip_len is set to a value > 0. */
00323                 if (uip_len > 0) {
00324                     uip_arp_out();
00325                     gmac_tapdev_send();
00326                 }
00327             } else if (BUF->type == htons(UIP_ETHTYPE_ARP)) {
00328                     uip_arp_arpin();
00329 
00330                 /* If the above function invocation resulted in data that
00331                     should be sent out on the network, the global variable
00332                     uip_len is set to a value > 0. */
00333                 if (uip_len > 0)
00334                     gmac_tapdev_send();
00335             }
00336         } else if (timer_expired(&periodic_timer)) {
00337             timer_reset(&periodic_timer);
00338 
00339             for (i = 0; i < UIP_CONNS; i++) {
00340                 uip_periodic(i);
00341 
00342                 /* If the above function invocation resulted in data that
00343                     should be sent out on the network, the global variable
00344                     uip_len is set to a value > 0. */
00345                 if (uip_len > 0) {
00346                     uip_arp_out();
00347                     gmac_tapdev_send();
00348                 }
00349             }
00350 
00351 #if UIP_UDP
00352 
00353             for (i = 0; i < UIP_UDP_CONNS; i++) {
00354                 uip_udp_periodic(i);
00355 
00356                 /* If the above function invocation resulted in data that
00357                     should be sent out on the network, the global variable
00358                     uip_len is set to a value > 0. */
00359                 if (uip_len > 0) {
00360                     uip_arp_out();
00361                     gmac_tapdev_send();
00362                 }
00363             }
00364 
00365 #endif /* UIP_UDP */
00366 
00367             /* Call the ARP timer function every 10 seconds. */
00368             if (timer_expired(&arp_timer)) {
00369                 timer_reset(&arp_timer);
00370                 uip_arp_timer();
00371             }
00372         }
00373     }
00374 }
00375 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines