Linux---phy外设调试

news2024/11/24 19:51:31

在这里插入图片描述

文章目录

    • 一、phy设备概述
    • 二、内核驱动配置与设备树添加
    • 三、其他补充

一、phy设备概述

我们知道在计算机网络上有一个OSI 7层模型:
在这里插入图片描述
应用层:网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层:数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有:JPEG、ASCll、EBCDIC、加密格式等 [2]

会话层:建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话

传输层:定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6)

数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

物理层:建立、维护、断开物理连接。(由底层网络定义协议)

后来人们觉得7层模型过于复杂又精简成5层或4层模型:
在这里插入图片描述今天我们的主角Phy设备处于最底层,也就是物理层。一般与数据链路层的mac芯片配合使用,在宏观上phy芯片主要是将模拟信号进行解码,通过MII等接口,将数字信号传送出去。
下图为一款DP83TC811 phy芯片的简单原理图,phy芯片与主控一般使用MII/RMII/RGMII接口进行数据传递。

在这里插入图片描述

同时主控一般使用Mdio总线去配置phy芯片的相关寄存器,有点类似于Codec芯片中PCM/I2S传输音频数据,I2C配置Codec寄存器。下图为该款芯片的一个典型应用图:
在这里插入图片描述
另外需要明确的一个点是phy是一个标准设备,必须符合IEEE802.3 中标准模块的相关规定,其中IEEE802.3 协议定义了地址为0-15 这16个寄存器的功能,地址16-31的寄存器留给芯片制造商自由定义。
也就是说phy芯片不是厂商想怎么设计就怎么设计的,你的符合标准,一旦有标准对于软件来讲就是利好,因为标准化的东西Linux内核已经给我们做好了,因此对于大多数phy芯片使用通用Generic PHY驱动就可以,对于有厂商自定义或者扩展寄存器的,才需要使用对应厂商的特殊驱动。

二、内核驱动配置与设备树添加

phy设备对应的内核目录为/drivers/net/phy通过分析各层Makefile文件,我们知道至少需要打开

obj-$(CONFIG_PHYLIB) += phy/

同时如果CONFIG_PHYLIB打开,对应目录一些文件也会编译进内核,其中包括phy_device.c等

libphy-y			:= phy.o phy_device.o mdio_bus.o mdio_device.o
obj-$(CONFIG_PHYLIB)		+= libphy.o

前面我们说到phy设备是一个标准设备,所以内核默认已经注册了缺省的默认phy驱动,在phy_device.c中:

... ...
static struct phy_driver genphy_driver[] = {
{
	.phy_id		= 0xffffffff,
	.phy_id_mask	= 0xffffffff,
	.name		= "Generic PHY",
	.soft_reset	= genphy_no_soft_reset,
	.config_init	= genphy_config_init,
	.features	= PHY_GBIT_FEATURES | SUPPORTED_MII |
			  SUPPORTED_AUI | SUPPORTED_FIBRE |
			  SUPPORTED_BNC,
	.config_aneg	= genphy_config_aneg,
	.aneg_done	= genphy_aneg_done,
	.read_status	= genphy_read_status,
	.suspend	= genphy_suspend,
	.resume		= genphy_resume,
}, {
	.phy_id         = 0xffffffff,
	.phy_id_mask    = 0xffffffff,
	.name           = "Generic 10G PHY",
	.soft_reset	= gen10g_soft_reset,
	.config_init    = gen10g_config_init,
	.features       = 0,
	.config_aneg    = gen10g_config_aneg,
	.read_status    = gen10g_read_status,
	.suspend        = gen10g_suspend,
	.resume         = gen10g_resume,
} };

static int __init phy_init(void)
{
	int rc;

	rc = mdio_bus_init();
	if (rc)
		return rc;

	rc = phy_drivers_register(genphy_driver,
				  ARRAY_SIZE(genphy_driver), THIS_MODULE);
	if (rc)
		mdio_bus_exit();

	return rc;
}

static void __exit phy_exit(void)
{
	phy_drivers_unregister(genphy_driver,
			       ARRAY_SIZE(genphy_driver));
	mdio_bus_exit();
}

subsys_initcall(phy_init);
module_exit(phy_exit);

Generic PHYGeneric 10G PHY为内核缺省的默认phy驱动,里面有对标准phy驱动的初始化config_init函数软复位soft_reset函数参数协商配置config_aneg函数状态获取read_status函数,以及休眠唤醒相关的suspend/resume函数,对于一般的的phy设备就够用了,假设是一些非标或者扩展的,例如Atheros 803x PHY,需要使用其对应的驱动at803x.c,在宏配置上增加

obj-$(CONFIG_AT803X_PHY)	+= at803x.o

我们也可以看下at803x.c里面写的什么,打开可以看到驱动和通用驱动类似,但是有自己独立的实现,支持ATHEROS 8030/8031/8035 3款phy芯片:

