mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Thu Sep 18 14:00:17 2014 +0100
Revision:
324:406fd2029f23
Parent:
168:cf9372ac0a74
Synchronized with git revision a73f28e6fbca9559fbed2726410eeb4c0534a4a5

Full URL: https://github.com/mbedmicro/mbed/commit/a73f28e6fbca9559fbed2726410eeb4c0534a4a5/

Extended #476, which does not break ethernet for K64F

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 324:406fd2029f23 33 #ifndef MBED_NO_ENET
mbed_official 324:406fd2029f23 34
mbed_official 168:cf9372ac0a74 35 /*******************************************************************************
mbed_official 168:cf9372ac0a74 36 * Variables
mbed_official 168:cf9372ac0a74 37 ******************************************************************************/
mbed_official 168:cf9372ac0a74 38
mbed_official 168:cf9372ac0a74 39 /*! @brief Define Phy API structure for MAC application*/
mbed_official 168:cf9372ac0a74 40 const enet_phy_api_t g_enetPhyApi =
mbed_official 168:cf9372ac0a74 41 {
mbed_official 168:cf9372ac0a74 42 phy_auto_discover,
mbed_official 168:cf9372ac0a74 43 phy_init,
mbed_official 168:cf9372ac0a74 44 phy_get_link_speed,
mbed_official 168:cf9372ac0a74 45 phy_get_link_status,
mbed_official 168:cf9372ac0a74 46 phy_get_link_duplex,
mbed_official 168:cf9372ac0a74 47 };
mbed_official 168:cf9372ac0a74 48 /*******************************************************************************
mbed_official 168:cf9372ac0a74 49 * Code
mbed_official 168:cf9372ac0a74 50 ******************************************************************************/
mbed_official 168:cf9372ac0a74 51 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 52 *
mbed_official 168:cf9372ac0a74 53 * Function Name: phy_init
mbed_official 168:cf9372ac0a74 54 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 55 * Description: Initialize Phy.
mbed_official 168:cf9372ac0a74 56 * This interface provides initialize functions for Phy, This is called by enet
mbed_official 168:cf9372ac0a74 57 * initialize function. Phy is usually deault auto-negotiation. so there is no
mbed_official 168:cf9372ac0a74 58 * need to do the intialize about this. we just need to check the loop mode.
mbed_official 168:cf9372ac0a74 59 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 60 uint32_t phy_init(enet_dev_if_t * enetIfPtr)
mbed_official 168:cf9372ac0a74 61 {
mbed_official 168:cf9372ac0a74 62 uint32_t data;
mbed_official 168:cf9372ac0a74 63 uint32_t counter;
mbed_official 168:cf9372ac0a74 64 uint32_t result;
mbed_official 168:cf9372ac0a74 65
mbed_official 168:cf9372ac0a74 66 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 67 if (!enetIfPtr)
mbed_official 168:cf9372ac0a74 68 {
mbed_official 168:cf9372ac0a74 69 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 70 }
mbed_official 168:cf9372ac0a74 71
mbed_official 168:cf9372ac0a74 72 /* Reset Phy*/
mbed_official 168:cf9372ac0a74 73 if ((result = (enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 74 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhySR,&data))) == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 75 {
mbed_official 168:cf9372ac0a74 76 if ((data & kEnetPhyAutoNegAble) != 0)
mbed_official 168:cf9372ac0a74 77 {
mbed_official 168:cf9372ac0a74 78 /* Set Autonegotiation*/
mbed_official 168:cf9372ac0a74 79 enetIfPtr->macApiPtr->enet_mii_write(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 80 enetIfPtr->phyCfgPtr->phyAddr, kEnetPhyCR, kEnetPhyAutoNeg);
mbed_official 168:cf9372ac0a74 81 for (counter = 0; counter < kPhyTimeout; counter++)
mbed_official 168:cf9372ac0a74 82 {
mbed_official 168:cf9372ac0a74 83 if (enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 84 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhySR,&data)== kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 85 {
mbed_official 168:cf9372ac0a74 86 if ((data & kEnetPhyAutoNegComplete) != 0)
mbed_official 168:cf9372ac0a74 87 {
mbed_official 168:cf9372ac0a74 88 break;
mbed_official 168:cf9372ac0a74 89 }
mbed_official 168:cf9372ac0a74 90 }
mbed_official 168:cf9372ac0a74 91 }
mbed_official 168:cf9372ac0a74 92
mbed_official 168:cf9372ac0a74 93 if (counter == kPhyTimeout)
mbed_official 168:cf9372ac0a74 94 {
mbed_official 168:cf9372ac0a74 95 return kStatus_PHY_TimeOut;
mbed_official 168:cf9372ac0a74 96 }
mbed_official 168:cf9372ac0a74 97 }
mbed_official 168:cf9372ac0a74 98 }
mbed_official 168:cf9372ac0a74 99
mbed_official 168:cf9372ac0a74 100 if (enetIfPtr->phyCfgPtr->isLoopEnabled)
mbed_official 168:cf9372ac0a74 101 {
mbed_official 168:cf9372ac0a74 102 /* First read the current status in control register*/
mbed_official 168:cf9372ac0a74 103 if (enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 104 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCR,&data))
mbed_official 168:cf9372ac0a74 105 {
mbed_official 168:cf9372ac0a74 106 result = enetIfPtr->macApiPtr->enet_mii_write(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 107 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCR,(data|kEnetPhyLoop));
mbed_official 168:cf9372ac0a74 108 }
mbed_official 168:cf9372ac0a74 109 }
mbed_official 168:cf9372ac0a74 110
mbed_official 168:cf9372ac0a74 111 return result;
mbed_official 168:cf9372ac0a74 112 }
mbed_official 168:cf9372ac0a74 113
mbed_official 168:cf9372ac0a74 114 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 115 *
mbed_official 168:cf9372ac0a74 116 * Function Name: phy_auto_discover
mbed_official 168:cf9372ac0a74 117 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 118 * Description: Phy address auto discover.
mbed_official 168:cf9372ac0a74 119 * This function provides a interface to get phy address using phy address auto
mbed_official 168:cf9372ac0a74 120 * discovering, this interface is used when the phy address is unknown.
mbed_official 168:cf9372ac0a74 121 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 122 uint32_t phy_auto_discover(enet_dev_if_t * enetIfPtr)
mbed_official 168:cf9372ac0a74 123 {
mbed_official 168:cf9372ac0a74 124 uint32_t addrIdx,data;
mbed_official 168:cf9372ac0a74 125 uint32_t result = kStatus_PHY_Fail;
mbed_official 168:cf9372ac0a74 126
mbed_official 168:cf9372ac0a74 127 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 128 if (!enetIfPtr)
mbed_official 168:cf9372ac0a74 129 {
mbed_official 168:cf9372ac0a74 130 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 131 }
mbed_official 168:cf9372ac0a74 132
mbed_official 168:cf9372ac0a74 133 for (addrIdx = 0; addrIdx < 32; addrIdx++)
mbed_official 168:cf9372ac0a74 134 {
mbed_official 168:cf9372ac0a74 135 enetIfPtr->phyCfgPtr->phyAddr = addrIdx;
mbed_official 168:cf9372ac0a74 136 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 137 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyId1,&data);
mbed_official 168:cf9372ac0a74 138 if ((result == kStatus_PHY_Success) && (data != 0) && (data != 0xffff) )
mbed_official 168:cf9372ac0a74 139 {
mbed_official 168:cf9372ac0a74 140 return kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 141 }
mbed_official 168:cf9372ac0a74 142 }
mbed_official 168:cf9372ac0a74 143
mbed_official 168:cf9372ac0a74 144 return result;
mbed_official 168:cf9372ac0a74 145 }
mbed_official 168:cf9372ac0a74 146
mbed_official 168:cf9372ac0a74 147 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 148 *
mbed_official 168:cf9372ac0a74 149 * Function Name: phy_get_link_speed
mbed_official 168:cf9372ac0a74 150 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 151 * Description: Get phy link speed.
mbed_official 168:cf9372ac0a74 152 * This function provides a interface to get link speed.
mbed_official 168:cf9372ac0a74 153 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 154 uint32_t phy_get_link_speed(enet_dev_if_t * enetIfPtr, enet_phy_speed_t *status)
mbed_official 168:cf9372ac0a74 155 {
mbed_official 168:cf9372ac0a74 156 uint32_t result = kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 157 uint32_t data;
mbed_official 168:cf9372ac0a74 158
mbed_official 168:cf9372ac0a74 159 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 160 if ((!enetIfPtr) || (!status))
mbed_official 168:cf9372ac0a74 161 {
mbed_official 168:cf9372ac0a74 162 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 163 }
mbed_official 168:cf9372ac0a74 164
mbed_official 168:cf9372ac0a74 165 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 166 enetIfPtr->phyCfgPtr->phyAddr, kEnetPhyCt2,&data);
mbed_official 168:cf9372ac0a74 167 if (result == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 168 {
mbed_official 168:cf9372ac0a74 169 data &= kEnetPhySpeedDulpexMask;
mbed_official 168:cf9372ac0a74 170 if ((kEnetPhy100HalfDuplex == data) || (kEnetPhy100FullDuplex == data))
mbed_official 168:cf9372ac0a74 171 {
mbed_official 168:cf9372ac0a74 172 *status = kEnetSpeed100M;
mbed_official 168:cf9372ac0a74 173 }
mbed_official 168:cf9372ac0a74 174 else
mbed_official 168:cf9372ac0a74 175 {
mbed_official 168:cf9372ac0a74 176 *status = kEnetSpeed10M;
mbed_official 168:cf9372ac0a74 177 }
mbed_official 168:cf9372ac0a74 178 }
mbed_official 168:cf9372ac0a74 179
mbed_official 168:cf9372ac0a74 180 return result;
mbed_official 168:cf9372ac0a74 181 }
mbed_official 168:cf9372ac0a74 182
mbed_official 168:cf9372ac0a74 183 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 184 *
mbed_official 168:cf9372ac0a74 185 * Function Name: phy_get_link_status
mbed_official 168:cf9372ac0a74 186 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 187 * Description: Get phy link status.
mbed_official 168:cf9372ac0a74 188 * This function provides a interface to get link status to see if the link
mbed_official 168:cf9372ac0a74 189 * status is on or off.
mbed_official 168:cf9372ac0a74 190 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 191 uint32_t phy_get_link_status(enet_dev_if_t * enetIfPtr, bool *status)
mbed_official 168:cf9372ac0a74 192 {
mbed_official 168:cf9372ac0a74 193 uint32_t result = kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 194 uint32_t data;
mbed_official 168:cf9372ac0a74 195
mbed_official 168:cf9372ac0a74 196 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 197 if ((!enetIfPtr) || (!status))
mbed_official 168:cf9372ac0a74 198 {
mbed_official 168:cf9372ac0a74 199 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 200 }
mbed_official 168:cf9372ac0a74 201
mbed_official 168:cf9372ac0a74 202 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 203 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCR,&data);
mbed_official 168:cf9372ac0a74 204 if ((result == kStatus_PHY_Success) && (!(data & kEnetPhyReset)))
mbed_official 168:cf9372ac0a74 205 {
mbed_official 168:cf9372ac0a74 206 data = 0;
mbed_official 168:cf9372ac0a74 207 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 208 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhySR, &data);
mbed_official 168:cf9372ac0a74 209 if (result == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 210 {
mbed_official 168:cf9372ac0a74 211 if (!(kEnetPhyLinkStatus & data))
mbed_official 168:cf9372ac0a74 212 {
mbed_official 168:cf9372ac0a74 213 *status = false;
mbed_official 168:cf9372ac0a74 214 }
mbed_official 168:cf9372ac0a74 215 else
mbed_official 168:cf9372ac0a74 216 {
mbed_official 168:cf9372ac0a74 217 *status = true;
mbed_official 168:cf9372ac0a74 218 }
mbed_official 168:cf9372ac0a74 219 }
mbed_official 168:cf9372ac0a74 220 }
mbed_official 168:cf9372ac0a74 221
mbed_official 168:cf9372ac0a74 222 return result;
mbed_official 168:cf9372ac0a74 223 }
mbed_official 168:cf9372ac0a74 224
mbed_official 168:cf9372ac0a74 225 /*FUNCTION****************************************************************
mbed_official 168:cf9372ac0a74 226 *
mbed_official 168:cf9372ac0a74 227 * Function Name: phy_get_link_duplex
mbed_official 168:cf9372ac0a74 228 * Return Value: The execution status.
mbed_official 168:cf9372ac0a74 229 * Description: Get phy link duplex.
mbed_official 168:cf9372ac0a74 230 * This function provides a interface to get link duplex to see if the link
mbed_official 168:cf9372ac0a74 231 * duplex is full or half.
mbed_official 168:cf9372ac0a74 232 *END*********************************************************************/
mbed_official 168:cf9372ac0a74 233 uint32_t phy_get_link_duplex(enet_dev_if_t * enetIfPtr, enet_phy_duplex_t *status)
mbed_official 168:cf9372ac0a74 234 {
mbed_official 168:cf9372ac0a74 235 uint32_t result = kStatus_PHY_Success;
mbed_official 168:cf9372ac0a74 236 uint32_t data;
mbed_official 168:cf9372ac0a74 237
mbed_official 168:cf9372ac0a74 238 /* Check input parameters*/
mbed_official 168:cf9372ac0a74 239 if ((!enetIfPtr) || (!status))
mbed_official 168:cf9372ac0a74 240 {
mbed_official 168:cf9372ac0a74 241 return kStatus_PHY_InvaildInput;
mbed_official 168:cf9372ac0a74 242 }
mbed_official 168:cf9372ac0a74 243
mbed_official 168:cf9372ac0a74 244 result = enetIfPtr->macApiPtr->enet_mii_read(enetIfPtr->deviceNumber,
mbed_official 168:cf9372ac0a74 245 enetIfPtr->phyCfgPtr->phyAddr,kEnetPhyCt2,&data);
mbed_official 168:cf9372ac0a74 246 if (result == kStatus_PHY_Success)
mbed_official 168:cf9372ac0a74 247 {
mbed_official 168:cf9372ac0a74 248 data &= kEnetPhySpeedDulpexMask;
mbed_official 168:cf9372ac0a74 249 if ((kEnetPhy10FullDuplex == data) || (kEnetPhy100FullDuplex == data))
mbed_official 168:cf9372ac0a74 250 {
mbed_official 168:cf9372ac0a74 251 *status = kEnetFullDuplex;
mbed_official 168:cf9372ac0a74 252 }
mbed_official 168:cf9372ac0a74 253 else
mbed_official 168:cf9372ac0a74 254 {
mbed_official 168:cf9372ac0a74 255 *status = kEnetHalfDuplex;
mbed_official 168:cf9372ac0a74 256 }
mbed_official 168:cf9372ac0a74 257 }
mbed_official 168:cf9372ac0a74 258
mbed_official 168:cf9372ac0a74 259 return result;
mbed_official 168:cf9372ac0a74 260 }
mbed_official 168:cf9372ac0a74 261
mbed_official 324:406fd2029f23 262 #endif
mbed_official 168:cf9372ac0a74 263
mbed_official 168:cf9372ac0a74 264 /*******************************************************************************
mbed_official 168:cf9372ac0a74 265 * EOF
mbed_official 168:cf9372ac0a74 266 ******************************************************************************/
mbed_official 168:cf9372ac0a74 267