作者简介:
大家好,我叫张昺华,中间那个字和“饼”字一个读音。
2014年我毕业于广东省惠州学院,我从小酷爱理科,当看到陈莉君老师在《Linux内核之旅》上发的学生在课堂上用课本剧的方式来诠释技术时,想到了自己初中的时候老师就是这样锻炼我们的,很喜欢那样的学习氛围,自己大学时和小伙伴们一起创立了科技创新协会,目的就是可以一群人在研究技术,一起做有意思的东西,一起分享技术带给我们的快乐,也希望中国有更多的人热爱技术,喜欢一起研究、分享技术,然后可以一起用我们的技术来做一些好玩的东西,可以为这个社会创造一些东西来改善人们的生活。
如下是本人调试过程中的一点经验分享,以太网驱动架构毕竟涉及的东西太多,如下仅仅是针对加载流程和围绕这个问题产生的分析过程和驱动加载流程部分,并不涉及以太网协议层的数据流程分析。
看了后我们知道是fec_enet_mii_probe函数返回的-19,继续跟踪进去: 哈哈,看到这里答案出来了,-19就是这里返回的,也就是说phy_dev是NULL 那为什么呢?我们跟进去看下,of_phy_connect,功能注释已经写的很清楚了 Connect to the phy described in the device tree,从设备树上获取phy的相关描述信息,路径:drivers/of/of_mdio.c 没有从这里面拿到phy_device 看下如下两个函数 这我需要解释下,bus_find_device(&mdio_bus_type, NULL, phy_np, of_phy_match); 从bus总线上找到device,也就是我们的phy_device, 如果找到就返回phy_device,否则就返回NULL 这个bus是指mdio_bus_type,如下:
那mdio又是什么呢? ===================================如下内容转自:https://blog.csdn.net/fun_tion/article/details/70270632 1.概述 MII即“媒体独立接口”,也叫“独立于介质的接口”。它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口。RMII全称为“简化的媒体独立接口”,是IEEE-802.3u标准中除MII接口之外的另一种实现。(此处内容来源于网络) 2.独立于介质的接口(MII) 独立于介质的接口(MII)用于MAC与外接的PHY互联,支持10Mbit/s和100Mbit/s数据传输模式。MII的信号线如下图所示: 精简的独立于介质接口(RMII)规范减少了以太网通信所需要的引脚数。根据IEEE802.3标准,MII接口需要16个数据和控制信号引脚,而RMII标准则将引脚数减少到了7个。RMII具有以下特性: 如上内容转自:https://blog.csdn.net/fun_tion/article/details/70270632
接下来回归到软件层面,那以太网的通信收发数据包就是使用MDC/MDIO这样的硬件接口 软件的接口是:mdiobus_read与mdiobus_write 那这块最终的read / write的实现函数在哪里呢?去以太网控制器drvier里看就好了fec_main.c中: 回归到刚刚的-19错误最终发现是phy_device为NULL了,也就是在mdio bus上没有找到对应的phy_device,那么从这里我们可以猜想注册的时候是否根本就没注册进去呢?或者是注册成功了后,在某个阶段phy_device消失了?带着这个疑问我们就要看下以太网控制器加载的流程了。
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