static struct phy_driver at803x_driver[] = {
{
	/* ATHEROS 8035 */
	.phy_id			= ATH8035_PHY_ID,
	.name			= "Atheros 8035 ethernet",
	.phy_id_mask		= 0xffffffef,
	.probe			= at803x_probe,
	.config_init		= at803x_config_init,
	.set_wol		= at803x_set_wol,
	.get_wol		= at803x_get_wol,
	.suspend		= at803x_suspend,
	.resume			= at803x_resume,
	.features		= PHY_GBIT_FEATURES,
	.flags			= PHY_HAS_INTERRUPT,
	.config_aneg		= genphy_config_aneg,
	.read_status		= genphy_read_status,
	.ack_interrupt		= at803x_ack_interrupt,
	.config_intr		= at803x_config_intr,
}, {
	/* ATHEROS 8030 */
	.phy_id			= ATH8030_PHY_ID,
	.name			= "Atheros 8030 ethernet",
	.phy_id_mask		= 0xffffffef,
	.probe			= at803x_probe,
	.config_init		= at803x_config_init,
	.link_change_notify	= at803x_link_change_notify,
	.set_wol		= at803x_set_wol,
	.get_wol		= at803x_get_wol,
	.suspend		= at803x_suspend,
	.resume			= at803x_resume,
	.features		= PHY_BASIC_FEATURES,
	.flags			= PHY_HAS_INTERRUPT,
	.config_aneg		= genphy_config_aneg,
	.read_status		= genphy_read_status,
	.ack_interrupt		= at803x_ack_interrupt,
	.config_intr		= at803x_config_intr,
}, {
	/* ATHEROS 8031 */
	.phy_id			= ATH8031_PHY_ID,
	.name			= "Atheros 8031 ethernet",
	.phy_id_mask		= 0xffffffef,
	.probe			= at803x_probe,
	.config_init		= at803x_config_init,
	.set_wol		= at803x_set_wol,
	.get_wol		= at803x_get_wol,
	.suspend		= at803x_suspend,
	.resume			= at803x_resume,
	.features		= PHY_GBIT_FEATURES,
	.flags			= PHY_HAS_INTERRUPT,
	.config_aneg		= at803x_config_aneg,
	.read_status		= genphy_read_status,
	.aneg_done		= at803x_aneg_done,
	.ack_interrupt		= &at803x_ack_interrupt,
	.config_intr		= &at803x_config_intr,
} };

module_phy_driver(at803x_driver);

static struct mdio_device_id __maybe_unused atheros_tbl[] = {
	{ ATH8030_PHY_ID, 0xffffffef },
	{ ATH8031_PHY_ID, 0xffffffef },
	{ ATH8035_PHY_ID, 0xffffffef },
	{ }
};

MODULE_DEVICE_TABLE(mdio, atheros_tbl);

三、其他补充

其实phy这里还有很多需要讲的,例如phy芯片设备树的配置,例如mdio,rmii总线配置,软件层面phy驱动的注册及匹配,状态机维护及状态变化时相关函数的调用,应用层对网卡的操作及网络配置等,今天有点晚是写不完了,后面慢慢补充吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务(第二十七篇)squid-传统、穿透、反向代理

squid代理服务器: 主要提供缓存加速、应用层过滤控制的功能。 代理的工作机制: 1、代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。 2、将获得的网页数据(静态 Web 元素)保存到缓存中并发送给客户机&#x…

【Anaconda+Pytorch+DGL】安装+配置详细过程

