/* | |
* 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 | |
'*pulValue'. 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 'ulValue' 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_KSZ8081MNXIA 0x00221560 | |
#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 command to the connected PHY ports and send configuration. */ | |
BaseType_t xPhyConfigure( EthernetPhy_t *pxPhyObject, const PhyProperties_t *pxPhyProperties ); | |
/* Give a command 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 ); | |
/* Get the bitmask of a given 'EthernetPhy_t'. */ | |
#define xPhyGetMask( pxPhyObject ) \ | |
( ( ( ( uint32_t ) 1u ) << ( pxPhyObject )->xPortCount ) - 1u ) | |
#ifdef __cplusplus | |
} /* extern "C" */ | |
#endif | |
#endif |