linux PHY驱动_genphy_config-程序员宅基地

linux PHY驱动



网址:http://www.aiuxian.com/article/p-2699303.html
李迟CSDN网址:http://blog.csdn.net/subfate/article/details/44900651

MDIO驱动

Linux的mdio主要是为了管理PHY芯片寄存器的,跟踪代码发现,它会进行创建PHY设备及一些初始化工作。

1 文件路径:drivers\net\phy\mdio_bus.c
2 --> mdiobus_register
3     --> device_register
4     --> mdiobus_scan
5         --> get_phy_device
6             --> get_phy_id // 读寄存器
7                 -->  phy_device_create // 创建phy设备
8                 --> INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); // !!!!!!初始化状态机函数
9         --> phy_device_register

下面结合ti公司的MDIO驱动看看它的过程(好像ti用的名称都叫davinci):

1 文件路径:drivers\net\ethernet\ti\davinci_mdio.c
2 device_initcall(davinci_mdio_init);
3     --> davinci_mdio_init
4     -->platform_driver_register(&davinci_mdio_driver);
5  
6 davinci_mdio_probe
7     --> mdiobus_register

PHY驱动

Linux内核有很多的PHY驱动,本文使用的是通用的驱动(驱动名:Generic PHY),其它的驱动形式类似,实现了某一网络芯片/控制器驱动。

PHY注册,PHY被调用过程:

1 代码路径:drivers/net/phy/phy_device.c
2 phy_init
3 --> mdio_bus_init 注册mdio总线
4     --> class_register(&mdio_bus_class);
5     --> bus_register(&mdio_bus_type);
6 --> phy_driver_register(&genphy_driver);
7  // 赋值总线、probe等
8     --> driver_register

还是用cpsw作为实例:

01 代码路径:drivers\net\ethernet\ti\cpsw.c
02 cpsw_probe
03 --> CPSW平台数据、资源、DMA初始化、赋值netdev_ops、ethtool_ops
04 --> 注册网络设备:register_netdev
05 --> cpsw_ndo_open (此处根据实际经验得到,目前还没有从源代码级别解答出调用过程)
06 --> cpsw_slave_open
07     --> phy_connect (传递cpsw_adjust_link)
08     --> bus_find_device_by_name (从mdio总线上查找device)
09     --> to_phy_device (从device结构体中找到phy_device)
10     --> phy_connect_direct (传递handler,初始化 ***)
11         --> phy_attach_direct ()
12             --> d->driver = &genphy_driver[GENPHY_DRV_1G].driver;(通用驱动赋值,3.17支持1G和10G)
13             --> d->driver->probe (这里就调用到Generic PHY的检测函数phy_probe)
14             --> device_bind_driver (绑定驱动到设备)
15             --> phydev->attached_dev = dev; (有函数使用到attached_dev指针)
16             --> phydev->state = PHY_READY; (将PHY状态标记为PHY_READY)
17             --> phy_init_hw (硬件级的初始化,最后会调用genphy_config_init)
18         --> phy_prepare_link (赋值cpsw_adjust_link为adjust_link)
19         --> phy_start_machine (启动PHY状态机 ***)
20         --> phy_start_interrupts (经测了,但好像没调用到这里)
21 --> phy_start(PHY_READY变成PHY_UP)
22 --> 其它的CPSW的初始化

看看phy驱动的genphy_driver结构体:

01 static struct phy_driver genphy_driver[] = {
02      .phy_id          = 0xffffffff,
03      .phy_id_mask     = 0xffffffff,
04      .name          = "Generic PHY",
05      .soft_reset     = genphy_soft_reset,
06      .config_init     = genphy_config_init,
07      .features     = PHY_GBIT_FEATURES | SUPPORTED_MII |
08                  SUPPORTED_AUI | SUPPORTED_FIBRE |
09                  SUPPORTED_BNC,
10      .config_aneg     = genphy_config_aneg,
11      .aneg_done     = genphy_aneg_done,
12      .read_status     = genphy_read_status,
13      .suspend     = genphy_suspend,
14      .resume          = genphy_resume,
15      .driver          = { .owner = THIS_MODULE, },
16 };

