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_helloworld GMAC uIP Hello World Example
00032  *
00033  *  \section Purpose
00034  *
00035  *  This project implements a telnet hello-world example of the uIP stack.
00036  *  It makes the device to respond to telnet connections on port 1000.
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 hello-world 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 Hello World 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 1000:
00078  *    \code
00079  *    telnet 10.217.12.223 1000
00080  *    \endcode
00081  *    A greeting message will appear:
00082  *    \code
00083  *    Hello. What is your name?
00084  *    \endcode
00085  *
00086  * \note
00087  * Make sure the IP address of the device(EK board) and the computer are in the
00088  * same network.
00089  *
00090  *  \section References
00091  *  - gmac_uip_helloworld/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_helloworld 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 /** TWI clock frequency in Hz. */
00119 #define TWCK            400000
00120 /** Slave address of twi_eeprom AT24MAC.*/
00121 #define AT24MAC_SERIAL_NUM_ADD  0x5F
00122 /** Page size of an AT24MAC402 chip (in bytes)*/
00123 #define PAGE_SIZE       16
00124 /** Page numbers of an AT24MAC402 chip */
00125 #define EEPROM_PAGES    16
00126 /** EEPROM Pins definition */
00127 #define BOARD_PINS_TWI_EEPROM PINS_TWI0
00128 /** TWI0 peripheral ID for EEPROM device*/
00129 #define BOARD_ID_TWI_EEPROM   ID_TWIHS0
00130 /** TWI0 base address for EEPROM device */
00131 #define BOARD_BASE_TWI_EEPROM TWIHS0
00132 
00133 /* uIP buffer : The ETH header */
00134 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
00135 
00136 /** TWI driver instance.*/
00137 static Twid twid;
00138 
00139 /** The PINs for TWI*/
00140 static const Pin twiPins[]      = BOARD_PINS_TWI_EEPROM;
00141 /* The MAC address used for demo */
00142 static struct uip_eth_addr GMacAddress = {{0x3a, 0x1f, 0x34, 0x08, 0x54, 0x54}};
00143 
00144 /* The IP address used for demo (ping ...) */
00145 static uint8_t HostIpAddress[4] = {192, 168, 1, 3 };
00146 
00147 /* Set the default router's IP address. */
00148 static const uint8_t RoutIpAddress[4] = {192, 168, 1, 2 };
00149 /* The NetMask address */
00150 static const uint8_t NetMask[4] = {255, 255, 255, 0};
00151 
00152 /*----------------------------------------------------------------------------
00153  *        Local functions
00154  *----------------------------------------------------------------------------*/
00155 
00156 /**
00157  * Initialize demo application
00158  */
00159 static void _app_init(void)
00160 {
00161     printf("P: hello-world application init\n\r");
00162     hello_world_init();
00163 
00164 #ifdef __DHCPC_H__
00165     printf("P: DHCPC Init\n\r");
00166     dhcpc_init(MacAddress.addr, 6);
00167 #endif
00168 }
00169 
00170 /*----------------------------------------------------------------------------
00171  *        Exported functions
00172  *----------------------------------------------------------------------------*/
00173 
00174 /**
00175  * uip_log: Global function for uIP to use.
00176  * \param m Pointer to string that logged
00177  */
00178 void uip_log(char *m)
00179 {
00180     TRACE_INFO("-uIP log- %s\n\r", m);
00181 }
00182 
00183 #ifdef __DHCPC_H__
00184 /**
00185  * dhcpc_configured: Global function for uIP DHCPC to use,
00186  * notification of DHCP configuration.
00187  * \param s Pointer to DHCP state instance
00188  */
00189 void dhcpc_configured(const struct dhcpc_state *s)
00190 {
00191     u8_t *pAddr;
00192 
00193     printf("\n\r");
00194     printf("=== DHCP Configurations ===\n\r");
00195     pAddr = (u8_t *)s->ipaddr;
00196     printf("- IP   : %d.%d.%d.%d\n\r",
00197             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00198     pAddr = (u8_t *)s->netmask;
00199     printf("- Mask : %d.%d.%d.%d\n\r",
00200             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00201     pAddr = (u8_t *)s->default_router;
00202     printf("- GW   : %d.%d.%d.%d\n\r",
00203             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00204     pAddr = (u8_t *)s->dnsaddr;
00205     printf("- DNS  : %d.%d.%d.%d\n\r",
00206             pAddr[0], pAddr[1], pAddr[2], pAddr[3]);
00207     printf("===========================\n\r\n");
00208     uip_sethostaddr(s->ipaddr);
00209     uip_setnetmask(s->netmask);
00210     uip_setdraddr(s->default_router);
00211 
00212 #ifdef __RESOLV_H__
00213     resolv_conf(s->dnsaddr);
00214 #else
00215     printf("DNS NOT enabled in the demo\n\r");
00216 #endif
00217 }
00218 #endif
00219 
00220 /**
00221  *  \brief gmac_uip_helloworld example entry point.
00222  *
00223  *  \return Unused (ANSI-C compatibility).
00224  */
00225 int main(void)
00226 {
00227     uip_ipaddr_t ipaddr;
00228     struct timer periodic_timer, arp_timer;
00229     uint32_t i;
00230     struct uip_eth_addr OrigiGMacAddr;
00231 
00232     /* Disable watchdog */
00233     WDT_Disable(WDT);
00234 
00235     SCB_EnableICache();
00236     SCB_EnableDCache();
00237 
00238     printf("-- GMAC uIP Hello World Example %s --\n\r", SOFTPACK_VERSION);
00239     printf("-- %s\n\r", BOARD_NAME);
00240     printf("-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__ ,
00241             COMPILER_NAME);
00242 
00243 
00244     /* Configure systick for 1 ms. */
00245     TimeTick_Configure();
00246 
00247     /* Configure TWI pins. */
00248     PIO_Configure(twiPins, PIO_LISTSIZE(twiPins));
00249     /* Enable TWI */
00250     PMC_EnablePeripheral(BOARD_ID_TWI_EEPROM);
00251     TWI_ConfigureMaster(BOARD_BASE_TWI_EEPROM, TWCK, BOARD_MCK);
00252     TWID_Initialize(&twid, BOARD_BASE_TWI_EEPROM);
00253 
00254     /* Display MAC & IP settings */
00255     TWID_Read(&twid, AT24MAC_SERIAL_NUM_ADD, 0x9A, 1, OrigiGMacAddr.addr, PAGE_SIZE,
00256                 0);
00257 
00258     if ((OrigiGMacAddr.addr[0] == 0xFC) && (OrigiGMacAddr.addr[1] == 0xC2)
00259         && (OrigiGMacAddr.addr[2] == 0x3D)) {
00260         for (i = 0; i < 6; i++)
00261             GMacAddress.addr[i] = OrigiGMacAddr.addr[i];
00262     }
00263 
00264     printf("-- MAC %x:%x:%x:%x:%x:%x\n\r",
00265             GMacAddress.addr[0], GMacAddress.addr[1], GMacAddress.addr[2],
00266             GMacAddress.addr[3], GMacAddress.addr[4], GMacAddress.addr[5]);
00267 
00268 #ifndef __DHCPC_H__
00269     printf(" - Host IP  %d.%d.%d.%d\n\r",
00270             HostIpAddress[0], HostIpAddress[1], HostIpAddress[2], HostIpAddress[3]);
00271     printf(" - Router IP  %d.%d.%d.%d\n\r",
00272             RoutIpAddress[0], RoutIpAddress[1], RoutIpAddress[2], RoutIpAddress[3]);
00273     printf(" - Net Mask  %d.%d.%d.%d\n\r",
00274             NetMask[0], NetMask[1], NetMask[2], NetMask[3]);
00275 #endif
00276 
00277     /* System devices initialize */
00278     gmac_tapdev_setmac((uint8_t *)GMacAddress.addr);
00279     gmac_tapdev_init();
00280     clock_init();
00281     timer_set(&periodic_timer, CLOCK_SECOND / 2);
00282     timer_set(&arp_timer, CLOCK_SECOND * 10);
00283 
00284     /* Init uIP */
00285     uip_init();
00286 
00287 #ifdef __DHCPC_H__
00288     printf("P: DHCP Supported\n\r");
00289     uip_ipaddr(ipaddr, 0, 0, 0, 0);
00290     uip_sethostaddr(ipaddr);
00291     uip_ipaddr(ipaddr, 0, 0, 0, 0);
00292     uip_setdraddr(ipaddr);
00293     uip_ipaddr(ipaddr, 0, 0, 0, 0);
00294     uip_setnetmask(ipaddr);
00295 #else
00296     /* Set the IP address of this host */
00297     uip_ipaddr(ipaddr, HostIpAddress[0], HostIpAddress[1],
00298                 HostIpAddress[2], HostIpAddress[3]);
00299     uip_sethostaddr(ipaddr);
00300 
00301     uip_ipaddr(ipaddr, RoutIpAddress[0], RoutIpAddress[1],
00302                 RoutIpAddress[2], RoutIpAddress[3]);
00303     uip_setdraddr(ipaddr);
00304 
00305     uip_ipaddr(ipaddr, NetMask[0], NetMask[1], NetMask[2], NetMask[3]);
00306     uip_setnetmask(ipaddr);
00307 #endif
00308     uip_setethaddr(GMacAddress);
00309 
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 
00329                 uip_arp_arpin();
00330 
00331                 /* If the above function invocation resulted in data that
00332                     should be sent out on the network, the global variable
00333                     uip_len is set to a value > 0. */
00334                 if (uip_len > 0)
00335                     gmac_tapdev_send();
00336             }
00337         } else if (timer_expired(&periodic_timer)) {
00338             timer_reset(&periodic_timer);
00339 
00340             for (i = 0; i < UIP_CONNS; i++) {
00341                 uip_periodic(i);
00342 
00343                 /* If the above function invocation resulted in data that
00344                     should be sent out on the network, the global variable
00345                     uip_len is set to a value > 0. */
00346                 if (uip_len > 0) {
00347 
00348                     uip_arp_out();
00349                     gmac_tapdev_send();
00350                 }
00351             }
00352 
00353 #if UIP_UDP
00354 
00355             for (i = 0; i < UIP_UDP_CONNS; i++) {
00356                 uip_udp_periodic(i);
00357 
00358                 /* If the above function invocation resulted in data that
00359                     should be sent out on the network, the global variable
00360                     uip_len is set to a value > 0. */
00361                 if (uip_len > 0) {
00362                     uip_arp_out();
00363                     gmac_tapdev_send();
00364                 }
00365             }
00366 
00367 #endif /* UIP_UDP */
00368 
00369             /* Call the ARP timer function every 10 seconds. */
00370             if (timer_expired(&arp_timer)) {
00371                 timer_reset(&arp_timer);
00372                 uip_arp_timer();
00373             }
00374         }
00375     }
00376 }
00377 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines