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