Part Number: DP83620
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