Hi Team,
Good day! I'm posting this in behalf of our cusotmer as shown below.
Our company bought dp83620 PHY driver from mouser recently. Need driver code support for this. I searched in your website under support, it shows LINUX driver support but mine is not Linux plaform.
I need to interface dp83620 PHY driver with STM32 in RMII mode. Windows platform. IDE: STM32 CubeIDE
I got the attached files oryx-embedded.com. Please look into this also and tell me whether it will work or not.. This is one option. But, I am expecting support from original vendor.
/**
* @file dp83620_driver.c
* @brief DP83620 Ethernet PHY driver
*
* @section License
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Copyright (C) 2010-2021 Oryx Embedded SARL. All rights reserved.
*
* This file is part of CycloneTCP Open.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @author Oryx Embedded SARL (www.oryx-embedded.com)
* @version 2.1.2
**/
//Switch to the appropriate trace level
#define TRACE_LEVEL NIC_TRACE_LEVEL
//Dependencies
#include "core/net.h"
#include "drivers/phy/dp83620_driver.h"
#include "debug.h"
/**
* @brief DP83620 Ethernet PHY driver
**/
const PhyDriver dp83620PhyDriver =
{
dp83620Init,
dp83620Tick,
dp83620EnableIrq,
dp83620DisableIrq,
dp83620EventHandler
};
/**
* @brief DP83620 PHY transceiver initialization
* @param[in] interface Underlying network interface
* @return Error code
**/
error_t dp83620Init(NetInterface *interface)
{
//Debug message
TRACE_INFO("Initializing DP83620...\r\n");
//Undefined PHY address?
if(interface->phyAddr >= 32)
{
//Use the default address
interface->phyAddr = DP83620_PHY_ADDR;
}
//Initialize serial management interface
if(interface->smiDriver != NULL)
{
interface->smiDriver->init();
}
//Initialize external interrupt line driver
if(interface->extIntDriver != NULL)
{
interface->extIntDriver->init();
}
//A software reset is accomplished by setting the RESET bit of the BMCR register
dp83620WritePhyReg(interface, DP83620_BMCR, DP83620_BMCR_RESET);
//Wait for the reset to complete
while(dp83620ReadPhyReg(interface, DP83620_BMCR) & DP83620_BMCR_RESET)
{
}
//Dump PHY registers for debugging purpose
dp83620DumpPhyReg(interface);
//Configure PWR_DOWN/INT pin as an interrupt output
dp83620WritePhyReg(interface, DP83620_MICR, DP83620_MICR_INTEN |
DP83620_MICR_INT_OE);
//The PHY will generate interrupts when link status changes are detected
dp83620WritePhyReg(interface, DP83620_MISR, DP83620_MISR_LINK_INT_EN);
//Force the TCP/IP stack to poll the link state at startup
interface->phyEvent = TRUE;
//Notify the TCP/IP stack of the event
osSetEvent(&netEvent);
//Successful initialization
return NO_ERROR;
}
/**
* @brief DP83620 timer handler
* @param[in] interface Underlying network interface
**/
void dp83620Tick(NetInterface *interface)
{
uint16_t value;
bool_t linkState;
//No external interrupt line driver?
if(interface->extIntDriver == NULL)
{
//Read basic status register
value = dp83620ReadPhyReg(interface, DP83620_BMSR);
//Retrieve current link state
linkState = (value & DP83620_BMSR_LINK_STATUS) ? TRUE : FALSE;
//Link up event?
if(linkState && !interface->linkState)
{
//Set event flag
interface->phyEvent = TRUE;
//Notify the TCP/IP stack of the event
osSetEvent(&netEvent);
}
//Link down event?
else if(!linkState && interface->linkState)
{
//Set event flag
interface->phyEvent = TRUE;
//Notify the TCP/IP stack of the event
osSetEvent(&netEvent);
}
}
}
/**
* @brief Enable interrupts
* @param[in] interface Underlying network interface
**/
void dp83620EnableIrq(NetInterface *interface)
{
//Enable PHY transceiver interrupts
if(interface->extIntDriver != NULL)
{
interface->extIntDriver->enableIrq();
}
}
/**
* @brief Disable interrupts
* @param[in] interface Underlying network interface
**/
void dp83620DisableIrq(NetInterface *interface)
{
//Disable PHY transceiver interrupts
if(interface->extIntDriver != NULL)
{
interface->extIntDriver->disableIrq();
}
}
/**
* @brief DP83620 event handler
* @param[in] interface Underlying network interface
**/
void dp83620EventHandler(NetInterface *interface)
{
uint16_t status;
//Read status register to acknowledge the interrupt
status = dp83620ReadPhyReg(interface, DP83620_MISR);
//Link status change?
if((status & DP83620_MISR_LINK_INT) != 0)
{
//Read PHY status register
status = dp83620ReadPhyReg(interface, DP83620_PHYSTS);
//Link is up?
if((status & DP83620_PHYSTS_LINK_STATUS) != 0)
{
//Check current speed
if((status & DP83620_PHYSTS_SPEED_STATUS) != 0)
{
interface->linkSpeed = NIC_LINK_SPEED_10MBPS;
}
else
{
interface->linkSpeed = NIC_LINK_SPEED_100MBPS;
}
//Check duplex mode
if((status & DP83620_PHYSTS_DUPLEX_STATUS) != 0)
{
interface->duplexMode = NIC_FULL_DUPLEX_MODE;
}
else
{
interface->duplexMode = NIC_HALF_DUPLEX_MODE;
}
//Update link state
interface->linkState = TRUE;
//Adjust MAC configuration parameters for proper operation
interface->nicDriver->updateMacConfig(interface);
}
else
{
//Update link state
interface->linkState = FALSE;
}
//Process link state change event
nicNotifyLinkChange(interface);
}
}
/**
* @brief Write PHY register
* @param[in] interface Underlying network interface
* @param[in] address PHY register address
* @param[in] data Register value
**/
void dp83620WritePhyReg(NetInterface *interface, uint8_t address,
uint16_t data)
{
//Write the specified PHY register
if(interface->smiDriver != NULL)
{
interface->smiDriver->writePhyReg(SMI_OPCODE_WRITE,
interface->phyAddr, address, data);
}
else
{
interface->nicDriver->writePhyReg(SMI_OPCODE_WRITE,
interface->phyAddr, address, data);
}
}
/**
* @brief Read PHY register
* @param[in] interface Underlying network interface
* @param[in] address PHY register address
* @return Register value
**/
uint16_t dp83620ReadPhyReg(NetInterface *interface, uint8_t address)
{
uint16_t data;
//Read the specified PHY register
if(interface->smiDriver != NULL)
{
data = interface->smiDriver->readPhyReg(SMI_OPCODE_READ,
interface->phyAddr, address);
}
else
{
data = interface->nicDriver->readPhyReg(SMI_OPCODE_READ,
interface->phyAddr, address);
}
//Return the value of the PHY register
return data;
}
/**
* @brief Dump PHY registers for debugging purpose
* @param[in] interface Underlying network interface
**/
void dp83620DumpPhyReg(NetInterface *interface)
{
uint8_t i;
//Loop through PHY registers
for(i = 0; i < 32; i++)
{
//Display current PHY register
TRACE_DEBUG("%02" PRIu8 ": 0x%04" PRIX16 "\r\n", i,
dp83620ReadPhyReg(interface, i));
}
//Terminate with a line feed
TRACE_DEBUG("\r\n");
}
/**
* @file dp83620_driver.h
* @brief DP83620 Ethernet PHY driver
*
* @section License
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Copyright (C) 2010-2021 Oryx Embedded SARL. All rights reserved.
*
* This file is part of CycloneTCP Open.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @author Oryx Embedded SARL (www.oryx-embedded.com)
* @version 2.1.2
**/
#ifndef _DP83620_DRIVER_H
#define _DP83620_DRIVER_H
//Dependencies
#include "core/nic.h"
//PHY address
#ifndef DP83620_PHY_ADDR
#define DP83620_PHY_ADDR 1
#elif (DP83620_PHY_ADDR < 0 || DP83620_PHY_ADDR > 31)
#error DP83620_PHY_ADDR parameter is not valid
#endif
//DP83620 PHY registers (page 0)
#define DP83620_BMCR 0x00
#define DP83620_BMSR 0x01
#define DP83620_PHYIDR1 0x02
#define DP83620_PHYIDR2 0x03
#define DP83620_ANAR 0x04
#define DP83620_ANLPAR 0x05
#define DP83620_ANER 0x06
#define DP83620_ANNPTR 0x07
#define DP83620_PHYSTS 0x10
#define DP83620_MICR 0x11
#define DP83620_MISR 0x12
#define DP83620_PAGSR 0x13
#define DP83620_FCSCR 0x14
#define DP83620_RECR 0x15
#define DP83620_PCSR 0x16
#define DP83620_RBR 0x17
#define DP83620_LEDCR 0x18
#define DP83620_PHYCR 0x19
#define DP83620_10BTSCR 0x1A
#define DP83620_CDCTRL1 0x1B
#define DP83620_PHYCR2 0x1C
#define DP83620_EDCR 0x1D
#define DP83620_PCFCR 0x1F
//DP83620 PHY registers (page 1)
#define DP83620_SD_CNFG 0x1E
//DP83620 PHY registers (page 2)
#define DP83620_LEN100_DET 0x14
#define DP83620_FREQ100 0x15
#define DP83620_TDR_CTRL 0x16
#define DP83620_TDR_WIN 0x17
#define DP83620_TDR_PEAK 0x18
#define DP83620_TDR_THR 0x19
#define DP83620_VAR_CTRL 0x1A
#define DP83620_VAR_DAT 0x1B
#define DP83620_LQMR 0x1D
#define DP83620_LQDR 0x1E
#define DP83620_LQMR2 0x1F
//DP83620 PHY registers (page 5)
#define DP83620_PSF_CFG 0x18
//Basic Mode Control register
#define DP83620_BMCR_RESET 0x8000
#define DP83620_BMCR_LOOPBACK 0x4000
#define DP83620_BMCR_SPEED_SEL 0x2000
#define DP83620_BMCR_AN_EN 0x1000
#define DP83620_BMCR_POWER_DOWN 0x0800
#define DP83620_BMCR_ISOLATE 0x0400
#define DP83620_BMCR_RESTART_AN 0x0200
#define DP83620_BMCR_DUPLEX_MODE 0x0100
#define DP83620_BMCR_COL_TEST 0x0080
#define DP83620_BMCR_UNIDIRECTIONAL_EN 0x0020
//Basic Mode Status register
#define DP83620_BMSR_100BT4 0x8000
#define DP83620_BMSR_100BTX_FD 0x4000
#define DP83620_BMSR_100BTX_HD 0x2000
#define DP83620_BMSR_10BT_FD 0x1000
#define DP83620_BMSR_10BT_HD 0x0800
#define DP83620_BMSR_UNIDIRECTIONAL_ABLE 0x0080
#define DP83620_BMSR_MF_PREAMBLE_SUPPR 0x0040
#define DP83620_BMSR_AN_COMPLETE 0x0020
#define DP83620_BMSR_REMOTE_FAULT 0x0010
#define DP83620_BMSR_AN_CAPABLE 0x0008
#define DP83620_BMSR_LINK_STATUS 0x0004
#define DP83620_BMSR_JABBER_DETECT 0x0002
#define DP83620_BMSR_EXTENDED_CAPABLE 0x0001
//PHY Identifier 1 register
#define DP83620_PHYIDR1_OUI_MSB 0xFFFF
#define DP83620_PHYIDR1_OUI_MSB_DEFAULT 0x2000
//PHY Identifier 2 register
#define DP83620_PHYIDR2_OUI_LSB 0xFC00
#define DP83620_PHYIDR2_OUI_LSB_DEFAULT 0x5C00
#define DP83620_PHYIDR2_VNDR_MDL 0x03F0
#define DP83620_PHYIDR2_VNDR_MDL_DEFAULT 0x00E0
#define DP83620_PHYIDR2_MDL_REV 0x000F
//Auto-Negotiation Advertisement register
#define DP83620_ANAR_NEXT_PAGE 0x8000
#define DP83620_ANAR_REMOTE_FAULT 0x2000
#define DP83620_ANAR_ASM_DIR 0x0800
#define DP83620_ANAR_PAUSE 0x0400
#define DP83620_ANAR_100BT4 0x0200
#define DP83620_ANAR_100BTX_FD 0x0100
#define DP83620_ANAR_100BTX_HD 0x0080
#define DP83620_ANAR_10BT_FD 0x0040
#define DP83620_ANAR_10BT_HD 0x0020
#define DP83620_ANAR_SELECTOR 0x001F
#define DP83620_ANAR_SELECTOR_DEFAULT 0x0001
//Auto-Negotiation Link Partner Ability register
#define DP83620_ANLPAR_NEXT_PAGE 0x8000
#define DP83620_ANLPAR_ACK 0x4000
#define DP83620_ANLPAR_REMOTE_FAULT 0x2000
#define DP83620_ANLPAR_ASM_DIR 0x0800
#define DP83620_ANLPAR_PAUSE 0x0400
#define DP83620_ANLPAR_100BT4 0x0200
#define DP83620_ANLPAR_100BTX_FD 0x0100
#define DP83620_ANLPAR_100BTX_HD 0x0080
#define DP83620_ANLPAR_10BT_FD 0x0040
#define DP83620_ANLPAR_10BT_HD 0x0020
#define DP83620_ANLPAR_SELECTOR 0x001F
#define DP83620_ANLPAR_SELECTOR_DEFAULT 0x0001
//Auto-Negotiation Expansion register
#define DP83620_ANER_PAR_DETECT_FAULT 0x0010
#define DP83620_ANER_LP_NP_ABLE 0x0008
#define DP83620_ANER_NP_ABLE 0x0004
#define DP83620_ANER_PAGE_RX 0x0002
#define DP83620_ANER_LP_AN_ABLE 0x0001
//Auto-Negotiation Next Page TX register
#define DP83620_ANNPTR_NEXT_PAGE 0x8000
#define DP83620_ANNPTR_MSG_PAGE 0x2000
#define DP83620_ANNPTR_ACK2 0x1000
#define DP83620_ANNPTR_TOGGLE 0x0800
#define DP83620_ANNPTR_CODE 0x07FF
//PHY Status register
#define DP83620_PHYSTS_MDIX_MODE 0x4000
#define DP83620_PHYSTS_RECEIVE_ERROR_LATCH 0x2000
#define DP83620_PHYSTS_POLARITY_STATUS 0x1000
#define DP83620_PHYSTS_FALSE_CARRIER_SENSE_LATCH 0x0800
#define DP83620_PHYSTS_SIGNAL_DETECT 0x0400
#define DP83620_PHYSTS_DESCRAMBLER_LOCK 0x0200
#define DP83620_PHYSTS_PAGE_RECEIVED 0x0100
#define DP83620_PHYSTS_MII_INTERRUPT 0x0080
#define DP83620_PHYSTS_REMOTE_FAULT 0x0040
#define DP83620_PHYSTS_JABBER_DETECT 0x0020
#define DP83620_PHYSTS_AN_COMPLETE 0x0010
#define DP83620_PHYSTS_LOOPBACK_STATUS 0x0008
#define DP83620_PHYSTS_DUPLEX_STATUS 0x0004
#define DP83620_PHYSTS_SPEED_STATUS 0x0002
#define DP83620_PHYSTS_LINK_STATUS 0x0001
//MII Interrupt Control register
#define DP83620_MICR_TINT 0x0004
#define DP83620_MICR_INTEN 0x0002
#define DP83620_MICR_INT_OE 0x0001
//MII Interrupt Status register
#define DP83620_MISR_LQ_INT 0x8000
#define DP83620_MISR_ED_INT 0x4000
#define DP83620_MISR_LINK_INT 0x2000
#define DP83620_MISR_SPD_INT 0x1000
#define DP83620_MISR_DUP_INT 0x0800
#define DP83620_MISR_ANC_INT 0x0400
#define DP83620_MISR_FHF_INT 0x0200
#define DP83620_MISR_RHF_INT 0x0100
#define DP83620_MISR_LQ_INT_EN 0x0080
#define DP83620_MISR_ED_INT_EN 0x0040
#define DP83620_MISR_LINK_INT_EN 0x0020
#define DP83620_MISR_SPD_INT_EN 0x0010
#define DP83620_MISR_DUP_INT_EN 0x0008
#define DP83620_MISR_ANC_INT_EN 0x0004
#define DP83620_MISR_FHF_INT_EN 0x0002
#define DP83620_MISR_RHF_INT_EN 0x0001
//Page Select register
#define DP83620_PAGSR_PAGE_SEL 0x0007
//False Carrier Sense Counter register
#define DP83620_FCSCR_FCSCNT 0x00FF
//Receive Error Counter register
#define DP83620_RECR_RXERCNT 0x00FF
//PCS Configuration and Status register
#define DP83620_PCSR_AUTO_CROSSOVER 0x8000
#define DP83620_PCSR_FREE_CLK 0x0800
#define DP83620_PCSR_TQ_EN 0x0400
#define DP83620_PCSR_SD_FORCE_PMA 0x0200
#define DP83620_PCSR_SD_OPTION 0x0100
#define DP83620_PCSR_DESC_TIME 0x0080
#define DP83620_PCSR_FX_EN 0x0040
#define DP83620_PCSR_FORCE_100_OK 0x0020
#define DP83620_PCSR_FEFI_EN 0x0008
#define DP83620_PCSR_NRZI_BYPASS 0x0004
#define DP83620_PCSR_SCRAM_BYPASS 0x0002
#define DP83620_PCSR_DESCRAM_BYPASS 0x0001
//RMII and Bypass register
#define DP83620_RBR_RMII_MASTER 0x4000
#define DP83620_RBR_DIS_TX_OPT 0x2000
#define DP83620_RBR_PMD_LOOP 0x0100
#define DP83620_RBR_SCMII_RX 0x0080
#define DP83620_RBR_SCMII_TX 0x0040
#define DP83620_RBR_RMII_MODE 0x0020
#define DP83620_RBR_RMII_REV1_0 0x0010
#define DP83620_RBR_RX_OVF_STS 0x0008
#define DP83620_RBR_RX_UNF_STS 0x0004
#define DP83620_RBR_ELAST_BUF 0x0003
//LED Direct Control register
#define DP83620_LEDCR_DIS_SPDLED 0x0800
#define DP83620_LEDCR_DIS_LNKLED 0x0400
#define DP83620_LEDCR_DIS_ACTLED 0x0200
#define DP83620_LEDCR_LEDACT_RX 0x0100
#define DP83620_LEDCR_BLINK_FREQ 0x00C0
#define DP83620_LEDCR_BLINK_FREQ_6HZ 0x0000
#define DP83620_LEDCR_BLINK_FREQ_12HZ 0x0040
#define DP83620_LEDCR_BLINK_FREQ_24HZ 0x0080
#define DP83620_LEDCR_BLINK_FREQ_48HZ 0x00C0
#define DP83620_LEDCR_DRV_SPDLED 0x0020
#define DP83620_LEDCR_DRV_LNKLED 0x0010
#define DP83620_LEDCR_DRV_ACTLED 0x0008
#define DP83620_LEDCR_SPDLED 0x0004
#define DP83620_LEDCR_LNKLED 0x0002
#define DP83620_LEDCR_ACTLED 0x0001
//PHY Control register
#define DP83620_PHYCR_MDIX_EN 0x8000
#define DP83620_PHYCR_FORCE_MDIX 0x4000
#define DP83620_PHYCR_PAUSE_RX 0x2000
#define DP83620_PHYCR_PAUSE_TX 0x1000
#define DP83620_PHYCR_BIST_FE 0x0800
#define DP83620_PHYCR_PSR_15 0x0400
#define DP83620_PHYCR_BIST_STATUS 0x0200
#define DP83620_PHYCR_BIST_START 0x0100
#define DP83620_PHYCR_BP_STRETCH 0x0080
#define DP83620_PHYCR_LED_CNFG 0x0060
#define DP83620_PHYCR_PHYADDR 0x001F
//10Base-T Status/Control register
#define DP83620_10BTSCR_SQUELCH 0x0E00
#define DP83620_10BTSCR_LOOPBACK_10_DIS 0x0100
#define DP83620_10BTSCR_LP_DIS 0x0080
#define DP83620_10BTSCR_FORCE_LINK_10 0x0040
#define DP83620_10BTSCR_FORCE_POL_COR 0x0020
#define DP83620_10BTSCR_POLARITY 0x0010
#define DP83620_10BTSCR_AUTOPOL_DIS 0x0008
#define DP83620_10BTSCR_10BT_SCALE_MSB 0x0004
#define DP83620_10BTSCR_HEARTBEAT_DIS 0x0002
#define DP83620_10BTSCR_JABBER_DIS 0x0001
//CD Test Control and BIST Extensions register
#define DP83620_CDCTRL1_BIST_ERROR_COUNT 0xFF00
#define DP83620_CDCTRL1_MII_CLOCK_EN 0x0040
#define DP83620_CDCTRL1_BIST_CONT 0x0020
#define DP83620_CDCTRL1_CDPATTEN_10 0x0010
#define DP83620_CDCTRL1_MDIO_PULL_EN 0x0008
#define DP83620_CDCTRL1_PATT_GAP_10M 0x0004
#define DP83620_CDCTRL1_CDPATTSEL 0x0003
//PHY Control 2 register
#define DP83620_PHYCR2_SYNC_ENET_EN 0x2000
#define DP83620_PHYCR2_CLK_OUT_RXCLK 0x1000
#define DP83620_PHYCR2_BC_WRITE 0x0800
#define DP83620_PHYCR2_PHYTER_COMP 0x0400
#define DP83620_PHYCR2_SOFT_RESET 0x0200
#define DP83620_PHYCR2_CLK_OUT_DIS 0x0002
//Energy Detect Control register
#define DP83620_EDCR_ED_EN 0x8000
#define DP83620_EDCR_ED_AUTO_UP 0x4000
#define DP83620_EDCR_ED_AUTO_DOWN 0x2000
#define DP83620_EDCR_ED_MAN 0x1000
#define DP83620_EDCR_ED_BURST_DIS 0x0800
#define DP83620_EDCR_ED_PWR_STATE 0x0400
#define DP83620_EDCR_ED_ERR_MET 0x0200
#define DP83620_EDCR_ED_DATA_MET 0x0100
#define DP83620_EDCR_ED_ERR_COUNT 0x00F0
#define DP83620_EDCR_ED_DATA_COUNT 0x000F
//PHY Control Frames Configuration register
#define DP83620_PCFCR_PCF_STS_ERR 0x8000
#define DP83620_PCFCR_PCF_STS_OK 0x4000
#define DP83620_PCFCR_PCF_DA_SEL 0x0100
#define DP83620_PCFCR_PCF_INT_CTL 0x00C0
#define DP83620_PCFCR_PCF_BC_DIS 0x0020
#define DP83620_PCFCR_PCF_BUF 0x001E
#define DP83620_PCFCR_PCF_EN 0x0001
//Signal Detect Configuration register
#define DP83620_SD_CNFG_SD_TIME 0x0100
//100 Mb Length Detect register
#define DP83620_LEN100_DET_CABLE_LEN 0x00FF
//100 Mb Frequency Offset Indication register
#define DP83620_FREQ100_SAMPLE_FREQ 0x8000
#define DP83620_FREQ100_SEL_FC 0x0100
#define DP83620_FREQ100_FREQ_OFFSET 0x00FF
//TDR Control register
#define DP83620_TDR_CTRL_TDR_ENABLE 0x8000
#define DP83620_TDR_CTRL_TDR_100MB 0x4000
#define DP83620_TDR_CTRL_TX_CHANNEL 0x2000
#define DP83620_TDR_CTRL_RX_CHANNEL 0x1000
#define DP83620_TDR_CTRL_SEND_TDR 0x0800
#define DP83620_TDR_CTRL_TDR_WIDTH 0x0700
#define DP83620_TDR_CTRL_TDR_MIN_MODE 0x0080
#define DP83620_TDR_CTRL_RX_THRESHOLD 0x003F
//TDR Window register
#define DP83620_TDR_WIN_TDR_START 0xFF00
#define DP83620_TDR_WIN_TDR_STOP 0x00FF
//TDR Peak register
#define DP83620_TDR_PEAK_TDR_PEAK 0x3F00
#define DP83620_TDR_PEAK_TDR_PEAK_TIME 0x00FF
//TDR Threshold register
#define DP83620_TDR_THR_TDR_THR_MET 0x0100
#define DP83620_TDR_THR_TDR_THR_TIME 0x00FF
//Variance Control register
#define DP83620_VAR_CTRL_VAR_RDY 0x8000
#define DP83620_VAR_CTRL_VAR_FREEZE 0x0008
#define DP83620_VAR_CTRL_VAR_TIMER 0x0006
#define DP83620_VAR_CTRL_VAR_ENABLE 0x0001
//Link Quality Monitor register
#define DP83620_LQMR_LQM_ENABLE 0x8000
#define DP83620_LQMR_RESTART_ON_FC 0x4000
#define DP83620_LQMR_RESTART_ON_FREQ 0x2000
#define DP83620_LQMR_RESTART_ON_DBLW 0x1000
#define DP83620_LQMR_RESTART_ON_DAGC 0x0800
#define DP83620_LQMR_RESTART_ON_C1 0x0400
#define DP83620_LQMR_FC_HI_WARN 0x0200
#define DP83620_LQMR_FC_LO_WARN 0x0100
#define DP83620_LQMR_FREQ_HI_WARN 0x0080
#define DP83620_LQMR_FREQ_LO_WARN 0x0040
#define DP83620_LQMR_DBLW_HI_WARN 0x0020
#define DP83620_LQMR_DBLW_LO_WARN 0x0010
#define DP83620_LQMR_DAGC_HI_WARN 0x0008
#define DP83620_LQMR_DAGC_LO_WARN 0x0004
#define DP83620_LQMR_C1_HI_WARN 0x0002
#define DP83620_LQMR_C1_LO_WARN 0x0001
//Link Quality Data register
#define DP83620_LQDR_SAMPLE_PARAM 0x2000
#define DP83620_LQDR_WRITE_LQ_THR 0x1000
#define DP83620_LQDR_LQ_PARAM_SEL 0x0E00
#define DP83620_LQDR_LQ_THR_SEL 0x0100
#define DP83620_LQDR_LQ_THR_DATA 0x00FF
//Link Quality Monitor 2 register
#define DP83620_LQMR2_RESTART_ON_VAR 0x0400
#define DP83620_LQMR2_VAR_HI_WARN 0x0002
//PHY Status Frame Configuration register
#define DP83620_PSF_CFG_MAC_SRC_ADD 0x1800
#define DP83620_PSF_CFG_MIN_PRE 0x0700
#define DP83620_PSF_CFG_PSF_ENDIAN 0x0080
#define DP83620_PSF_CFG_PSF_IPV4 0x0040
#define DP83620_PSF_CFG_PSF_PCF_RD 0x0020
#define DP83620_PSF_CFG_PSF_ERR_EN 0x0010
//C++ guard
#ifdef __cplusplus
extern "C" {
#endif
//DP83620 Ethernet PHY driver
extern const PhyDriver dp83620PhyDriver;
//DP83620 related functions
error_t dp83620Init(NetInterface *interface);
void dp83620Tick(NetInterface *interface);
void dp83620EnableIrq(NetInterface *interface);
void dp83620DisableIrq(NetInterface *interface);
void dp83620EventHandler(NetInterface *interface);
void dp83620WritePhyReg(NetInterface *interface, uint8_t address,
uint16_t data);
uint16_t dp83620ReadPhyReg(NetInterface *interface, uint8_t address);
void dp83620DumpPhyReg(NetInterface *interface);
//C++ guard
#ifdef __cplusplus
}
#endif
#endif
Thank you for your support.
Best regards,
Jonathan