Adapted to Lora Semtech + Nucleo

Dependencies:   DebugLib

Dependents:   LoRaWAN-lmic-app LoRaWAN-lmic-app LoRaWAN-test-10secs LoRaPersonalizedDeviceForEverynet ... more

Fork of lwip_ppp_ethernet by Donatien Garnier

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 ------------------------------ */