文章目录 Anaconda安装1、进入[Anaconda官网](https://www.anaconda.com/)下载,下载完成后安装指令默认直到完成安装。2、进入Anaconda Prompt,使用conda指令来为不同的版本创建单独的环境: Pytorch安装1、打开NVIDIA控制面板,帮助…

Python+Yolov5水稻病害侦测识别

程序示例精选 PythonYolov5水稻病害侦测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov5水稻病害侦测识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…

gcc/g++ 、Make/Makefile、CMake/CMakeLists.txt、qmake关系简述

1、gcc与g 首先来了解下编译器的主要工作流程&#xff1a; 源码&#xff08;Source Code&#xff09;>> 预处理器&#xff08;Preprocessor&#xff09;>> 编译器&#xff08;Compiler&#xff09; >> 汇编程序&#xff08;Assembler&#xff09;>> …

深度学习踩坑经验沉淀【持续更新】

背景 在深度学习炼丹过程中&#xff0c;总会遇到各种奇怪问题&#xff0c;这个时候总会在csdn和知乎平台找到答案&#xff0c;那每次遇到的问题是解决了&#xff0c;但没有记录起来&#xff0c;确实太可惜&#xff0c;因为未来某个时间或者某个人会遇到类似问题&#xff0c;所…

HBase应用场景和最佳实践

HBase 作为 Apache 基金会的 Hadoop 项目的一部分&#xff0c;将 HDFS 作为文件存储系统&#xff0c;使用 MapReduce 进行分布式的数据批量处理&#xff08;非实时数据批量处理&#xff09;、利用Zookeeper提供协同管理服务&#xff0c;为 Hadoop 提供海量数据管理服务&#xf…

ROS学习(5)——话题消息与服务

节点之间的消息通信分为几种形式&#xff1a; 话题(topic):单向消息发送/接收方式服务(service):双向消息请求/响应方式动作(action):双向消息目标(goal)/结果(result)/反馈(feedback)方式参数服务器(参数共享模式) 种类区别话题异步单向连续单向的发送/接收数据的情况服务同步…

【重生之我是蜘蛛侠】手把手教你用python爬虫,跟着做就好了

&#x1f4af; 博客内容&#xff1a;【LeetCode训练营】用栈来实现队列用队列来实现栈 详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &am…

高可用架构之异地多活

大家好&#xff0c;我是易安&#xff01; 当谈到架构的高可用时&#xff0c;无论是高可用计算架构&#xff0c;还是高可用存储架构&#xff0c;其本质的设计目的都是为了解决部分服务器故障的场景下&#xff0c;如何保证系统能够继续提供服务。但在一些极端场景下&#xff0c;有…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 &#xff08;一&#xff09;索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构&#xff0c;这些数据结构以某…

Life of a Packet in Kubernetes - Calico网络进阶(注解版)

目录 Topics — Part 2 CNI Requirements BIRD (BGP) ConfD Felix Routing Modes IP-in-IP (Default) NoEncapMode VXLAN Demo — IPIP and UnEncapMode Demo — VXLAN Disclaimer References As we discussed in Part 1, CNI plugins play an essential role in …

【面试题】Redis过期删除与内存淘汰

文章目录 Redis过期删除策略&#x1f64e;‍♂️面试官&#xff1a;如何设置key的过期时间&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;什么是Redis过期删除策略&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;过期的key存放到哪里/如何判断key是否过期&#xff1f;…

又到了择业的时候

前言 记得2020年的时候&#xff0c;第一次买房背上贷款&#xff0c;一共一百多万连利息将近两百万&#xff0c;突然就有了危机感&#xff0c;不自觉的会考虑如果我的人生有什么重大变故&#xff0c;我的家人会怎么办&#xff1f;他们承担每个月的房贷月供吗&#xff1f;还是被…

ciscn_2019_es_2

小白垃圾做题笔记&#xff0c;不及建议阅读。 声明&#xff0c;exp来自网络&#xff0c;调试过程自己调试&#xff0c;对于题目的理解仅供参考。由于本人也是小白&#xff0c;且pwn全靠自己摸索&#xff0c;所以有很多理解不到位的地方。如有错误&#xff0c;欢迎指正。 1.做…

新星计划2023【网络应用领域基础】——————Day1

网络应用基础讲解 前言 什么是网络&#xff1f; 什么是网络&#xff0c;网络是什么&#xff1f;能为我们做什么&#xff1f;带着疑问博主一一给你解决 这一章我将带你了解古代人是如何利用“网络”通信的&#xff0c;网络的发展史&#xff0c;osi七层模型&#xff0c;带你了解T…

【2023/05/21】simula

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第16天。 本文将讨论一个广泛关注的话题&#xff0c;即在信息安全领域中如何使用Simula工具进行攻击模拟和威胁情报分析。在这篇文章中&#xff0c;我们将介绍Simula的概念、原理和应用&#xff0c;评价其…

RK3568平台开发系列讲解(驱动基础篇)RK平台RTC的使用

🚀返回专栏总目录 文章目录 一、HYM8563模块二、HYM8563模块三、接口使用3.1 sysfs 接口3.2 procfs 接口3.3 ioctl 接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK RTC的使用进行学习。 一、HYM8563模块 ROC-RK3568-PC开发板采用HYM8563作为RTC(Rea…

Android Codelabs

Android Codelabs 提供引导式、教程式、实践编码体验。将引导您完成构建小型应用程序或向现有应用程序添加新功能的过程。该项目将持续收集并整理有关 Android Codelabs 相关文章&#xff0c;提供给感兴趣的读者进行阅读。 使用 Kotlin 进行高级 Android 开发 本课程提供了一…

gcc确认编译器默认头文件

文章目录 1. 背景2. gcc 空编译查看3. 总结 gcc确认编译器默认头文件 1. 背景 linux下查看编译时依赖的头文件&#xff0c;可以直接使用 -Iinclude_path进行指定&#xff0c;没有指定的会从默认头文件位置去查找&#xff0c;如果还找不到&#xff0c;就会报错。那么&#xff0c…

【C++进阶】多态详解(下)

文章目录 单继承中的虚函数表多继承中的虚函数表动态绑定与静态绑定问题探究第一步&#xff1a;观察普通调用的汇编代码第二步&#xff1a;观察ptr1的汇编代码&#xff1a;第三步:观察ptr2的汇编代码&#xff1a;总结&#xff1a; 继承和多态常见的面试问题 单继承中的虚函数表…