Ethernet link status for the K64F

Dependents:   JRO_CR2 K64F_EthLink_HelloWorld frdm_test JRO_DDSv2

Simple K64F technique to determine if the Ethernet PHY link is up or down. The routine utilizes the Ethernet MII interface to gain access to the Ethernet PHY which contains the actual link status.

I wrote this because the mbed Ethernet function does not recognize its own "int link();" function with the K64F.

Committer:
loopsva
Date:
Thu May 19 17:20:55 2016 +0000
Revision:
4:9d2a4dc03170
Parent:
3:fbd2336e1193
Changed from:
;
; uint32_t k64f_mdio_reg = ENET_EIR;
;
; To:
;
; uint32_t k64f_mdio_reg = ENET->EIR;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 3:fbd2336e1193 1 #if defined(TARGET_K64F)
loopsva 0:a447869e1046 2 #include "k64f_EthLink.h"
loopsva 0:a447869e1046 3
loopsva 0:a447869e1046 4 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a447869e1046 5 // Constructor
loopsva 0:a447869e1046 6
loopsva 0:a447869e1046 7 k64fEthLink::k64fEthLink() {
loopsva 0:a447869e1046 8 }
loopsva 0:a447869e1046 9
loopsva 0:a447869e1046 10 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:a447869e1046 11 // Get Ethernet link status on the K64F
loopsva 4:9d2a4dc03170 12 /*
loopsva 0:a447869e1046 13 int k64fEthLink::GetELink() {
loopsva 0:a447869e1046 14 int mdio_timer = 0;
loopsva 0:a447869e1046 15 uint32_t k64f_mdio_reg = ENET_EIR;
loopsva 0:a447869e1046 16
loopsva 0:a447869e1046 17 //wait for MDIO interface to be ready
loopsva 0:a447869e1046 18 do {
loopsva 0:a447869e1046 19 k64f_mdio_reg = ENET_EIR;
loopsva 2:59166b94dfd0 20 #ifdef RTOS_H
loopsva 2:59166b94dfd0 21 Thread::wait(1);
loopsva 2:59166b94dfd0 22 #else
loopsva 2:59166b94dfd0 23 wait_ms(1);
loopsva 2:59166b94dfd0 24 #endif
loopsva 0:a447869e1046 25 mdio_timer++;
loopsva 1:cbd7e77b6e38 26 } while(((k64f_mdio_reg & MDIO_MII_READY_BIT) == 0) && (mdio_timer < 300));
loopsva 1:cbd7e77b6e38 27 if(mdio_timer > 298) { //average is about 122mS
loopsva 0:a447869e1046 28 return(MDIO_TIMEOUT); //timeout error
loopsva 0:a447869e1046 29 }
loopsva 0:a447869e1046 30
loopsva 0:a447869e1046 31 //get Basic Status Register
loopsva 0:a447869e1046 32 ENET_MMFR = MDIO_GET_LINK_REG;
loopsva 0:a447869e1046 33 wait_us(35); //20 is absolute minimum!!
loopsva 0:a447869e1046 34 k64f_mdio_reg = ENET_MMFR; //get the phy result
loopsva 0:a447869e1046 35 if(k64f_mdio_reg & MDIO_MII_LINK_BITS) return(PHY_UP);
loopsva 0:a447869e1046 36 return(PHY_DOWN);
loopsva 0:a447869e1046 37 }
loopsva 4:9d2a4dc03170 38 */
loopsva 4:9d2a4dc03170 39 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 4:9d2a4dc03170 40 // Get Ethernet link status on the K64F
loopsva 4:9d2a4dc03170 41 /*
loopsva 4:9d2a4dc03170 42 ENET_Type miiSTR = {};
loopsva 4:9d2a4dc03170 43
loopsva 4:9d2a4dc03170 44 int k64fEthLink::GetELink() {
loopsva 4:9d2a4dc03170 45 int mdio_timer = 0;
loopsva 4:9d2a4dc03170 46 uint32_t k64f_mdio_reg = miiSTR.EIR;
loopsva 4:9d2a4dc03170 47
loopsva 4:9d2a4dc03170 48 //wait for MDIO interface to be ready
loopsva 4:9d2a4dc03170 49 do {
loopsva 4:9d2a4dc03170 50 k64f_mdio_reg = miiSTR.EIR;
loopsva 4:9d2a4dc03170 51 #ifdef RTOS_H
loopsva 4:9d2a4dc03170 52 Thread::wait(1);
loopsva 4:9d2a4dc03170 53 #else
loopsva 4:9d2a4dc03170 54 wait_ms(1);
loopsva 4:9d2a4dc03170 55 #endif
loopsva 4:9d2a4dc03170 56 mdio_timer++;
loopsva 4:9d2a4dc03170 57 } while(((k64f_mdio_reg & MDIO_MII_READY_BIT) == 0) && (mdio_timer < 300));
loopsva 4:9d2a4dc03170 58 if(mdio_timer > 298) { //average is about 122mS
loopsva 4:9d2a4dc03170 59 return(MDIO_TIMEOUT); //timeout error
loopsva 4:9d2a4dc03170 60 }
loopsva 4:9d2a4dc03170 61
loopsva 4:9d2a4dc03170 62 //get Basic Status Register
loopsva 4:9d2a4dc03170 63 miiSTR.MMFR = MDIO_GET_LINK_REG;
loopsva 4:9d2a4dc03170 64 wait_us(35); //20 is absolute minimum!!
loopsva 4:9d2a4dc03170 65 k64f_mdio_reg = miiSTR.MMFR; //get the phy result
loopsva 4:9d2a4dc03170 66 if(k64f_mdio_reg & MDIO_MII_LINK_BITS) return(PHY_UP);
loopsva 4:9d2a4dc03170 67 return(PHY_DOWN);
loopsva 4:9d2a4dc03170 68 }
loopsva 4:9d2a4dc03170 69 */
loopsva 4:9d2a4dc03170 70 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 4:9d2a4dc03170 71 // Get Ethernet link status on the K64F
loopsva 4:9d2a4dc03170 72
loopsva 4:9d2a4dc03170 73 //see: mbed-dev/targets/cmsis/TARGET_K64F/MK64F12.h
loopsva 4:9d2a4dc03170 74
loopsva 4:9d2a4dc03170 75 int k64fEthLink::GetELink() {
loopsva 4:9d2a4dc03170 76 int mdio_timer = 0;
loopsva 4:9d2a4dc03170 77 uint32_t k64f_mdio_reg = ENET->EIR;
loopsva 4:9d2a4dc03170 78
loopsva 4:9d2a4dc03170 79 //wait for MDIO interface to be ready
loopsva 4:9d2a4dc03170 80 do {
loopsva 4:9d2a4dc03170 81 k64f_mdio_reg = ENET->EIR;
loopsva 4:9d2a4dc03170 82 #ifdef RTOS_H
loopsva 4:9d2a4dc03170 83 Thread::wait(1);
loopsva 4:9d2a4dc03170 84 #else
loopsva 4:9d2a4dc03170 85 wait_ms(1);
loopsva 4:9d2a4dc03170 86 #endif
loopsva 4:9d2a4dc03170 87 mdio_timer++;
loopsva 4:9d2a4dc03170 88 } while(((k64f_mdio_reg & MDIO_MII_READY_BIT) == 0) && (mdio_timer < 300));
loopsva 4:9d2a4dc03170 89 if(mdio_timer > 298) { //average is about 122mS
loopsva 4:9d2a4dc03170 90 return(MDIO_TIMEOUT); //timeout error
loopsva 4:9d2a4dc03170 91 }
loopsva 4:9d2a4dc03170 92
loopsva 4:9d2a4dc03170 93 //get Basic Status Register
loopsva 4:9d2a4dc03170 94 ENET->MMFR = MDIO_GET_LINK_REG;
loopsva 4:9d2a4dc03170 95 wait_us(35); //20 is absolute minimum!!
loopsva 4:9d2a4dc03170 96 k64f_mdio_reg = ENET->MMFR; //get the phy result
loopsva 4:9d2a4dc03170 97 if(k64f_mdio_reg & MDIO_MII_LINK_BITS) return(PHY_UP);
loopsva 4:9d2a4dc03170 98 return(PHY_DOWN);
loopsva 4:9d2a4dc03170 99 }
loopsva 4:9d2a4dc03170 100
loopsva 2:59166b94dfd0 101 #endif
loopsva 0:a447869e1046 102
loopsva 2:59166b94dfd0 103
loopsva 3:fbd2336e1193 104