#include "project.h" /*---------------------------------------------------------------------------*/ /** @brief Process pending SMI transaction and wait to be done. */ static void my_eth_smi_transact(void) { TRACE; /* Begin transaction. */ ETH_MACMIIAR |= ETH_MACMIIAR_MB; TRACE; /* Wait for not busy. */ while (ETH_MACMIIAR & ETH_MACMIIAR_MB); TRACE; } /*---------------------------------------------------------------------------*/ /** @brief Write 16-bit register to the PHY * * @param[in] phy uint8_t ID of the PHY (defaults to 1) * @param[in] reg uint8_t Register address * @param[in] data uint16_t Data to write */ void my_eth_smi_write(uint8_t phy, uint8_t reg, uint16_t data) { /* Write operation MW=1*/ ETH_MACMIIAR = (ETH_MACMIIAR & ETH_MACMIIAR_CR) | /* save clocks */ (phy << ETH_MACMIIAR_PA_SHIFT) | (reg << ETH_MACMIIAR_MR_SHIFT) | ETH_MACMIIAR_MW; ETH_MACMIIDR = data & ETH_MACMIIDR_MD; TRACE; my_eth_smi_transact(); TRACE; } /*---------------------------------------------------------------------------*/ /** @brief Read the 16-bit register from the PHY * * @param[in] phy uint8_t ID of the PHY (defaults to 1) * @param[in] reg uint8_t Register address * @returns uint16_t Readed data */ uint16_t my_eth_smi_read(uint8_t phy, uint8_t reg) { /* Read operation MW=0*/ ETH_MACMIIAR = (ETH_MACMIIAR & ETH_MACMIIAR_CR) | /* save clocks */ (phy << ETH_MACMIIAR_PA_SHIFT) | (reg << ETH_MACMIIAR_MR_SHIFT); TRACE; my_eth_smi_transact(); TRACE; return (uint16_t)(ETH_MACMIIDR & ETH_MACMIIDR_MD); } void my_phy_reset(uint8_t phy) { unsigned i; TRACE; my_eth_smi_write(phy, PHY_REG_BCR, PHY_REG_BCR_RESET); for (i=0;i<0x20;++i){ printf("%x %x\n",i,my_eth_smi_read(phy,i)); } TRACE; while (my_eth_smi_read(phy, PHY_REG_BCR) & PHY_REG_BCR_RESET); TRACE; delay_ms(100); } void my_eth_init(uint8_t phy, enum eth_clk clock) { ETH_MACMIIAR = clock; TRACE; my_phy_reset(phy); TRACE; ETH_MACCR = ETH_MACCR_CSTF | ETH_MACCR_FES | ETH_MACCR_DM | ETH_MACCR_APCS | ETH_MACCR_RD; ETH_MACFFR = ETH_MACFFR_RA | ETH_MACFFR_PM; ETH_MACHTHR = 0; /* pass all frames */ ETH_MACHTLR = 0; ETH_MACFCR = (0x100 << ETH_MACFCR_PT_SHIFT); ETH_MACVLANTR = 0; ETH_DMAOMR = ETH_DMAOMR_DTCEFD | ETH_DMAOMR_RSF | ETH_DMAOMR_DFRF | ETH_DMAOMR_TSF | ETH_DMAOMR_FEF | ETH_DMAOMR_OSF; ETH_DMABMR = ETH_DMABMR_AAB | ETH_DMABMR_FB | (32 << ETH_DMABMR_RDP_SHIFT) | (32 << ETH_DMABMR_PBL_SHIFT) | ETH_DMABMR_PM_2_1 | ETH_DMABMR_USP; TRACE; }