DP83848 PHY for AT91RM9200 board
Hi,
I'm using u-boot-1.1.4 (quite old but I must use it) with my AT91RM9200 based board.
I replaced DM9161 with a new DP83848 PHY ethernet physical layer transceiver.
So I'm backporting Sergey Kubushyn's driver
National Semiconductor DP83848 PHY Driver for TI DaVinci (TMS320DM644x) adapting it for my AT91RM9200 based board.
I left eth_init() like it was for DM9161 because connections are the same. The problem I'm facing to is that PHY is not detected when I call dp83848_is_phy_connected (see below).
I wonder if anybody used DP83848 PHY before and maybe could give me a hint.
int dp83848_is_phy_connected(AT91PS_EMAC phy_addr)
{
u_int16_t id1, id2;
printf ("*** dp83848_is_phy_connected\n");
at91rm9200_EmacEnableMDIO (phy_addr);
at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID1_REG, &id1) ;
at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID2_REG, &id2) ;
at91rm9200_EmacDisableMDIO (phy_addr);
printf ("phy_addr=%X - id1=%X - id2=%X\n", phy_addr, id1, id2);
// here I always get 0xFFFBC000 0xFFFF 0xFFFF
if ((id1 == DP83848_PHYID1_OUI) && (id2 == DP83848_PHYID2_OUI))
return(1);
return(0);
}TIA
Signature · 4 lines
Marco Cavallini Koan s.a.s. - Bergamo - Italia Embedded and Real-Time Software Engineering http://www.KoanSoftware.com - http://www.KaeilOS.com
On Mon, 1 Oct 2007, Marco Cavallini wrote:
Here is DP83848 driver code for AT91RM9200 for u-boot-1.1.4 :) Just from my archives...
Something might be missing but the driver source and the header files are there...
Quoted 38 lines
Hi,
I'm using u-boot-1.1.4 (quite old but I must use it) with my AT91RM9200 based board.
I replaced DM9161 with a new DP83848 PHY ethernet physical layer transceiver.So I'm backporting Sergey Kubushyn's driver
National Semiconductor DP83848 PHY Driver for TI DaVinci (TMS320DM644x) adapting it for my AT91RM9200 based board.I left
eth_init()like it was for DM9161 because connections are the same.
The problem I'm facing to is that PHY is not detected when I calldp83848_is_phy_connected(see below).I wonder if anybody used DP83848 PHY before and maybe could give me a hint.
int
dp83848_is_phy_connected(AT91PS_EMAC phy_addr){ u_int16_t id1, id2; printf ("*** dp83848_is_phy_connected\n"); at91rm9200_EmacEnableMDIO (phy_addr); at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID1_REG, &id1) ; at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID2_REG, &id2) ; at91rm9200_EmacDisableMDIO (phy_addr); printf ("phy_addr=%X - id1=%X - id2=%X\n", phy_addr, id1, id2); // here I always get 0xFFFBC000 0xFFFF 0xFFFF if ((id1 == DP83848_PHYID1_OUI) && (id2 == DP83848_PHYID2_OUI)) return(1); return(0); }
Quoted 17 lines
TIA
Signature · 14 lines
Marco Cavallini Koan s.a.s. - Bergamo - Italia Embedded and Real-Time Software Engineering http://www.KoanSoftware.com - http://www.KaeilOS.com ------------------------------------------------------------------------ - This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ U-Boot-Users mailing list U-Boot-Users at lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users
---
******************************************************************
* KSI at home KOI8 Net < > The impossible we do immediately. *
* Las Vegas NV, USA < > Miracles require 24-hour notice. *
******************************************************************
-------------- next part --------------
board/vadatech/dp83848.c +279 -0
@@ -0,0 +1,279 @@ +/* +* (C) Copyright 2003 +* Author : Hamid Ikdoumi (Atmel) +* +* See file CREDITS for list of people who contributed to this +* project. +* +* 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., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +* +* Sergey Kubushin <[email protected]>: Changed for DP83848 PHY 08/31/2005 +*/ + +#include <at91rm9200_net.h> +#include <net.h> +#include <dp83848.h> + +#ifdef CONFIG_DRIVER_ETHER + +#if (CONFIG_COMMANDS &CFG_CMD_NET ) + +/* +* Name: +* dp84848_IsPhyConnected +* Description: +* Reads the 2 PHY ID registers +* Arguments: +* p_mac - pointer to AT91S_EMAC struct +* Return value: +* TRUE - if id read successfully +* FALSE- if error +*/ +static unsigned int dp83848_IsPhyConnected (AT91PS_EMAC p_mac ) +{ +unsigned short Id1, Id2; + +at91rm9200_EmacEnableMDIO ( p_mac ); +at91rm9200_EmacReadPhy ( p_mac,DP83848_PHYID1_REG , &Id1 ); +at91rm9200_EmacReadPhy ( p_mac,DP83848_PHYID2_REG , &Id2 ); +at91rm9200_EmacDisableMDIO (p_mac); + +if ( (Id1 ==DP83848_PHYID1_OUI ) && (Id2 ==DP83848_PHYID2_OUI ) ) + { +return TRUE; + } + +return FALSE; +} + +/* +* Name: +* dp83848_GetLinkSpeed +* Description: +* Link parallel detection status of MAC is checked and set in the +* MAC configuration registers +* Arguments: +* p_mac - pointer to MAC +* Return value: +* TRUE - if link status set succesfully +* FALSE - if link status not set +*/ +static UCHAR dp83848_GetLinkSpeed (AT91PS_EMAC p_mac ) +{ +unsigned short stat1, stat2; + +if ( !at91rm9200_EmacReadPhy ( p_mac,DP83848_STAT_REG , &stat1 ) ) + { +return FALSE; + } + +if ( !(stat1 &DP83848_LINK_STATUS ) )/* link status up? */ + { +return FALSE; + } + +if ( !at91rm9200_EmacReadPhy ( p_mac,DP83848_PHY_STAT_REG , &stat2 ) ) + { +return FALSE; + } + +if ( !(stat2 &DP83848_SPEED ) && (stat2 &DP83848_DUPLEX ) ) + { +/*set Emac for 100BaseTX and Full Duplex */ + p_mac->EMAC_CFG |=AT91C_EMAC_SPD |AT91C_EMAC_FD ; +return TRUE; + } + +if ( (stat2 &DP83848_SPEED ) && (stat2 &DP83848_DUPLEX ) ) + { +/*set MII for 10BaseT and Full Duplex */ + p_mac->EMAC_CFG = (p_mac->EMAC_CFG & + ~(AT91C_EMAC_SPD |AT91C_EMAC_FD )) | +AT91C_EMAC_FD ; +return TRUE; + } + +if ( !(stat2 &DP83848_SPEED ) && !(stat2 &DP83848_DUPLEX ) ) + { +/*set MII for 100BaseTX and Half Duplex */ + p_mac->EMAC_CFG = (p_mac->EMAC_CFG & + ~(AT91C_EMAC_SPD |AT91C_EMAC_FD )) | +AT91C_EMAC_SPD ; +return TRUE; + } + +if ( (stat2 &DP83848_SPEED ) && !(stat2 &DP83848_DUPLEX ) ) + { +/*set MII for 10BaseT and Half Duplex */ + p_mac->EMAC_CFG &= ~(AT91C_EMAC_SPD |AT91C_EMAC_FD ); +return TRUE; + } + +return FALSE; +} + + +/* +* Name: +* dp83848_InitPhy +* Description: +* MAC starts checking its link by using parallel detection and +* Autonegotiation and the same is set in the MAC configuration registers +* Arguments: +* p_mac - pointer to struct AT91S_EMAC +* Return value: +* TRUE - if link status set succesfully +* FALSE - if link status not set +*/ +static UCHAR dp83848_InitPhy (AT91PS_EMAC p_mac ) +{ +UCHAR ret = TRUE; +unsigned short IntValue =0 ; + +at91rm9200_EmacEnableMDIO ( p_mac ); + +if ( !dp83848_GetLinkSpeed ( p_mac ) ) + { +/* Wait and try once more */ +udelay (100000 ); + ret =dp83848_GetLinkSpeed (p_mac); + } + +/* Disable PHY Interrupts */ +at91rm9200_EmacWritePhy (p_mac,DP83848_PHY_INTR_CTRL_REG , &IntValue); + +at91rm9200_EmacDisableMDIO ( p_mac ); + +return ( ret ); +} + + +/* +* Name: +* dp83848_AutoNegotiate +* Description: +* MAC Autonegotiates with the partner status of same is set in the +* MAC configuration registers +* Arguments: +* dev - pointer to struct net_device +* Return value: +* TRUE - if link status set successfully +* FALSE - if link status not set +*/ +static UCHAR dp83848_AutoNegotiate (AT91PS_EMAC p_mac,int *status ) +{ +unsigned short value; +unsigned short PhyAnar; +unsigned short PhyAnalpar; + +/* Set dp83848 control register */ +if ( !at91rm9200_EmacReadPhy ( p_mac,DP83848_CTL_REG , &value ) ) + { +return FALSE; + } + + value &= ~DP83848_AUTONEG ;/* remove autonegotiation enable */ + value |=DP83848_ISOLATE ;/* Electrically isolate PHY */ +if ( !at91rm9200_EmacWritePhy ( p_mac,DP83848_CTL_REG , &value ) ) + { +return FALSE; + } + +/* Set the Auto_negotiation Advertisement Register +* MII advertising for Next page, 100BaseTxFD and HD, +* 10BaseTFD and HD, IEEE 802.3 +*/ + PhyAnar =DP83848_NP |DP83848_TX_FDX |DP83848_TX_HDX | +DP83848_10_FDX |DP83848_10_HDX |DP83848_AN_IEEE_802_3 ; +if ( !at91rm9200_EmacWritePhy ( p_mac,DP83848_ANA_REG , &PhyAnar ) ) + { +return FALSE; + } + +/* Read the Control Register */ +if ( !at91rm9200_EmacReadPhy ( p_mac,DP83848_CTL_REG , &value ) ) + { +return FALSE; + } + + value |=DP83848_SPEED_SELECT |DP83848_AUTONEG |DP83848_DUPLEX_MODE ; +if ( !at91rm9200_EmacWritePhy ( p_mac,DP83848_CTL_REG , &value ) ) + { +return FALSE; + } + +/* Restart Auto_negotiation */ + value |=DP83848_RESTART_AUTONEG ; +if ( !at91rm9200_EmacWritePhy ( p_mac,DP83848_CTL_REG , &value ) ) + { +return FALSE; + } + +/*check AutoNegotiate complete */ +udelay (10000 ); +at91rm9200_EmacReadPhy ( p_mac,DP83848_STAT_REG , &value ); +if ( !(value &DP83848_AUTONEG_COMP ) ) + { +return FALSE; + } + +/* Get the AutoNeg Link partner base page */ +if ( !at91rm9200_EmacReadPhy ( p_mac,DP83848_ANLPA_REG , &PhyAnalpar ) ) + { +return FALSE; + } + +if ( (PhyAnar &DP83848_TX_FDX ) && (PhyAnalpar &DP83848_TX_FDX ) ) + { +/*set MII for 100BaseTX and Full Duplex */ + p_mac->EMAC_CFG |=AT91C_EMAC_SPD |AT91C_EMAC_FD ; +return TRUE; + } + +if ( (PhyAnar &DP83848_10_FDX ) && (PhyAnalpar &DP83848_10_FDX ) ) + { +/*set MII for 10BaseT and Full Duplex */ + p_mac->EMAC_CFG = (p_mac->EMAC_CFG & + ~(AT91C_EMAC_SPD |AT91C_EMAC_FD )) | +AT91C_EMAC_FD ; +return TRUE; + } + +return FALSE; +} + + +/* +* Name: +* at91rm9200_GetPhyInterface +* Description: +* Initialise the interface functions to the PHY +* Arguments: +* None +* Return value: +* None +*/ +void at91rm9200_GetPhyInterface (AT91PS_PhyOps p_phyops ) +{ + p_phyops->Init = dp83848_InitPhy; + p_phyops->IsPhyConnected = dp83848_IsPhyConnected; + p_phyops->GetLinkSpeed = dp83848_GetLinkSpeed; + p_phyops->AutoNegotiate = dp83848_AutoNegotiate; +} + +#endif /* CONFIG_COMMANDS & CFG_CMD_NET */ + +#endif /* CONFIG_DRIVER_ETHER */
-------------- next part --------------
include/dp83848.h +96 -0
96 lines not on this page · raw message
ksi at koi8.net ha scritto:
Quoted 49 lines · Marco Cavallini
Here is DP83848 driver code for AT91RM9200 for u-boot-1.1.4 :) Just from my archives...
Something might be missing but the driver source and the header files are there...
Quoted 41 lines
Hi,
I'm using u-boot-1.1.4 (quite old but I must use it) with my AT91RM9200 based board.
I replaced DM9161 with a new DP83848 PHY ethernet physical layer transceiver.So I'm backporting Sergey Kubushyn's driver
National Semiconductor DP83848 PHY Driver for TI DaVinci (TMS320DM644x) adapting it for my AT91RM9200 based board.I left
eth_init()like it was for DM9161 because connections are the same.
The problem I'm facing to is that PHY is not detected when I calldp83848_is_phy_connected(see below).I wonder if anybody used DP83848 PHY before and maybe could give me a hint.
int
dp83848_is_phy_connected(AT91PS_EMAC phy_addr){ u_int16_t id1, id2; printf ("*** dp83848_is_phy_connected\n"); at91rm9200_EmacEnableMDIO (phy_addr); at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID1_REG, &id1) ; at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID2_REG, &id2) ; at91rm9200_EmacDisableMDIO (phy_addr); printf ("phy_addr=%X - id1=%X - id2=%X\n", phy_addr, id1, id2); // here I always get 0xFFFBC000 0xFFFF 0xFFFF if ((id1 == DP83848_PHYID1_OUI) && (id2 == DP83848_PHYID2_OUI)) return(1); return(0); }TIA
Signature · 1 line
Marco Cavallini
Hi Sergey,
thank you for answering.
we have just discovered an hardware mistake on PFBOUT-PFBIN2 pins now I can detect the PHY using your code
Thank you very much
Best regards
Signature · 4 lines
Marco Cavallini Koan s.a.s. - Bergamo - Italia Embedded and Real-Time Software Engineering http://www.KoanSoftware.com - http://www.KaeilOS.com
Quoted 56 lines · Marco Cavallini
ksi at koi8.net ha scritto:
Quoted 3 lines · Marco Cavallini
Here is DP83848 driver code for AT91RM9200 for u-boot-1.1.4 :) Just
from my
Quoted 3 lines
archives...
Something might be missing but the driver source and the header files
are
Quoted 10 lines
there...
Quoted 8 lines
Hi,
I'm using u-boot-1.1.4 (quite old but I must use it) with my AT91RM9200 based board.
I replaced DM9161 with a new DP83848 PHY ethernet physical layer transceiver.So I'm backporting Sergey Kubushyn's driver National Semiconductor DP83848 PHY Driver for TI DaVinci
(TMS320DM644x)
Quoted 27 lines
Quoted 27 lines
adapting it for my AT91RM9200 based board.
I left
eth_init()like it was for DM9161 because connections are the same.
The problem I'm facing to is that PHY is not detected when I calldp83848_is_phy_connected(see below).I wonder if anybody used DP83848 PHY before and maybe could give me a hint.
int
dp83848_is_phy_connected(AT91PS_EMAC phy_addr){ u_int16_t id1, id2; printf ("*** dp83848_is_phy_connected\n"); at91rm9200_EmacEnableMDIO (phy_addr); at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID1_REG, &id1) ; at91rm9200_EmacReadPhy(phy_addr, DP83848_PHYID2_REG, &id2) ; at91rm9200_EmacDisableMDIO (phy_addr); printf ("phy_addr=%X - id1=%X - id2=%X\n", phy_addr, id1, id2); // here I always get 0xFFFBC000 0xFFFF 0xFFFF if ((id1 == DP83848_PHYID1_OUI) && (id2 == DP83848_PHYID2_OUI)) return(1);Quoted 6 lines
Quoted 6 lines
return(0); }TIA
Signature · 1 line
Marco Cavallini
Quoted 4 lines
Hi Sergey,
thank you for answering.
we have just discovered an hardware mistake on PFBOUT-PFBIN2 pins now I can detect the PHY using your code
Please be aware that for AT91RM9200 you should read the negotiated connection status from the PHY and setup EMAC accordingly. That is in that old code.
Davinci, on the other hand, doesn't require it (as a matter of fact it doesn't even have provision for setting those parameters for EMAC,) it's more automated so PHY code is different. And PHY presence is detected by reading DaVinci register that monitors PHY presence.
---
******************************************************************
* KSI at home KOI8 Net < > The impossible we do immediately. *
* Las Vegas NV, USA < > Miracles require 24-hour notice. *
******************************************************************