features表示网卡支持的特性,看代码,在genphy_config_init会重新赋值的,这里的赋值似乎无效。
soft_reset->genphy_soft_reset:软复位PHY,写1到寄存器0的第15位,该位会自动清零,故要等待其清零后才认为复位成功
config_init ->genphy_config_init:初始化配置,主要初始化features,即supported和advertising
config_aneg -> genphy_config_aneg:自动协商,当自动协商使能时,配置advertising,并重新自动协商。如不是,则强制设置(写寄存器0)
aneg_done -> genphy_aneg_done: 读寄存器1,判断第5位,为1表示已经完成自动协商
read_status -> genphy_read_status:读取状态,是否连接上,当前速率、能力,等等,在phy状态机中,此函数经常被调用

下面给出probe的过程:

01 代码路径:drivers/net/phy/phy_device.c
02 phy_probe在phy_driver_register赋值new_driver,实际上就是genphy_driver,在phy_init调用
03  
04 phy_probe
05 --> to_phy_device (从device结构体得到phy_device指针)
06 --> drv = phydev->dev.driver (赋值device_driver指针)
07 --> to_phy_driver(从drv得到phy_driver指针)
08 --> phydev->supported = phydrv->features;
09 --> phydev->advertising = phydrv->features;
10 --> phydev->state = PHY_READY;

为了更直观的了解,这里给出上电过程的主要函数,注意,默认情况下是自动协商的:

01 --> tixxx_cpsw_init
02 --> phy_init
03 --> mdio_bus_init
04 --> phy_driver_register
05 --> davinci_mdio_probe
06 --> cpsw_probe
07 --> cpsw_ndo_open
08 --> cpsw_slave_open
09 --> phy_probe
10 --> PHY_READY->PHY_UP
11 --> phy_state_machine状态机函数
12 --> phy_start_aneg
13     --> genphy_config_aneg
14         --> genphy_config_advert
15         --> genphy_restart_aneg
16     --> PHY_AN
17  
18 --> PHY_AN->HY_RUNNING
19  
20 --> _cpsw_adjust_link
21     --> phy_print_status
22         --> "Link is Up - xxxx"
23 --> PHY_RUNNING->PHY_CHANGELINK->PHY_RUNNING(循环)
最后,系统在正常运行时会不断在PHY_RUNNING和PHY_CHANGELINK这两个状态之间切换,在PHY_CHANGELINK时会判断网络连接性而切换到PHY_RUNNING和PHY_NOLINK,这样,就能实时知道网络的状态了。具体参考phy_state_machine。 

以前写有文章专门讲网络状态切换的,这里也简单列一下:

拨掉网线:

1 --> PHY_RUNNING ->PHY_NOLINK

插上网线(不进行自动协商):

1 --> PHY_NOLINK -> PHY_RUNNING
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a746742897/article/details/53169606

智能推荐

html怎样让文字自动换行,CSS怎么设置文字自动换行?-程序员宅基地

文章浏览阅读3k次。CSS怎么设置文字自动换行?下面本篇文章就给大家介绍css设置文字(特别是连续的数字和英文)自动换行的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。关于换行问题,正常字符的换行是比较合理的,但连续的数字和英文字符常常将容器撑大,而不换行,就挺让人头疼了,这就需要进行强制自动换行了。示例:html代码:正常文字的换行(亚洲文字和非亚洲文字)元素拥有默认的white-space..._css 让文字根据html源码一样换行

个人联想Thinkpad X1 carbon 笔记本遇到的问题及解决办法_thinkpad x1carbon开机黑屏-程序员宅基地

文章浏览阅读214次。新买的一台联想Thinkpad X1 carbon 12代笔记本,不知道怎么搞的,突然有一天启动后会出现一段黑屏时间,然后等一段时间才会正常,非常地烦人。打电话给联想客服只提供了附近的维修地点,但那得花时间跑去啊。今天下午自己摸索终于解决问题了。没什么好办法,我开始卸载电脑上很多的软件,一是不想用了,二是想卸载的这些软件可能就是导致这个问题出现的原因,在卸载的时候看到电脑上的相关应用,但是在点开相机应用的时候竞然发现相机不能用了。怎么这么奇怪,我想到我以前确实是设置了一下相机的权限,难道是这个问题引起的。_thinkpad x1carbon开机黑屏

Krpano:打造全景漫游体验—基础(一)-程序员宅基地

