首页 理论教育 PHY芯片驱动:Linux驱动开发实践

PHY芯片驱动:Linux驱动开发实践

时间:2023-10-19 理论教育 版权反馈
【摘要】:使用独立外部PHY芯片时,需要有PHY芯片驱动。通常PHY芯片的寄存器定义都差不多,使用内核的通用PHY芯片驱动即可。内核有一个phy_state_machine工作队列将不断调用genphy_read_status函数来检测PHY状态。当使用独立PHY芯片时,网络设备需要从关联的PHY设备获取当前网络信息,在net_device结构中,phy_device结构的*phydev成员记录了这种连接关系。使用独立PHY芯片的网络设备与自带PHY功能的网络设备在处理ethtool命令时方法是不同的。

PHY芯片驱动:Linux驱动开发实践

使用独立外部PHY芯片时,需要有PHY芯片驱动。通常PHY芯片的寄存器定义都差不多,使用内核的通用PHY芯片驱动即可。通用PHY驱动见drivers/net/phy/phy_device.c。

978-7-111-56706-6-Chapter13-60.jpg

内核有一个phy_state_machine工作队列将不断调用genphy_read_status函数来检测PHY状态。当使用独立PHY芯片时,网络设备需要从关联的PHY设备获取当前网络信息,在net_device结构中,phy_device结构的*phydev成员记录了这种连接关系。phy_connect函数将PHY设备与网络设备连接起来:

978-7-111-56706-6-Chapter13-61.jpg

bus_id即PHY的ID。使用独立PHY芯片的网络设备与自带PHY功能的网络设备(如DM9000)在处理ethtool命令时方法是不同的。拿第一个ethtool命令来分析:

978-7-111-56706-6-Chapter13-62.jpg

ethtool_get_settings函数调用的是ethtool_ops->get_settings:

978-7-111-56706-6-Chapter13-63.jpg

先看DM9000的get_settings,调用的是mii_ethtool_gset:

978-7-111-56706-6-Chapter13-64.jpg

978-7-111-56706-6-Chapter13-65.jpg

与S3C6410X加DM9000的组合不同,TI的Davinci处理器通常都自带MAC控制器,但需要外接一个PHY芯片。Davinci EMAC驱动初始化时连接了一个PHY设备:priv->phydev=phy_connect(ndev,priv->phy_id,&emac_adjust_link,PHY_INTERFACE_MODE_MII);再看内核中Davinci EMAC驱动的get_settings接口实现如下:

978-7-111-56706-6-Chapter13-66.jpg

可见emac_get_settings直接通过PHY设备获取设置。(www.xing528.com)

例13.4 ET1011C芯片不支持1000M网络分析

使用ethtool命令查看eth0网络参数,结果如下:

978-7-111-56706-6-Chapter13-67.jpg

ET1011C芯片本身支持1000M网络,但以上输出结果却显示并未支持1000M网络。分析phy_device.c代码:

978-7-111-56706-6-Chapter13-68.jpg

978-7-111-56706-6-Chapter13-69.jpg

查找芯片手册中MII_ESTATUS寄存器信息,见表13-7:

13-7 ET1011CMII_ESTATUS寄存器

978-7-111-56706-6-Chapter13-70.jpg

可见13位是从SPEED_1000管脚读取的。这个管脚是个复用管脚,复位时,用来配置1000M网支持。复位时这个管脚电平为1,寄存器值就是1;这个管脚电平为0,则寄存器值为0。焊接相应的电阻,将该管脚电平拉高,使用ethtool命令查看网络参数:

978-7-111-56706-6-Chapter13-71.jpg

可见芯片已支持1000M网。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