This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/DP83867IR:适用于内核版本3.4.39的 dp83867器件驱动程序

Guru**** 2466550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/592322/linux-dp83867ir-dp83867-device-driver-for-kernel-version-3-4-39

器件型号: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"); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Seung,

    我们将对此进行研究。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不确定您所说的最新驱动程序是什么意思。  这似乎不是出现在4.11内核中的最新驱动程序。

    您能否通过 MDIO 线路写入和读取器件的寄存器?

    您是否为 MII 接口的 Rx/Tx 线路正确设置了引脚多路复用器?

    您是否为驱动程序设置了 phy-mode?  您是否正在使用 RGMII? 还是 RGMII-id?

    您是否获得 IP 地址?  它是否协商到正确的速度?

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此代码回移植后工作正常。

    该问题是由驱动多路复用引脚的电流引起的。

    感谢您的所有回复。  ;-)