📄 net_phy.c
字号:
if (*perr != NET_PHY_ERR_NONE) {
reg_val = 0;
}
if ((reg_val & BMSR_ANEGCOMPLETE) == BMSR_ANEGCOMPLETE) { /* DM9161AE register 0x01: Basic Status Register #1 */
return (DEF_ON); /* BIT 5 Signal the result of the auto negotiation */
} else { /* 1 = complete, 0 = incomplete */
return (DEF_OFF);
}
}
/*
*********************************************************************************************************
* NetNIC_PhyLinkState()
*
* Description : Returns state of ethernet link
* This instance probe the Davicom DM9161AE '3.3V Dual-Speed Fast Ethernet Transceiver'
*
* Argument(s) : none.
*
* Return(s) : State of ethernet link (DEF_OFF = link down, DEF_ON = link up).
*
* Caller(s) : NetNIC_PhyISR_Handler.
*
* Note(s) : If any error is encountered while reading the PHY, this function
* will return link state = DEF_OFF.
*********************************************************************************************************
*/
CPU_BOOLEAN NetNIC_PhyLinkState (NET_ERR *perr)
{
CPU_INT16U reg_val;
/* DM9161AE register 0x01: Basic Status Register #1 */
/* BIT 2 , Link Status, 1 = linked, 0 = not linked. */
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, perr);
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, perr);
if (*perr != NET_PHY_ERR_NONE) {
reg_val = 0;
}
reg_val &= BMSR_LSTATUS;
if (reg_val == BMSR_LSTATUS) {
return (DEF_ON);
} else {
return (DEF_OFF);
}
}
CPU_BOOLEAN NetNIC_PhyLinkState2 ()
{
NET_ERR err;
CPU_INT16U reg_val;
reg_val = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, &err);
if (err == NET_PHY_ERR_NONE) {
if ((reg_val & BMSR_LSTATUS) != 0) {
return (DEF_ON);
} else {
return (DEF_OFF);
}
} else {
return (DEF_OFF);
}
}
/*
*********************************************************************************************************
* NetPHY_GetLinkSpeed()
*
* Description : Returns the speed of the current Ethernet link
* This probes the Davicom DM9161AE '3.3V Dual-Speed Fast Ethernet Transceiver'
*
* Argument(s) : none.
*
* Return(s) : 0 = No Link, 10 = 10mbps, 100 = 100mbps
*
* Caller(s) : AT91SAM7X256_EMAC_Init()
*
* Note(s) : none.
*********************************************************************************************************
*/
CPU_INT32S NetPHY_GetLinkSpeed (NET_ERR *perr)
{
CPU_INT32U bmsr;
CPU_INT32U bmcr;
CPU_INT32U lpa;
bmsr = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, perr); /* Get Link Status from PHY status reg. Requires 2 reads */
bmsr = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, perr); /* Get Link Status from PHY status reg. Requires 2 reads */
if ((bmsr & BMSR_LSTATUS) == 0) {
return (NET_PHY_SPD_0); /* No link */
}
bmcr = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMCR, perr); /* Read the PHY Control Register */
if ((bmcr & BMCR_ANENABLE) == BMCR_ANENABLE) { /* If AutoNegotiation is enabled */
if ((bmsr & BMSR_ANEGCOMPLETE) == 0) { /* If AutoNegotiation is not complete */
return (NET_PHY_SPD_0); /* AutoNegotitation in progress */
}
lpa = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_LPA, perr); /* Read the Link Partner Ability Register */
if (((lpa & LPA_100FULL) == LPA_100FULL) || ((lpa & LPA_100HALF) == LPA_100HALF)) {
return (NET_PHY_SPD_100);
} else {
return (NET_PHY_SPD_10);
}
} else { /* Auto-negotiation not enabled, get speed from BMCR */
if ((bmcr & BMCR_SPEED100) == BMCR_SPEED100) {
return (NET_PHY_SPD_100);
} else {
return (NET_PHY_SPD_10);
}
}
}
/*
*********************************************************************************************************
* NetPHY_GetDuplex()
*
* Description : Returns the duplex mode of the current Ethernet link
* This probes the Davicom DM9161AE '3.3V Dual-Speed Fast Ethernet Transceiver'
*
* Argument(s) : none.
*
* Return(s) : 0 = Unknown (Auto-Neg in progress), 1 = Half Duplex, 2 = Full Duplex
*
* Caller(s) : AT91SAM7X256_EMAC_Init()
*
* Note(s) : none.
*********************************************************************************************************
*/
CPU_INT32S NetPHY_GetLinkDuplex (NET_ERR *perr)
{
CPU_INT32U bmcr;
CPU_INT32U bmsr;
CPU_INT32U lpa;
bmsr = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, perr); /* Get Link Status from PHY status reg. Requires 2 reads */
bmsr = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMSR, perr); /* Get Link Status from PHY status reg. Requires 2 reads */
if ((bmsr & BMSR_LSTATUS) == 0) {
return (NET_PHY_DUPLEX_UNKNOWN); /* No link, return 'Duplex Uknown' */
}
bmcr = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_BMCR, perr); /* Read the PHY Control Register */
if ((bmcr & BMCR_ANENABLE) == BMCR_ANENABLE) { /* If AutoNegotiation is enabled */
if ((bmsr & BMSR_ANEGCOMPLETE) == 0) { /* If AutoNegotiation is not complete */
return (NET_PHY_DUPLEX_UNKNOWN); /* AutoNegotitation in progress */
}
lpa = NetNIC_PhyRegRd(AT91C_PHY_ADDR, MII_LPA, perr); /* Read the Link Partner Ability Register */
if (((lpa & LPA_100FULL) == LPA_100FULL) || ((lpa & LPA_10FULL) == LPA_10FULL)) {
return (NET_PHY_DUPLEX_FULL);
} else {
return (NET_PHY_DUPLEX_HALF);
}
} else { /* Auto-negotiation not enabled, get duplex from BMCR */
if ((bmcr & BMCR_FULLDPLX) == BMCR_FULLDPLX) {
return (NET_PHY_DUPLEX_FULL);
} else {
return (NET_PHY_DUPLEX_HALF);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -