zoukankan      html  css  js  c++  java
  • 以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取【原创】

    以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取

    **Author:张昺华
    Email:920052390@qq.com
    Time:2019年3月23日星期六
    **

    此文也在我的个人公众号以及《Linux内核之旅》上有发表:以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取

    很喜欢一群人在研究技术,一起做有意思的东西,一起分享技术带给我们的快乐,也希望中国有更多的人热爱技术,喜欢一起研究、分享技术,然后可以一起用我们的技术来做一些好玩的东西,可以为这个社会创造一些东西来改善人们的生活。

    如下是本人调试过程中的一点经验分享,以太网驱动架构毕竟涉及的东西太多,如下仅仅是针对加载流程和围绕这个问题产生的分析过程和驱动加载流程部分,并不涉及以太网协议层的数据流程分析。

    【硬件环境】 Imx6ul

    【Linux kernel版本】 Linux4.1.15

    【以太网phy】 Realtek8201f

    1.1. 以太网驱动probe流程

    1.1 mii_bus初始化以及phy id的获取

    然后进行mii的一些初始化fec_enet_mii_init(pdev);
    主要是对struct mii_bus这里的成员进行初始化

    并且会做注册mdiobus的工作

    因为我们系统是使用设备数,因此会执行of_mdiobus_register

    进行midobus_register

    由于设备树代码是这样的:

    如下路径:drivers/of/of_mdio.c

    因此我们是走get_phy_device这个函数:
    所以我说内核代码写的好,就是注释和函数名基本就是意思了,获取phy device,

    最关键的函数就是它,也就是本文的核心,这里是从寄存器中通过mdiobus的read方法来从phy中获取phy id,但是这里并没有获取到phy_id ,这寄存器都是以太网的通用寄存器

    既然没有从寄存器中获取到phy_id,因此phy_device_create也不会在mii bus数据结构中创建phy_device,
    那么应用层在进行socket的时候,回调了open函数 fec_enet_open,这个函数中的fec_enet_mii_probe就不会从of_phy_connect中获取到phy_device,因此就会出现-19的错误。那么获取不到phy_id的根本原因就是因为reset的时序没满足datasheet的要求,具体原因分析请见最上面的《标题2 原因分析》

    1.2 Realtek phy的内核配置

    那这是获取不到phy id的过程,那么正常的获取phy id的流程又是怎样的呢?
    我们可以看到这样的log:

    那这里又是怎样匹配的呢?
    make kernel_menuconfig中我们需要选中realtek这款phy


    选中Realtek PHYs,这样realtek.c就可以编译到kernel了

    代码路径:drivers/net/phy/realtek.c

    phy_id = 0x001cc816我们需要把这个phy id填入
    module_phy_driver(realtek_drvs);

    这里会将这个phy_drvier注册进去

    然后在这里把phy_device与phy_drvier关联了起来,再由phy_driver_register注册

    Freescale的以太网控制器驱动fec_main.c中
    static int fec_enet_mii_probe(struct net_device *ndev)

    1.3 以太网流程总图

    最后汇总一个图给大家:


    4. 网址分享

    http://stackoverflow.com/questions/5308090/set-ip-address-using-siocsifaddr-ioctl
    http://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.commtrf2/ioctl_socket_control_operations.htm
    https://lkml.org/lkml/2017/2/3/396
    linux PHY驱动
    http://www.latelee.org/programming-under-linux/linux-phy-driver.html
    Linux PHY几个状态的跟踪
    http://www.latelee.org/programming-under-linux/linux-phy-state.html
    第十六章PHY -基于Linux3.10
    https://blog.csdn.net/shichaog/article/details/44682931

    ### End
  • 相关阅读:
    数据表格优化
    vue数组和对象的监听变化
    python flask框架搭建以及大佬代码参考
    简单爬虫
    srs的基本配置
    记录飞天程序库调用
    面试题 递归算法1+2+....+100求和
    下载列表组件
    Prometheus之系统安装,启动
    nginx之日志
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/11942921.html
Copyright © 2011-2022 走看看