请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:DP83867IR 工具/软件:Linux
我找不到适用于3.4.39的 DP83867 Linux 器件驱动程序。
因此、我要将最新版本修改为内核版本3.4.39。
但 ping 不起作用... 我能得到任何提示吗??
//
*德州仪器(TI) DP83867 PHY 的驱动程序
*
*版权所有(C) 2015 Texas Instruments Inc.
*
*本程序是免费软件;您可以根据
* Free Software Foundation 发布的 GNU 通用公共许可证条款重新分发和/或修改*本许可证的第2版。
*
**本计划的发布目的是希望其有用
、*但没有任何保证;甚至没有*
适销性或特定用途适用性的暗示保证。 有关
更多详细信息、请参阅* GNU 通用公共许可证。
*/
#include
#include
#include
#include
#include
#define DP83867_PHY_ID 0x2000a231
#define DP83867_DEVADDR 0x1f
#define MII_DP83867_PHYCTRL 0x10
#define MII_DP83867_MICR 0x12
#define MII_DP83867_ISR 0x13
#define DP83867_CTRL 0x1f
/*扩展寄存器*/
#define DP83867_RGMIICTL 0x0032
#define DP83867_RGMIIDCTL 0x0086
#define DP83867_SW_RESET 位(15)
#define DP83867_SW_RESTART 位(14)
/* MICR 中断位*/
#define MII_DP83867_MICR_AN_ERR_INT_EN 位(15
)#define MII_DP83867_MICR_SPEED_CHNG_INT_EN 位(14)
#define MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN 位(13)
#define MII_DP83867_MICR_PAGE_RXD_INT_EN 位(12)
#define MII_DP83867_MICR_AutoNeg_COMP_INT_EN 位(11)
#define MII_DP83867_MICR_LINK_STS_CHNG_INT_EN 位(10)
#define MII_DP83867_MICR_SABLE_INT_EN 位(8)#define MII_INT_INT_SLEEP_INT_INT_EN 位(10)#define MII_DP83867_INT_INT_INT_MODE_DP83867_INT_MODE_INT_DP3867_INT_MODE_DP_INT_INT_INT_MODE_DP3867_DP_INT_INT_MO
位(3)
#define MII_DP83867_MICR_XGMII_ERR_INT_EN 位(2
)#define MII_DP83867_MICR_POL_CHNG_INT_EN 位(1)
#define MII_DP83867_MICR_Jabber_INT_EN 位(0)
/* RGMIICTL 位*/
#define DP83867_RGMII_TX_CLK_DELAY_EN 位(1)
#define DP83867_RGMII_RX_CLK_DELAY_EN 位(0)
/* PHY CTRL 位*/
#define DP83867_PHYCR_FIFO_DEPTY_SHIFT 14
#define DP83867_PHYCR_FIFO_DEPTY_3_B_NIB 0x00
#define DP83867_PHYCR_FIFO_DEPTY_4_B_NIB 0x01
#define DP83867_PHYCR_FIFO_DEPTY_6_B_NIB 0x02
#define DP83867_PHYCR_FIFO_DEPTY_8_B_NIB 0x03
/* RGMIIDCTL 位*/
#define DP83867_RGMII_RX_CLK_DELAY_SHIFT 4
枚举{
DP83867_RGMIIDCTL_250_PS、
DP83867_RGMIIDCTL_500_PS、
DP83867_RGMIIDCTL_750_PS、
DP83867_RGMIIDCTL_1_NS、
DP83867_RGMIIDCTL_1_25_NS、
DP83867_RGMIIDCTL_1_50_NS、
DP83867_RGMIIDCTL_1_75_NS、
DP83867_RGMIIDCTL_2_00_NS、
DP83867_RGMIIDCTL_2_25_NS、
DP83867_RGMIIDCTL_2_50_NS、
DP83867_RGMIIDCTL_2_75_NS、
DP83867_RGMIIDCTL_3_00_NS、
DP83867_RGMIIDCTL_3_25_NS、
DP83867_RGMIIDCTL_3_50_NS、
DP83867_RGMIIDCTL_3_75_NS、
DP83867_RGMIIDCTL_4_00_NS、
};
int Rx_TX_DELAY =(DP83867_RGMIIDCTL_2_75_NS << DP83867_RGMII_RX_CLK_DELAY_SHIFT)| DP83867_RGMIIDCTL_2_25_NS;module_tv_0667_t
(static t_t r_t
int err = phy_read (phydev、MII_DP83867_ISR);
如果(错误< 0)
退货错误;
返回0;
}
静态 int dp83867_config_intr (struct phy_device * phydev)
{
INT MICR_STATUS;
if (phydev->interrupts =PHY_INTERRUPT_ENABLED){
MICR_STATUS = phy_read (phydev、MII_DP83867_MICR);
printk ("___%s、%d\n"、__func__、__line__);
IF (MICR_STATUS < 0)
{
返回 MICR_STATUS
;}
MICR_STATUS |=
(MII_DP83867_MICR_AN_ERR_INT_EN |
MII_DP83867_MICR_SPED_CHNG_INT_EN |
MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN |
MII_DP83867_MICR_SLEEP_MODE_CHNG_INT_EN);
返回 phy_write (phydev、MII_DP83867_MICR、MICR_STATUS);
}
MICR_STATUS = 0x0;
返回 phy_write (phydev、MII_DP83867_MICR、MICR_STATUS);
}
static int phy_read_MMD_INDIRECT (struct phy_device * phydev、int prtad、int devad)
{
int 值;
mdiobus_write (phydev->bus、phydev->addr、0x0d、devad);
mdiobus_write (phydev->bus、phydev->addr、0x0E、prtad);
mdiobus_write (phydev->bus、phydev->addr、0x0d、(devad|0x4000));
值= phy_read (phydev、0x0E);
返回值;
}
void phy_write_MMD_inirect (struct phy_device * phydev、int prtad、int devad、unsigned int data)
{
mdiobus_write (phydev->bus、phydev->addr、0x0d、devad);
mdiobus_write (phydev->bus、phydev->addr、0x0E、prtad);
mdiobus_write (phydev->bus、phydev->addr、0x0d、(devad|0x4000));
phy_write (phydev、0x0E、data);
}
static int dp83867_config_init (struct phy_device * phydev)
{
int val;
if ((phydev->interface >= PHY_interface_mode_RGMII)||
(phydev->interface <= PHY_interface_mode_RGMII_TXID)
PHY_WRITE (phydev、MII_DP83867_PHYCTRL、
(DP83867_PHYCR_FIFO_DEPTY_4_B_NIB << DP83867_PHYCR_FIFO_DEPTY_SHIFT);
if ((phydev->interface >= PHY_interface_mode_RGMII_ID)||
(phydev->interface <= PHY_interface_mode_RGMII_RXID)){
Val = phy_read_MMD_INDIRECT (phydev、DP83867_RGMIICTL、
DP83867_DEVADDR);
if (phydev->interface =PHY_interface_mode_RGMII_ID)
Val |=(DP83867_RGMII_TX_CLK_DELAY_EN | DP83867_RGMII_RX_CLK_DELAY_EN);
if (phydev->interface =PHY_interface_mode_RGMII_TXID)
Val |= DP83867_RGMII_TX_CLK_DELAY_EN;
if (phydev->interface =PHY_interface_mode_RGMII_RXID)
Val |= DP83867_RGMII_RX_CLK_DELAY_EN;
PHY_WRITE_MMD_INDIRECT (phydev、DP83867_RGMIICTL、
DP83867_DEVADDR、val);
PHY_WRITE_MMD_INDIRECT (phydev、DP83867_RGMIIDCTL、
DP83867_DEVADDR、Rx_TX_DELAY);
}
PHY_START_INTERRUPTS (phydev);
返回0;
}
静态 int dp83867_phy_reset (struct phy_device * phydev)
{
Int 错误;
ERR = phy_write (phydev、DP83867_CTRL、DP83867_SW_RESET);
如果(错误< 0)
退货错误;
ERR = dp83867_config_init (phydev);
返回错误;
}
静态结构 phy_driver dp83867_driver ={
phy_id = DP83867_PHY_ID、
名称 ="TI DP83867"、
phy_id_mask = 0xfffffff0、
功能 = PHY_Gbit_features、
flags = PHY_FASH_INTERRUPT、
config_init = dp83867_config_init、
#if 0
.SOFT_RESET = dp83867_phy_reset、
#endif
/* IRQ 相关*/
.ack_interrupt = dp83867_ack_interrupt、
config_intr = dp83867_config_intr、
config_aneg = genphy_config_aneg、
read_status = genphy_read_status、
暂停 = genphy_suspend、
继续 = genphy_resume、
驱动程序 ={.owner =此模块、}
};
静态 int __init dp83867_init (void)
{
printk ("___%s @%s\n"、__func__、__file__);
返回 phy_driver_register (&dp83867_driver);
}
静态 void __exit dp83867_exit (void)
{
phy_driver_unregister (&dp83867_driver);
}
module_init (dp83867_init);
module_exit (dp83867_exit);
静态结构 mdio_device_id __ment_unused dp83867_tbl[]={
{DP83867_PHY_ID、0xffffff0}、
{}
;
MODULE_DEVICE_TABLE (MDIO、dp83867_tbl);
MODULE_DESCRIPTION ("Texas Instruments DP83867 PHY 驱动程序");
MODULE_Author ("Dan Murphy <dmurphy@ti.com);
MODULE_license ("GPL");