/* ----------------------------------------------------------------------------- * Copyright (c) 2013-2014 ARM Limited. All rights reserved. * * $Date: 2. January 2014 * $Revision: V2.00 * * Project: Ethernet Driver API * -------------------------------------------------------------------------- */ /** \defgroup eth_interface_gr Ethernet Interface \brief Ethernet common definitions (%Driver_ETH.h) \details Ethernet is a networking technology for exchanging data packages between computer systems. Several microcontrollers integrate an Ethernet MAC (Media Access Control) data-link layer that interfaces to an Ethernet PHY (Physical Interface Transceiver). Wikipedia offers more information about the Ethernet. **Block Diagram** The Ethernet PHY connects typically to the Ethernet MAC using an MII (Media Independent Interface) or RMII (Reduced Media Independent Interface). \n \image html EthernetSchematic.png "Block Diagram of a typical Ethernet Interface" **Ethernet API** The following header files define the Application Programming Interface (API) for the Ethernet interface: - \b %Driver_ETH.h : Common definitions of the Ethernet PHY and MAC part - \b %Driver_ETH_MAC.h : API for the Ethernet MAC - \b %Driver_ETH_PHY.h : API for the Ethernet PHY The driver implementation of the Ethernet MAC is a typical part of a Device Family Pack (DFP) that supports the peripherals of the microcontroller family. The driver implementation of the Ethernet PHY is a typical part of a \b Network Software Pack, since PHY is typically not integrated into the microcontroller. \note For parameters, the value marked with (default) is the setting after the driver initialization. **Driver Functions** The driver functions are published in the access struct as explained in \ref DriverFunctions - \ref ARM_DRIVER_ETH_MAC : access struct for Ethernet MAC driver functions. - \ref ARM_DRIVER_ETH_PHY : access struct for Ethernet PHY driver functions. Both drivers are used in combination and usually the Ethernet MAC provides a media interface to the Ethernet PHY. A typical setup sequence for the drivers is shown below: **Example Code** The following example code shows the usage of the Ethernet interface. \code extern ARM_DRIVER_ETH_MAC Driver_ETH_MAC0; extern ARM_DRIVER_ETH_PHY Driver_ETH_PHY0; static ARM_DRIVER_ETH_MAC *mac; static ARM_DRIVER_ETH_PHY *phy; static ARM_ETH_MAC_ADDR own_mac_address; static ARM_ETH_MAC_CAPABILITIES capabilities; void ethernet_mac_notify (uint32_t event) { switch (event) { : } } void initialize_ethernet_interface (void) { mac = &Driver_ETH_MAC0; phy = &Driver_ETH_PHY0; // Initialize Media Access Controller capabilities = mac->GetCapabilities (); mac->Initialize (ethernet_mac_notify); mac->PowerControl (ARM_POWER_FULL); if (capabilities.mac_address == 0) { // populate own_mac_address with the address to use mac->SetMacAddress(&own_mac_address); } else { mac->GetMacAddress(&own_mac_address); } // Initialize Physical Media Interface if (phy->Initialize (mac->PHY_Read, mac->PHY_Write) == ARM_DRIVER_OK) { phy->PowerControl (ARM_POWER_FULL); phy->SetInterface (capabilities.media_interface); phy->SetMode (ARM_ETH_PHY_AUTO_NEGOTIATE); } : : } static ARM_ETH_LINK_STATE ethernet_link; // current link status void ethernet_check_link_status (void) { ARM_ETH_LINK_STATE link; link = phy->GetLinkState (); if (link == ethernet_link) { return; // link state unchanged } // link state changed ethernet_link = link; if (link == ARM_ETH_LINK_UP) { // start transfer ARM_ETH_LINK_INFO info = phy->GetLinkInfo (); mac->Control(ARM_ETH_MAC_CONFIGURE, info.speed << ARM_ETH_MAC_SPEED_Pos | info.duplex << ARM_ETH_MAC_DUPLEX_Pos | ARM_ETH_MAC_ADDRESS_BROADCAST); mac->Control(ARM_ETH_MAC_CONTROL_TX, 1); mac->Control(ARM_ETH_MAC_CONTROL_RX, 1); } else { // stop transfer mac->Control(ARM_ETH_MAC_FLUSH, ARM_ETH_MAC_FLUSH_TX | ARM_ETH_MAC_FLUSH_RX); mac->Control(ARM_ETH_MAC_CONTROL_TX, 0); mac->Control(ARM_ETH_MAC_CONTROL_RX, 0); } } \endcode */ /** \defgroup eth_interface_gr Ethernet Interface @{ */ /** \cond */ /** \enum ARM_ETH_INTERFACE \details Encodes the supported media interface between Ethernet MAC and Ethernet PHY. The function \ref ARM_ETH_MAC_GetCapabilities retrieves the media interface type encoded in the data field \b media_interface of the struct \ref ARM_ETH_MAC_CAPABILITIES. Parameter for: - \ref ARM_ETH_PHY_SetInterface */ /** \enum ARM_ETH_DUPLEX \details Lists the supported duplex operating types for MAC. Parameter for: - \ref ARM_ETH_MAC_SetMode */ /** \typedef ARM_ETH_SPEED \details Lists the supported operating speeds for MAC. Parameter for: - \ref ARM_ETH_MAC_SetMode */ /** \endcond */ /** \typedef ARM_ETH_LINK_STATE \details The Ethernet Link status shows if the communication is currently established (up) or interrupted (down). Returned by: - \ref ARM_ETH_PHY_GetLinkState */ /** \struct ARM_ETH_LINK_INFO \details The Ethernet Link information provides parameters about the current established communication. Returned by: - \ref ARM_ETH_PHY_GetLinkInfo */ /** \struct ARM_ETH_MAC_ADDR \details Stores the MAC Address of the Ethernet interface as defined by IEEE 802. Wikipedia offers more information about the MAC Address. Parameter for: - \ref ARM_ETH_MAC_GetMacAddress, \ref ARM_ETH_MAC_SetMacAddress, \ref ARM_ETH_MAC_SetAddressFilter */ /** @} */ // End ETH Interface /** \defgroup eth_interface_types1 Media Interface Types \ingroup eth_interface_gr \brief Ethernet Media Interface type \details Encodes the supported media interface between Ethernet MAC and Ethernet PHY. The function \ref ARM_ETH_MAC_GetCapabilities retrieves the media interface type encoded in the data field \b media_interface of the struct \ref ARM_ETH_MAC_CAPABILITIES. Parameter for: - \ref ARM_ETH_PHY_SetInterface @{ \def ARM_ETH_INTERFACE_MII \sa ARM_ETH_PHY_SetInterface \def ARM_ETH_INTERFACE_RMII \sa ARM_ETH_PHY_SetInterface \def ARM_ETH_INTERFACE_SMII \sa ARM_ETH_PHY_SetInterface @} */