mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Apr 24 10:45:06 2014 +0100
Revision:
168:cf9372ac0a74
Synchronized with git revision 94fd2228fb4a382fb98d0115f6691fc0b659eea8

Full URL: https://github.com/mbedmicro/mbed/commit/94fd2228fb4a382fb98d0115f6691fc0b659eea8/

Currently NET_7 (HttpClient test) and NET_8 (NTP test) fail for
unknown reasons.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 168:cf9372ac0a74 1 /*
mbed_official 168:cf9372ac0a74 2 * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
mbed_official 168:cf9372ac0a74 3 * All rights reserved.
mbed_official 168:cf9372ac0a74 4 *
mbed_official 168:cf9372ac0a74 5 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 168:cf9372ac0a74 6 * are permitted provided that the following conditions are met:
mbed_official 168:cf9372ac0a74 7 *
mbed_official 168:cf9372ac0a74 8 * o Redistributions of source code must retain the above copyright notice, this list
mbed_official 168:cf9372ac0a74 9 * of conditions and the following disclaimer.
mbed_official 168:cf9372ac0a74 10 *
mbed_official 168:cf9372ac0a74 11 * o Redistributions in binary form must reproduce the above copyright notice, this
mbed_official 168:cf9372ac0a74 12 * list of conditions and the following disclaimer in the documentation and/or
mbed_official 168:cf9372ac0a74 13 * other materials provided with the distribution.
mbed_official 168:cf9372ac0a74 14 *
mbed_official 168:cf9372ac0a74 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
mbed_official 168:cf9372ac0a74 16 * contributors may be used to endorse or promote products derived from this
mbed_official 168:cf9372ac0a74 17 * software without specific prior written permission.
mbed_official 168:cf9372ac0a74 18 *
mbed_official 168:cf9372ac0a74 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
mbed_official 168:cf9372ac0a74 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
mbed_official 168:cf9372ac0a74 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 168:cf9372ac0a74 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
mbed_official 168:cf9372ac0a74 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
mbed_official 168:cf9372ac0a74 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
mbed_official 168:cf9372ac0a74 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
mbed_official 168:cf9372ac0a74 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
mbed_official 168:cf9372ac0a74 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
mbed_official 168:cf9372ac0a74 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 168:cf9372ac0a74 29 */
mbed_official 168:cf9372ac0a74 30
mbed_official 168:cf9372ac0a74 31 #include "fsl_phy_driver.h"
mbed_official 168:cf9372ac0a74 32
mbed_official 168:cf9372ac0a74 33 /*******************************************************************************
mbed_official 168:cf9372ac0a74 34 * Variables
mbed_official 168:cf9372ac0a74 35 ******************************************************************************/
mbed_official 168:cf9372ac0a74 36
mbed_official 168:cf9372ac0a74 37 /*! @brief Define Phy API structure for MAC application*/
mbed_official 168:cf9372ac0a74 38 const enet_phy_api_t g_enetPhyApi =
mbed_official 168:cf9372ac0a74 39 {
mbed_official 168:cf9372ac0a74 40 phy_auto_discover,
mbed_official 168:cf9372ac0a74 41 phy_init,
mbed_official 168:cf9372ac0a74 42 phy_get_link_speed,
mbed_official 168:cf9372ac0a74 43 phy_get_link_status,
mbed_official 168:cf9372ac0a74 44 phy_get_link_duplex,
mbed_official 168:cf9372ac0a74 45 };
mbed_official 168:cf9372ac0a74 46 /*******************************************************************************
mbed_official 168:cf9372ac0a74 47 * Code
mbed_official 168:cf9372ac0a74 48 ******************************************************************************/
mbed_official 168:cf9372ac0a74 49 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 50 *
mbed_official 168:cf9372ac0a74 51 * Function Name: phy_init
mbed_official 168:cf9372ac0a74 52 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 53 * Description: Initialize Phy.
mbed_official 168:cf9372ac0a74 54 * This interface provides initialize functions for Phy, This is called by enet
mbed_official 168:cf9372ac0a74 55 * initialize function. Phy is usually deault auto-negotiation. so there is no
mbed_official 168:cf9372ac0a74 56 * need to do the intialize about this. we just need to check the loop mode.
mbed_official 168:cf9372ac0a74 57 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 58 uint32_t phy_init(enet_dev_if_t * enetIfPtr)
mbed_official 168:cf9372ac0a74 59 {
mbed_official 168:cf9372ac0a74 60 uint32_t data;
mbed_official 168:cf9372ac0a74 61 uint32_t counter;
mbed_official 168:cf9372ac0a74 62 uint32_t result;
mbed_official 168:cf9372ac0a74 63
mbed_official 168:cf9372ac0a74 64 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 65 if (!enetIfPtr)
mbed_official 168:cf9372ac0a74 66 {
mbed_official 168:cf9372ac0a74 67 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 68 }
mbed_official 168:cf9372ac0a74 69
mbed_official 168:cf9372ac0a74 70 /* Reset Phy*/
mbed_official 168:cf9372ac0a74 71 if ((result = (enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 72 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhySR,&data))) == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 73 {
mbed_official 168:cf9372ac0a74 74 if ((data & kEnetPhyAutoNegAble) != 0)
mbed_official 168:cf9372ac0a74 75 {
mbed_official 168:cf9372ac0a74 76 /* Set Autonegotiation*/
mbed_official 168:cf9372ac0a74 77 enetIfPtr->macApiPtr->enet_mii_write(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 78 enetIfPtr->phyCfgPtr->phyAddr, kEnetPhyCR, kEnetPhyAutoNeg);
mbed_official 168:cf9372ac0a74 79 for (counter = 0; counter < kPhyTimeout; counter++)
mbed_official 168:cf9372ac0a74 80 {
mbed_official 168:cf9372ac0a74 81 if (enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 82 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhySR,&data)== kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 83 {
mbed_official 168:cf9372ac0a74 84 if ((data & kEnetPhyAutoNegComplete) != 0)
mbed_official 168:cf9372ac0a74 85 {
mbed_official 168:cf9372ac0a74 86 break;
mbed_official 168:cf9372ac0a74 87 }
mbed_official 168:cf9372ac0a74 88 }
mbed_official 168:cf9372ac0a74 89 }
mbed_official 168:cf9372ac0a74 90
mbed_official 168:cf9372ac0a74 91 if (counter == kPhyTimeout)
mbed_official 168:cf9372ac0a74 92 {
mbed_official 168:cf9372ac0a74 93 return kStatus_PHY_TimeOut;
mbed_official 168:cf9372ac0a74 94 }
mbed_official 168:cf9372ac0a74 95 }
mbed_official 168:cf9372ac0a74 96 }
mbed_official 168:cf9372ac0a74 97
mbed_official 168:cf9372ac0a74 98 if (enetIfPtr->phyCfgPtr->isLoopEnabled)
mbed_official 168:cf9372ac0a74 99 {
mbed_official 168:cf9372ac0a74 100 /* First read the current status in control register*/
mbed_official 168:cf9372ac0a74 101 if (enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 102 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCR,&data))
mbed_official 168:cf9372ac0a74 103 {
mbed_official 168:cf9372ac0a74 104 result = enetIfPtr->macApiPtr->enet_mii_write(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 105 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCR,(data|kEnetPhyLoop));
mbed_official 168:cf9372ac0a74 106 }
mbed_official 168:cf9372ac0a74 107 }
mbed_official 168:cf9372ac0a74 108
mbed_official 168:cf9372ac0a74 109 return result;
mbed_official 168:cf9372ac0a74 110 }
mbed_official 168:cf9372ac0a74 111
mbed_official 168:cf9372ac0a74 112 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 113 *
mbed_official 168:cf9372ac0a74 114 * Function Name: phy_auto_discover
mbed_official 168:cf9372ac0a74 115 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 116 * Description: Phy address auto discover.
mbed_official 168:cf9372ac0a74 117 * This function provides a interface to get phy address using phy address auto
mbed_official 168:cf9372ac0a74 118 * discovering, this interface is used when the phy address is unknown.
mbed_official 168:cf9372ac0a74 119 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 120 uint32_t phy_auto_discover(enet_dev_if_t * enetIfPtr)
mbed_official 168:cf9372ac0a74 121 {
mbed_official 168:cf9372ac0a74 122 uint32_t addrIdx,data;
mbed_official 168:cf9372ac0a74 123 uint32_t result = kStatus_PHY_Fail;
mbed_official 168:cf9372ac0a74 124
mbed_official 168:cf9372ac0a74 125 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 126 if (!enetIfPtr)
mbed_official 168:cf9372ac0a74 127 {
mbed_official 168:cf9372ac0a74 128 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 129 }
mbed_official 168:cf9372ac0a74 130
mbed_official 168:cf9372ac0a74 131 for (addrIdx = 0; addrIdx < 32; addrIdx++)
mbed_official 168:cf9372ac0a74 132 {
mbed_official 168:cf9372ac0a74 133 enetIfPtr->phyCfgPtr->phyAddr = addrIdx;
mbed_official 168:cf9372ac0a74 134 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 135 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyId1,&data);
mbed_official 168:cf9372ac0a74 136 if ((result == kStatus_PHY_Success) && (data != 0) && (data != 0xffff) )
mbed_official 168:cf9372ac0a74 137 {
mbed_official 168:cf9372ac0a74 138 return kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 139 }
mbed_official 168:cf9372ac0a74 140 }
mbed_official 168:cf9372ac0a74 141
mbed_official 168:cf9372ac0a74 142 return result;
mbed_official 168:cf9372ac0a74 143 }
mbed_official 168:cf9372ac0a74 144
mbed_official 168:cf9372ac0a74 145 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 146 *
mbed_official 168:cf9372ac0a74 147 * Function Name: phy_get_link_speed
mbed_official 168:cf9372ac0a74 148 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 149 * Description: Get phy link speed.
mbed_official 168:cf9372ac0a74 150 * This function provides a interface to get link speed.
mbed_official 168:cf9372ac0a74 151 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 152 uint32_t phy_get_link_speed(enet_dev_if_t * enetIfPtr, enet_phy_speed_t *status)
mbed_official 168:cf9372ac0a74 153 {
mbed_official 168:cf9372ac0a74 154 uint32_t result = kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 155 uint32_t data;
mbed_official 168:cf9372ac0a74 156
mbed_official 168:cf9372ac0a74 157 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 158 if ((!enetIfPtr) || (!status))
mbed_official 168:cf9372ac0a74 159 {
mbed_official 168:cf9372ac0a74 160 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 161 }
mbed_official 168:cf9372ac0a74 162
mbed_official 168:cf9372ac0a74 163 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 164 enetIfPtr->phyCfgPtr->phyAddr, kEnetPhyCt2,&data);
mbed_official 168:cf9372ac0a74 165 if (result == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 166 {
mbed_official 168:cf9372ac0a74 167 data &= kEnetPhySpeedDulpexMask;
mbed_official 168:cf9372ac0a74 168 if ((kEnetPhy100HalfDuplex == data) || (kEnetPhy100FullDuplex == data))
mbed_official 168:cf9372ac0a74 169 {
mbed_official 168:cf9372ac0a74 170 *status = kEnetSpeed100M;
mbed_official 168:cf9372ac0a74 171 }
mbed_official 168:cf9372ac0a74 172 else
mbed_official 168:cf9372ac0a74 173 {
mbed_official 168:cf9372ac0a74 174 *status = kEnetSpeed10M;
mbed_official 168:cf9372ac0a74 175 }
mbed_official 168:cf9372ac0a74 176 }
mbed_official 168:cf9372ac0a74 177
mbed_official 168:cf9372ac0a74 178 return result;
mbed_official 168:cf9372ac0a74 179 }
mbed_official 168:cf9372ac0a74 180
mbed_official 168:cf9372ac0a74 181 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 182 *
mbed_official 168:cf9372ac0a74 183 * Function Name: phy_get_link_status
mbed_official 168:cf9372ac0a74 184 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 185 * Description: Get phy link status.
mbed_official 168:cf9372ac0a74 186 * This function provides a interface to get link status to see if the link
mbed_official 168:cf9372ac0a74 187 * status is on or off.
mbed_official 168:cf9372ac0a74 188 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 189 uint32_t phy_get_link_status(enet_dev_if_t * enetIfPtr, bool *status)
mbed_official 168:cf9372ac0a74 190 {
mbed_official 168:cf9372ac0a74 191 uint32_t result = kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 192 uint32_t data;
mbed_official 168:cf9372ac0a74 193
mbed_official 168:cf9372ac0a74 194 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 195 if ((!enetIfPtr) || (!status))
mbed_official 168:cf9372ac0a74 196 {
mbed_official 168:cf9372ac0a74 197 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 198 }
mbed_official 168:cf9372ac0a74 199
mbed_official 168:cf9372ac0a74 200 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 201 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCR,&data);
mbed_official 168:cf9372ac0a74 202 if ((result == kStatus_PHY_Success) && (!(data & kEnetPhyReset)))
mbed_official 168:cf9372ac0a74 203 {
mbed_official 168:cf9372ac0a74 204 data = 0;
mbed_official 168:cf9372ac0a74 205 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 206 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhySR, &data);
mbed_official 168:cf9372ac0a74 207 if (result == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 208 {
mbed_official 168:cf9372ac0a74 209 if (!(kEnetPhyLinkStatus & data))
mbed_official 168:cf9372ac0a74 210 {
mbed_official 168:cf9372ac0a74 211 *status = false;
mbed_official 168:cf9372ac0a74 212 }
mbed_official 168:cf9372ac0a74 213 else
mbed_official 168:cf9372ac0a74 214 {
mbed_official 168:cf9372ac0a74 215 *status = true;
mbed_official 168:cf9372ac0a74 216 }
mbed_official 168:cf9372ac0a74 217 }
mbed_official 168:cf9372ac0a74 218 }
mbed_official 168:cf9372ac0a74 219
mbed_official 168:cf9372ac0a74 220 return result;
mbed_official 168:cf9372ac0a74 221 }
mbed_official 168:cf9372ac0a74 222
mbed_official 168:cf9372ac0a74 223 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 224 *
mbed_official 168:cf9372ac0a74 225 * Function Name: phy_get_link_duplex
mbed_official 168:cf9372ac0a74 226 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 227 * Description: Get phy link duplex.
mbed_official 168:cf9372ac0a74 228 * This function provides a interface to get link duplex to see if the link
mbed_official 168:cf9372ac0a74 229 * duplex is full or half.
mbed_official 168:cf9372ac0a74 230 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 231 uint32_t phy_get_link_duplex(enet_dev_if_t * enetIfPtr, enet_phy_duplex_t *status)
mbed_official 168:cf9372ac0a74 232 {
mbed_official 168:cf9372ac0a74 233 uint32_t result = kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 234 uint32_t data;
mbed_official 168:cf9372ac0a74 235
mbed_official 168:cf9372ac0a74 236 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 237 if ((!enetIfPtr) || (!status))
mbed_official 168:cf9372ac0a74 238 {
mbed_official 168:cf9372ac0a74 239 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 240 }
mbed_official 168:cf9372ac0a74 241
mbed_official 168:cf9372ac0a74 242 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 243 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCt2,&data);
mbed_official 168:cf9372ac0a74 244 if (result == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 245 {
mbed_official 168:cf9372ac0a74 246 data &= kEnetPhySpeedDulpexMask;
mbed_official 168:cf9372ac0a74 247 if ((kEnetPhy10FullDuplex == data) || (kEnetPhy100FullDuplex == data))
mbed_official 168:cf9372ac0a74 248 {
mbed_official 168:cf9372ac0a74 249 *status = kEnetFullDuplex;
mbed_official 168:cf9372ac0a74 250 }
mbed_official 168:cf9372ac0a74 251 else
mbed_official 168:cf9372ac0a74 252 {
mbed_official 168:cf9372ac0a74 253 *status = kEnetHalfDuplex;
mbed_official 168:cf9372ac0a74 254 }
mbed_official 168:cf9372ac0a74 255 }
mbed_official 168:cf9372ac0a74 256
mbed_official 168:cf9372ac0a74 257 return result;
mbed_official 168:cf9372ac0a74 258 }
mbed_official 168:cf9372ac0a74 259
mbed_official 168:cf9372ac0a74 260
mbed_official 168:cf9372ac0a74 261 /*******************************************************************************
mbed_official 168:cf9372ac0a74 262 * EOF
mbed_official 168:cf9372ac0a74 263 ******************************************************************************/
mbed_official 168:cf9372ac0a74 264