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:
Thu May 24 15:53:48 2012 +0000
Revision:
0:8e01dca41002
Child:
2:1a87f74b8e3b
Merge with Emilio's LwIp

Who changed what in which revision?

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