/* * Handling of Ethernet PHY's * PHY's communicate with an EMAC either through * a Media-Independent Interface (MII), or a Reduced Media-Independent Interface (RMII). * The EMAC can poll for PHY ports on 32 different addresses. Each of the PHY ports * shall be treated independently. * */ #ifndef PHYHANDLING_H #define PHYHANDLING_H #ifdef __cplusplus extern "C" { #endif #ifndef ipconfigPHY_MAX_PORTS /* There can be at most 32 PHY ports, but in most cases there are 4 or less. */ #define ipconfigPHY_MAX_PORTS 4 #endif /* A generic user-provided function that reads from the PHY-port at 'xAddress'( 0-based ). A 16-bit value shall be stored in '*pusValue'. xRegister is the register number ( 0 .. 31 ). In fact all PHY registers are 16-bit. Return non-zero in case the action failed. */ typedef BaseType_t ( *xApplicationPhyReadHook_t )( BaseType_t xAddress, BaseType_t xRegister, uint32_t *pulValue ); /* A generic user-provided function that writes 'usValue' to the PHY-port at 'xAddress' ( 0-based ). xRegister is the register number ( 0 .. 31 ). Return non-zero in case the action failed. */ typedef BaseType_t ( *xApplicationPhyWriteHook_t )( BaseType_t xAddress, BaseType_t xRegister, uint32_t ulValue ); typedef struct xPhyProperties { uint8_t ucSpeed; uint8_t ucMDI_X; /* MDI-X : Medium Dependent Interface - Crossover */ uint8_t ucDuplex; uint8_t ucSpare; } PhyProperties_t; typedef struct xEthernetPhy { xApplicationPhyReadHook_t fnPhyRead; xApplicationPhyWriteHook_t fnPhyWrite; uint32_t ulPhyIDs[ ipconfigPHY_MAX_PORTS ]; uint8_t ucPhyIndexes[ ipconfigPHY_MAX_PORTS ]; TimeOut_t xLinkStatusTimer; TickType_t xLinkStatusRemaining; BaseType_t xPortCount; uint32_t ulBCRValue; uint32_t ulACRValue; uint32_t ulLinkStatusMask; PhyProperties_t xPhyPreferences; PhyProperties_t xPhyProperties; } EthernetPhy_t; /* Some defines used internally here to indicate preferences about speed, MDIX (wired direct or crossed), and duplex (half or full). */ /* Values for PhyProperties_t::ucSpeed : */ #define PHY_SPEED_10 1 #define PHY_SPEED_100 2 #define PHY_SPEED_AUTO 3 /* Values for PhyProperties_t::ucMDI_X : */ #define PHY_MDIX_DIRECT 1 #define PHY_MDIX_CROSSED 2 #define PHY_MDIX_AUTO 3 /* Values for PhyProperties_t::ucDuplex : */ #define PHY_DUPLEX_HALF 1 #define PHY_DUPLEX_FULL 2 #define PHY_DUPLEX_AUTO 3 /* ID's of supported PHY's : */ #define PHY_ID_LAN8742A 0x0007c130 #define PHY_ID_LAN8720 0x0007c0f0 #define PHY_ID_KSZ8041 0x000010A1 #define PHY_ID_KSZ8051 0x000010A1 #define PHY_ID_KSZ8081 0x000010A1 #define PHY_ID_KSZ8863 0x00221430 #define PHY_ID_DP83848I 0x20005C90 /* Initialise the struct and assign a PHY-read and -write function. */ void vPhyInitialise( EthernetPhy_t *pxPhyObject, xApplicationPhyReadHook_t fnPhyRead, xApplicationPhyWriteHook_t fnPhyWrite ); /* Discover all PHY's connected by polling 32 indexes ( zero-based ) */ BaseType_t xPhyDiscover( EthernetPhy_t *pxPhyObject ); /* Send a reset commando to the connected PHY ports and send configuration. */ BaseType_t xPhyConfigure( EthernetPhy_t *pxPhyObject, const PhyProperties_t *pxPhyProperties ); /* Give a commando to start auto negotiation on a set of PHY port's. */ BaseType_t xPhyStartAutoNegotiation( EthernetPhy_t *pxPhyObject, uint32_t ulPhyMask ); /* Do not use auto negotiation but use predefined values from 'pxPhyObject->xPhyPreferences'. */ BaseType_t xPhyFixedValue( EthernetPhy_t *pxPhyObject, uint32_t ulPhyMask ); /* Check the current Link Status. 'xHadReception' : make this true if a packet has been received since the last call to this function. */ BaseType_t xPhyCheckLinkStatus( EthernetPhy_t *pxPhyObject, BaseType_t xHadReception ); static __inline uint32_t xPhyGetMask( EthernetPhy_t *pxPhyObject ) { return ( ( ( uint32_t ) 1u ) << pxPhyObject-> xPortCount ) - 1; } #ifdef __cplusplus } /* extern "C" */ #endif #endif