LwIP with PPP & Ethernet integration

Dependents:   NetworkingCoreLib

This is the mbed port of the LwIP stack: http://savannah.nongnu.org/projects/lwip/

It includes contributed content from NXP's port for LPCxxxx devices: http://www.lpcware.com/content/project/lightweight-ip-lwip-networking-stack

Licence

LwIP is licenced under the BSD licence:

Copyright (c) 2001-2004 Swedish Institute of Computer Science. 
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 the author may not be used to endorse or promote products 
derived from this software without specific prior written permission. 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 DISCLAIMED. IN NO EVENT 
SHALL THE AUTHOR 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.
Committer:
donatien
Date:
Fri May 25 08:56:35 2012 +0000
Revision:
2:1a87f74b8e3b
Parent:
0:8e01dca41002
Removed compilation of EMAC driver when using PPP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8e01dca41002 1 /**********************************************************************
donatien 2:1a87f74b8e3b 2 * $Id$ lpc_phy_dp83848.c 2011-11-20
donatien 0:8e01dca41002 3 *//**
donatien 2:1a87f74b8e3b 4 * @file lpc_phy_dp83848.c
donatien 2:1a87f74b8e3b 5 * @brief DP83848C PHY status and control.
donatien 2:1a87f74b8e3b 6 * @version 1.0
donatien 2:1a87f74b8e3b 7 * @date 20 Nov. 2011
donatien 2:1a87f74b8e3b 8 * @author NXP MCU SW Application Team
donatien 0:8e01dca41002 9 *
donatien 0:8e01dca41002 10 * Copyright(C) 2011, NXP Semiconductor
donatien 0:8e01dca41002 11 * All rights reserved.
donatien 0:8e01dca41002 12 *
donatien 0:8e01dca41002 13 ***********************************************************************
donatien 0:8e01dca41002 14 * Software that is described herein is for illustrative purposes only
donatien 0:8e01dca41002 15 * which provides customers with programming information regarding the
donatien 0:8e01dca41002 16 * products. This software is supplied "AS IS" without any warranties.
donatien 0:8e01dca41002 17 * NXP Semiconductors assumes no responsibility or liability for the
donatien 0:8e01dca41002 18 * use of the software, conveys no license or title under any patent,
donatien 0:8e01dca41002 19 * copyright, or mask work right to the product. NXP Semiconductors
donatien 0:8e01dca41002 20 * reserves the right to make changes in the software without
donatien 0:8e01dca41002 21 * notification. NXP Semiconductors also make no representation or
donatien 0:8e01dca41002 22 * warranty that such application will be suitable for the specified
donatien 0:8e01dca41002 23 * use without further testing or modification.
donatien 0:8e01dca41002 24 **********************************************************************/
donatien 0:8e01dca41002 25
donatien 0:8e01dca41002 26 #include "lwip/opt.h"
donatien 2:1a87f74b8e3b 27
donatien 2:1a87f74b8e3b 28 #if NET_ETHERNET
donatien 2:1a87f74b8e3b 29
donatien 0:8e01dca41002 30 #include "lwip/err.h"
donatien 2:1a87f74b8e3b 31 #include "lwip/snmp.h"
donatien 0:8e01dca41002 32 #include "lpc_emac_config.h"
donatien 0:8e01dca41002 33 #include "lpc_phy.h"
donatien 0:8e01dca41002 34 #include "sys_arch.h"
donatien 0:8e01dca41002 35
donatien 2:1a87f74b8e3b 36 /** @defgroup dp83848_phy PHY status and control for the DP83848.
donatien 0:8e01dca41002 37 * @ingroup lwip_phy
donatien 0:8e01dca41002 38 *
donatien 0:8e01dca41002 39 * Various functions for controlling and monitoring the status of the
donatien 0:8e01dca41002 40 * DP83848 PHY. In polled (standalone) systems, the PHY state must be
donatien 0:8e01dca41002 41 * monitored as part of the application. In a threaded (RTOS) system,
donatien 0:8e01dca41002 42 * the PHY state is monitored by the PHY handler thread. The MAC
donatien 0:8e01dca41002 43 * driver will not transmit unless the PHY link is active.
donatien 0:8e01dca41002 44 * @{
donatien 0:8e01dca41002 45 */
donatien 0:8e01dca41002 46
donatien 0:8e01dca41002 47 /** \brief DP83848 PHY register offsets */
donatien 0:8e01dca41002 48 #define DP8_BMCR_REG 0x0 /**< Basic Mode Control Register */
donatien 0:8e01dca41002 49 #define DP8_BMSR_REG 0x1 /**< Basic Mode Status Reg */
donatien 0:8e01dca41002 50 #define DP8_ANADV_REG 0x4 /**< Auto_Neg Advt Reg */
donatien 0:8e01dca41002 51 #define DP8_ANLPA_REG 0x5 /**< Auto_neg Link Partner Ability Reg */
donatien 0:8e01dca41002 52 #define DP8_ANEEXP_REG 0x6 /**< Auto-neg Expansion Reg */
donatien 0:8e01dca41002 53 #define DP8_PHY_STAT_REG 0x10 /**< PHY Status Register */
donatien 0:8e01dca41002 54 #define DP8_PHY_INT_CTL_REG 0x11 /**< PHY Interrupt Control Register */
donatien 0:8e01dca41002 55 #define DP8_PHY_STS_REG 0x19 /**< PHY Status Register */
donatien 0:8e01dca41002 56
donatien 0:8e01dca41002 57 /** \brief DP83848 Control register definitions */
donatien 0:8e01dca41002 58 #define DP8_RESET (1 << 15) /**< 1= S/W Reset */
donatien 0:8e01dca41002 59 #define DP8_LOOPBACK (1 << 14) /**< 1=loopback Enabled */
donatien 0:8e01dca41002 60 #define DP8_SPEED_SELECT (1 << 13) /**< 1=Select 100MBps */
donatien 0:8e01dca41002 61 #define DP8_AUTONEG (1 << 12) /**< 1=Enable auto-negotiation */
donatien 0:8e01dca41002 62 #define DP8_POWER_DOWN (1 << 11) /**< 1=Power down PHY */
donatien 0:8e01dca41002 63 #define DP8_ISOLATE (1 << 10) /**< 1=Isolate PHY */
donatien 0:8e01dca41002 64 #define DP8_RESTART_AUTONEG (1 << 9) /**< 1=Restart auto-negoatiation */
donatien 0:8e01dca41002 65 #define DP8_DUPLEX_MODE (1 << 8) /**< 1=Full duplex mode */
donatien 0:8e01dca41002 66 #define DP8_COLLISION_TEST (1 << 7) /**< 1=Perform collsion test */
donatien 0:8e01dca41002 67
donatien 0:8e01dca41002 68 /** \brief DP83848 Status register definitions */
donatien 0:8e01dca41002 69 #define DP8_100BASE_T4 (1 << 15) /**< T4 mode */
donatien 0:8e01dca41002 70 #define DP8_100BASE_TX_FD (1 << 14) /**< 100MBps full duplex */
donatien 0:8e01dca41002 71 #define DP8_100BASE_TX_HD (1 << 13) /**< 100MBps half duplex */
donatien 0:8e01dca41002 72 #define DP8_10BASE_T_FD (1 << 12) /**< 100Bps full duplex */
donatien 0:8e01dca41002 73 #define DP8_10BASE_T_HD (1 << 11) /**< 10MBps half duplex */
donatien 0:8e01dca41002 74 #define DP8_MF_PREAMB_SUPPR (1 << 6) /**< Preamble suppress */
donatien 0:8e01dca41002 75 #define DP8_AUTONEG_COMP (1 << 5) /**< Auto-negotation complete */
donatien 0:8e01dca41002 76 #define DP8_RMT_FAULT (1 << 4) /**< Fault */
donatien 0:8e01dca41002 77 #define DP8_AUTONEG_ABILITY (1 << 3) /**< Auto-negotation supported */
donatien 0:8e01dca41002 78 #define DP8_LINK_STATUS (1 << 2) /**< 1=Link active */
donatien 0:8e01dca41002 79 #define DP8_JABBER_DETECT (1 << 1) /**< Jabber detect */
donatien 0:8e01dca41002 80 #define DP8_EXTEND_CAPAB (1 << 0) /**< Supports extended capabilities */
donatien 0:8e01dca41002 81
donatien 0:8e01dca41002 82 /** \brief DP83848 PHY status definitions */
donatien 0:8e01dca41002 83 #define DP8_REMOTEFAULT (1 << 6) /**< Remote fault */
donatien 0:8e01dca41002 84 #define DP8_FULLDUPLEX (1 << 2) /**< 1=full duplex */
donatien 0:8e01dca41002 85 #define DP8_SPEED10MBPS (1 << 1) /**< 1=10MBps speed */
donatien 0:8e01dca41002 86 #define DP8_VALID_LINK (1 << 0) /**< 1=Link active */
donatien 0:8e01dca41002 87
donatien 0:8e01dca41002 88 /** \brief DP83848 PHY ID register definitions */
donatien 0:8e01dca41002 89 #define DP8_PHYID1_OUI 0x2000 /**< Expected PHY ID1 */
donatien 0:8e01dca41002 90 #define DP8_PHYID2_OUI 0x5c90 /**< Expected PHY ID2 */
donatien 0:8e01dca41002 91
donatien 2:1a87f74b8e3b 92 /** \brief PHY status structure used to indicate current status of PHY.
donatien 2:1a87f74b8e3b 93 */
donatien 0:8e01dca41002 94 typedef struct {
donatien 2:1a87f74b8e3b 95 u32_t phy_speed_100mbs:1; /**< 10/100 MBS connection speed flag. */
donatien 2:1a87f74b8e3b 96 u32_t phy_full_duplex:1; /**< Half/full duplex connection speed flag. */
donatien 2:1a87f74b8e3b 97 u32_t phy_link_active:1; /**< Phy link active flag. */
donatien 0:8e01dca41002 98 } PHY_STATUS_TYPE;
donatien 0:8e01dca41002 99
donatien 0:8e01dca41002 100 /** \brief PHY update flags */
donatien 0:8e01dca41002 101 static PHY_STATUS_TYPE physts;
donatien 0:8e01dca41002 102
donatien 0:8e01dca41002 103 /** \brief Last PHY update flags, used for determing if something has changed */
donatien 0:8e01dca41002 104 static PHY_STATUS_TYPE olddphysts;
donatien 0:8e01dca41002 105
donatien 0:8e01dca41002 106 /** \brief PHY update counter for state machine */
donatien 0:8e01dca41002 107 static s32_t phyustate;
donatien 0:8e01dca41002 108
donatien 0:8e01dca41002 109 /** \brief Update PHY status from passed value
donatien 0:8e01dca41002 110 *
donatien 0:8e01dca41002 111 * This function updates the current PHY status based on the
donatien 0:8e01dca41002 112 * passed PHY status word. The PHY status indicate if the link
donatien 0:8e01dca41002 113 * is active, the connection speed, and duplex.
donatien 0:8e01dca41002 114 *
donatien 0:8e01dca41002 115 * \param[in] netif NETIF structure
donatien 0:8e01dca41002 116 * \param[in] linksts Status word from PHY
donatien 0:8e01dca41002 117 * \return 1 if the status has changed, otherwise 0
donatien 0:8e01dca41002 118 */
donatien 0:8e01dca41002 119 static s32_t lpc_update_phy_sts(struct netif *netif, u32_t linksts)
donatien 0:8e01dca41002 120 {
donatien 2:1a87f74b8e3b 121 s32_t changed = 0;
donatien 0:8e01dca41002 122
donatien 2:1a87f74b8e3b 123 /* Update link active status */
donatien 2:1a87f74b8e3b 124 if (linksts & DP8_VALID_LINK)
donatien 2:1a87f74b8e3b 125 physts.phy_link_active = 1;
donatien 2:1a87f74b8e3b 126 else
donatien 2:1a87f74b8e3b 127 physts.phy_link_active = 0;
donatien 0:8e01dca41002 128
donatien 2:1a87f74b8e3b 129 /* Full or half duplex */
donatien 2:1a87f74b8e3b 130 if (linksts & DP8_FULLDUPLEX)
donatien 2:1a87f74b8e3b 131 physts.phy_full_duplex = 1;
donatien 2:1a87f74b8e3b 132 else
donatien 2:1a87f74b8e3b 133 physts.phy_full_duplex = 0;
donatien 0:8e01dca41002 134
donatien 2:1a87f74b8e3b 135 /* Configure 100MBit/10MBit mode. */
donatien 2:1a87f74b8e3b 136 if (linksts & DP8_SPEED10MBPS)
donatien 2:1a87f74b8e3b 137 physts.phy_speed_100mbs = 0;
donatien 2:1a87f74b8e3b 138 else
donatien 2:1a87f74b8e3b 139 physts.phy_speed_100mbs = 1;
donatien 2:1a87f74b8e3b 140
donatien 2:1a87f74b8e3b 141 if (physts.phy_speed_100mbs != olddphysts.phy_speed_100mbs) {
donatien 2:1a87f74b8e3b 142 changed = 1;
donatien 2:1a87f74b8e3b 143 if (physts.phy_speed_100mbs) {
donatien 2:1a87f74b8e3b 144 /* 100MBit mode. */
donatien 2:1a87f74b8e3b 145 lpc_emac_set_speed(1);
donatien 0:8e01dca41002 146
donatien 2:1a87f74b8e3b 147 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 100000000);
donatien 2:1a87f74b8e3b 148 }
donatien 2:1a87f74b8e3b 149 else {
donatien 2:1a87f74b8e3b 150 /* 10MBit mode. */
donatien 2:1a87f74b8e3b 151 lpc_emac_set_speed(0);
donatien 0:8e01dca41002 152
donatien 2:1a87f74b8e3b 153 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 10000000);
donatien 2:1a87f74b8e3b 154 }
donatien 2:1a87f74b8e3b 155
donatien 2:1a87f74b8e3b 156 olddphysts.phy_speed_100mbs = physts.phy_speed_100mbs;
donatien 2:1a87f74b8e3b 157 }
donatien 0:8e01dca41002 158
donatien 2:1a87f74b8e3b 159 if (physts.phy_full_duplex != olddphysts.phy_full_duplex) {
donatien 2:1a87f74b8e3b 160 changed = 1;
donatien 2:1a87f74b8e3b 161 if (physts.phy_full_duplex)
donatien 2:1a87f74b8e3b 162 lpc_emac_set_duplex(1);
donatien 2:1a87f74b8e3b 163 else
donatien 2:1a87f74b8e3b 164 lpc_emac_set_duplex(0);
donatien 0:8e01dca41002 165
donatien 2:1a87f74b8e3b 166 olddphysts.phy_full_duplex = physts.phy_full_duplex;
donatien 2:1a87f74b8e3b 167 }
donatien 0:8e01dca41002 168
donatien 2:1a87f74b8e3b 169 if (physts.phy_link_active != olddphysts.phy_link_active) {
donatien 2:1a87f74b8e3b 170 changed = 1;
donatien 2:1a87f74b8e3b 171 if (physts.phy_link_active)
donatien 2:1a87f74b8e3b 172 netif_set_link_up(netif);
donatien 2:1a87f74b8e3b 173 else
donatien 2:1a87f74b8e3b 174 netif_set_link_down(netif);
donatien 0:8e01dca41002 175
donatien 2:1a87f74b8e3b 176 olddphysts.phy_link_active = physts.phy_link_active;
donatien 2:1a87f74b8e3b 177 }
donatien 0:8e01dca41002 178
donatien 2:1a87f74b8e3b 179 return changed;
donatien 0:8e01dca41002 180 }
donatien 0:8e01dca41002 181
donatien 0:8e01dca41002 182 /** \brief Initialize the DP83848 PHY.
donatien 0:8e01dca41002 183 *
donatien 0:8e01dca41002 184 * This function initializes the DP83848 PHY. It will block until
donatien 0:8e01dca41002 185 * complete. This function is called as part of the EMAC driver
donatien 0:8e01dca41002 186 * initialization. Configuration of the PHY at startup is
donatien 0:8e01dca41002 187 * controlled by setting up configuration defines in lpc_phy.h.
donatien 0:8e01dca41002 188 *
donatien 0:8e01dca41002 189 * \param[in] netif NETIF structure
donatien 0:8e01dca41002 190 * \return ERR_OK if the setup was successful, otherwise ERR_TIMEOUT
donatien 0:8e01dca41002 191 */
donatien 0:8e01dca41002 192 err_t lpc_phy_init(struct netif *netif)
donatien 0:8e01dca41002 193 {
donatien 2:1a87f74b8e3b 194 u32_t tmp;
donatien 2:1a87f74b8e3b 195 s32_t i;
donatien 0:8e01dca41002 196
donatien 2:1a87f74b8e3b 197 physts.phy_speed_100mbs = olddphysts.phy_speed_100mbs = 2;
donatien 2:1a87f74b8e3b 198 physts.phy_full_duplex = olddphysts.phy_full_duplex = 2;
donatien 2:1a87f74b8e3b 199 physts.phy_link_active = olddphysts.phy_link_active = 2;
donatien 2:1a87f74b8e3b 200 phyustate = 0;
donatien 0:8e01dca41002 201
donatien 2:1a87f74b8e3b 202 /* Only first read and write are checked for failure */
donatien 2:1a87f74b8e3b 203 /* Put the DP83848C in reset mode and wait for completion */
donatien 2:1a87f74b8e3b 204 if (lpc_mii_write(DP8_BMCR_REG, DP8_RESET) != 0)
donatien 2:1a87f74b8e3b 205 return ERR_TIMEOUT;
donatien 2:1a87f74b8e3b 206 i = 400;
donatien 2:1a87f74b8e3b 207 while (i > 0) {
donatien 2:1a87f74b8e3b 208 osDelay(1); /* 1 ms */
donatien 2:1a87f74b8e3b 209 if (lpc_mii_read(DP8_BMCR_REG, &tmp) != 0)
donatien 2:1a87f74b8e3b 210 return ERR_TIMEOUT;
donatien 2:1a87f74b8e3b 211
donatien 2:1a87f74b8e3b 212 if (!(tmp & (DP8_RESET | DP8_POWER_DOWN)))
donatien 2:1a87f74b8e3b 213 i = -1;
donatien 2:1a87f74b8e3b 214 else
donatien 2:1a87f74b8e3b 215 i--;
donatien 2:1a87f74b8e3b 216 }
donatien 2:1a87f74b8e3b 217 /* Timeout? */
donatien 2:1a87f74b8e3b 218 if (i == 0)
donatien 2:1a87f74b8e3b 219 return ERR_TIMEOUT;
donatien 2:1a87f74b8e3b 220
donatien 2:1a87f74b8e3b 221 /* Setup link based on configuration options */
donatien 0:8e01dca41002 222 #if PHY_USE_AUTONEG==1
donatien 2:1a87f74b8e3b 223 tmp = DP8_AUTONEG;
donatien 0:8e01dca41002 224 #else
donatien 2:1a87f74b8e3b 225 tmp = 0;
donatien 0:8e01dca41002 226 #endif
donatien 0:8e01dca41002 227 #if PHY_USE_100MBS==1
donatien 2:1a87f74b8e3b 228 tmp |= DP8_SPEED_SELECT;
donatien 0:8e01dca41002 229 #endif
donatien 0:8e01dca41002 230 #if PHY_USE_FULL_DUPLEX==1
donatien 2:1a87f74b8e3b 231 tmp |= DP8_DUPLEX_MODE;
donatien 0:8e01dca41002 232 #endif
donatien 2:1a87f74b8e3b 233 lpc_mii_write(DP8_BMCR_REG, tmp);
donatien 0:8e01dca41002 234
donatien 2:1a87f74b8e3b 235 /* The link is not set active at this point, but will be detected
donatien 0:8e01dca41002 236 later */
donatien 0:8e01dca41002 237
donatien 2:1a87f74b8e3b 238 return ERR_OK;
donatien 0:8e01dca41002 239 }
donatien 0:8e01dca41002 240
donatien 0:8e01dca41002 241 /* Phy status update state machine */
donatien 0:8e01dca41002 242 s32_t lpc_phy_sts_sm(struct netif *netif)
donatien 0:8e01dca41002 243 {
donatien 2:1a87f74b8e3b 244 s32_t changed = 0;
donatien 0:8e01dca41002 245
donatien 2:1a87f74b8e3b 246 switch (phyustate) {
donatien 2:1a87f74b8e3b 247 default:
donatien 2:1a87f74b8e3b 248 case 0:
donatien 2:1a87f74b8e3b 249 /* Read BMSR to clear faults */
donatien 2:1a87f74b8e3b 250 lpc_mii_read_noblock(DP8_PHY_STAT_REG);
donatien 2:1a87f74b8e3b 251 phyustate = 1;
donatien 2:1a87f74b8e3b 252 break;
donatien 0:8e01dca41002 253
donatien 2:1a87f74b8e3b 254 case 1:
donatien 2:1a87f74b8e3b 255 /* Wait for read status state */
donatien 2:1a87f74b8e3b 256 if (!lpc_mii_is_busy()) {
donatien 2:1a87f74b8e3b 257 /* Update PHY status */
donatien 2:1a87f74b8e3b 258 changed = lpc_update_phy_sts(netif, lpc_mii_read_data());
donatien 2:1a87f74b8e3b 259 phyustate = 0;
donatien 2:1a87f74b8e3b 260 }
donatien 2:1a87f74b8e3b 261 break;
donatien 2:1a87f74b8e3b 262 }
donatien 0:8e01dca41002 263
donatien 2:1a87f74b8e3b 264 return changed;
donatien 0:8e01dca41002 265 }
donatien 0:8e01dca41002 266
donatien 2:1a87f74b8e3b 267 #endif
donatien 2:1a87f74b8e3b 268
donatien 2:1a87f74b8e3b 269 /**
donatien 2:1a87f74b8e3b 270 * @}
donatien 0:8e01dca41002 271 */
donatien 0:8e01dca41002 272
donatien 0:8e01dca41002 273 /* --------------------------------- End Of File ------------------------------ */