文章浏览阅读577次,点赞29次,收藏8次。由于基础知识太多,篇幅太长,本文只讲解了krpano的运作机制、tour.js的讲解以及krpano各个元素的简单介绍,下一篇文章将详细讲解krpano中的动作也就是< action >元素的使用和用法。

vue 前端表格导入与导出_vue fixdata-程序员宅基地

文章浏览阅读557次。excel导入到表格表格导入与导出,文末带Blob.js和Export2Excel.js导入按钮<input type="file" @change="import(this)" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"/>导入方法import(obj) { _vue fixdata

Error: protect(): protection stack overflow [防护堆叠上溢] 解决方案①_r studio中保护堆栈溢出-程序员宅基地

文章浏览阅读6.4k次。在执行R代码是遇到防护堆叠上溢的error,有效方案①1、命令行到Rgui.exe的地址(cmd)2、输入Rgui.exe --max-ppsize=5000003、在打开的R中输入options("expressions"=20000)memory.limit(size=8000000)https://www.researchgate.net/post/error_protect_protection_stack_overflow_in_R..._r studio中保护堆栈溢出

ORA-01092、ORA-00704、ORA-39700 错误的处理方法_ora-01092: oracle instance terminated. disconnecti-程序员宅基地

文章浏览阅读7.6k次。场景:通过rman做一个数据库的异机恢复,进行到最关键的一步,打开数据库的时候报了错误,详细如下SQL&gt; startup mount;Oracle 例程已经启动。Total System Global Area 6797832192 bytesFixed Size 2241264 bytesVariable Size 3523218704 bytesDatabase Buffers 3254..._ora-01092: oracle instance terminated. disconnection forced ora-00704: boots

随便推点

高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)_高通提取dtb-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏61次。本系列导航:高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)高通平台8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)一.什么是DTS?为..._高通提取dtb

ubuntu上opencv源码编译_libjasper-dev源码-程序员宅基地

文章浏览阅读301次。安装必备包sudo apt-get install build-essential cmake libjpeg-dev libtiff5-dev libjasper-dev安装gtkfor opencv3.2 and above:sudo apt-get install libgtk-3-devfor opencv2.4.x:sudo apt-get install libgtk2.0-dev安装v4l2sudo apt-get install v4l2ucp v4l-ut._libjasper-dev源码

安卓设备连接Unity Profiler进行性能分析_unity profile 手机-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏7次。内容会持续更新,有错误的地方欢迎指正,谢谢!方式一:手机上运行游戏,以ADB方式连UnityProfiler分析游戏性能1.安卓环境:jdk、sdk:cmd(Win+R打开界面并输入cmd) 里直接输入 java 能正常输出即可 https://www.jianshu.com/p/21babde25dd5 adb:cmd 里直接输入 adb 能正常输出即可 https://www..._unity profile 手机

海思3559AV100实现8k文件编码_rk_mpi_cal_comm_getpicbuffersize-程序员宅基地

文章浏览阅读913次,点赞13次,收藏27次。有些小改动需要在common中改,都很简单就不写了,看一下就知道,另外我这边只测试了8k的一帧编码,如需连续编码视频需要再扩展一下,我这边由于公司项目安排就没再继续做了,测试出来8k文件编码的结果如下,颜色偏差是因为我的YUV和板子支持的YUV的存储顺序不一致,这里时间关系也就不调了,也算是顺利实现了芯片的8k文件编码。第二个函数是SAMPLE_VENC_CheckSensor,应该是检查镜头的分辨率支不支持要编的尺寸,这里我们先试的4k,所以也可以不管这个。_rk_mpi_cal_comm_getpicbuffersize

Android BLE 蓝牙通信库,2024年最新应届生面试销售岗位的面试问题技巧_android蓝牙通信-程序员宅基地

文章浏览阅读919次,点赞12次,收藏10次。然后根据自定义的协议,解析对应的 BeaconItem 中的 bytes,首先创建一个 BeaconParser,传入对应的 BeaconItem,然后根据协议不断读取数据, 如果协议中某个字段占 1 个字节,则调用 readByte,若占用两个字节则调用 readShort,如果要取某个字节的某个 bit 则调用 getBit。// 获取第 1 字节的第 1bit。可以在广播中携带设备的自定义数据,用于设备识别,数据广播,事件通知等,这样手机端无需连接设备就可以获取设备推送的数据。_android蓝牙通信

推荐文章

热门文章

相关标签