Linux---phy外设调试(一)_linux phy调试-程序员宅基地

技术标签: 网络  linux  网络协议  

在这里插入图片描述

一、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驱动的注册及匹配,状态机维护及状态变化时相关函数的调用,应用层对网卡的操作及网络配置等,今天有点晚是写不完了,后面慢慢补充吧。


后面又补充了一篇虽然还是不太完整,但是一点一点逐步完善吧,希望对大家有帮忙《Linux—phy外设调试(二)

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

智能推荐

安卓桌面软件_银河麒麟即时通讯工具教程02:安卓应用安装、启动和卸载-程序员宅基地

文章浏览阅读2.8k次。《银河麒麟即时通讯工具安装和使用》系列教程,将为大家介绍银河麒麟系统上即时通讯工具(微信、QQ、LinuxQQ、麒麟传书)安装、使用、卸载,包括桌面版工具及安卓兼容Kydroid版两类方式,欢迎大家持续关注!作者简介刘煦阳> 湖南长城科技生态研发部工程师> 6年PKS平台支持维护经验> 红帽RHCSA和RHCE认证系统工程师> 首批麒麟KOSE-P认证系统工程师教程目录一、..._银河麒麟安装安卓app

简单c语言程序例子与运行结果图,C语言程序第一次作业-程序员宅基地

文章浏览阅读1.1k次。(一)实验总结1. 求圆面积和周长(1)题目输入圆的半径,计算圆的周长和面积。(2)流程图 (3)测试数据及运行结果测试数据1:r=2运行结果: (4)实验分析没有问题2.判断闰年(1)题目输入一个四位年份,判断其是否是闰年。闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。(2)流程图 (3)测试数据及运行结果测试数据1:y=1980运行结果: (4)实验分析没错误3.求..._程序运行结果与执行结果图片

[杂七杂八]Pytorch+tensorboard error:unpack require a string argument of length 4-程序员宅基地

文章浏览阅读128次。error:unpack require a string argument of length 4decodeerror: error parsing message这个错误是环境版本问题,我用:python 2.7pytorch 0.4.0tensorboardx 1.9tensorboard 2.0因此,pip uninstall tensorboardpip install tensorboard==1.9.0搞定PS:这些小框架和cudnn的版本、各个库之间的版本配合往往藏着坑

【基于MATLAB的数字图像处理】大作业·综合图像处理平台_图像综合处理-程序员宅基地

文章浏览阅读1.1w次,点赞23次,收藏272次。我们获得的图像难免会伴随着很多的噪声,有时会使图像质量下降;有时会干扰我们的视觉,使拍摄出的图像效果不满意;有时甚至会出现一些特殊情况,遮挡住人脸或重要物体。这时我们需要对获得的图像进行一些图像处理,以使我们的图像观感更好,图像质量更优质。本平台致力于将多种图像处理功能集成于一体,方便用户直观快捷的对图像进行操作处理,快速地获得一幅较为优质的图像;另外,本平台亦可作为教育教学软件使用,教师可以直观的为学生展示各种图像操作的变换的效果,也可进一步延伸,展示一些偏向于应用和中级图像处理的图像操作。_图像综合处理

C/C++ 回调函数 callback 异步编程_c++异步回调-程序员宅基地

文章浏览阅读785次,点赞5次,收藏12次。C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)-程序员宅基地。动态函数指针free报错_编程语言-CSDN问答。_c++异步回调

CTFshow web入门web171-sql1_ctfshowweb171-程序员宅基地

文章浏览阅读102次。说明到3就没有了,直接进行union查询 (此时将1改为-1)本题考察sql注入联合查询union select。继续到1‘ order by 4--+首先我们试着注入1‘ and 1=1’继续到1‘ order by 3--+回显异常,说明存在注入。_ctfshowweb171

随便推点

《算法笔记》3.6小节——入门模拟->字符串处理 问题 E: 字符串去特定字符-程序员宅基地

文章浏览阅读116次。问题 E: 字符串去特定字符时间限制 : 1.000 sec 内存限制 : 32 MB题目描述输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。输入测试数据有多组,每组输入字符串s和字符c。输出对于每组输入,输出去除c字符后的结果。样例输入goaoda样例输出good#include <iostream>#include <cstring>using namespace std;int main() { char str[20_问题 e: 字符串去特定字符

git上代码整体拉到vscode上步骤__git项目更新到本地__vscode更新项目至git_vscodegit拉取最新代码到本地-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏18次。git上代码整体拉到vscode上步骤1.将代码克隆到本地2.终端cd到项目的根目录(在其他分支写项目)git项目更新到本地步骤方法一:方法二(好用)vscode 上传本地更改文件至git上方法一:使用命令提交方法二:直接在vscode界面提交(推荐,简单方便)_vscodegit拉取最新代码到本地

Ubuntu20.04安装gtsm_toolbox_gstam anzhuang-程序员宅基地

文章浏览阅读779次。本文详细介绍了在ubuntu20.04系统中安装gtsam-4.0.3 realsease版本的matlab gtsam_toobox库的流程,希望能够帮助更多读者减少安装过程遇到的问题。_gstam anzhuang

Dev-C++5.16安装包下载_devc++5.16下载-程序员宅基地

文章浏览阅读1.5k次。喜欢英文来英文的~_devc++5.16下载

【linux指南--命令大全】-程序员宅基地

文章浏览阅读1.1k次。系统的学习linux常用的命令,命令很全所以篇幅很长,可以作为你查阅命令的手册

【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期_servlet层-程序员宅基地

文章浏览阅读1.4w次,点赞39次,收藏226次。一、Servlet简介1、Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。2、Servlet定义: A servlet is a small Java program that runs within a Web server_servlet层

推荐文章

热门文章

相关标签