我们知道在计算机网络上有一个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 PHY
和Generic 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外设调试(二)》
文章浏览阅读2.8k次。《银河麒麟即时通讯工具安装和使用》系列教程,将为大家介绍银河麒麟系统上即时通讯工具(微信、QQ、LinuxQQ、麒麟传书)安装、使用、卸载,包括桌面版工具及安卓兼容Kydroid版两类方式,欢迎大家持续关注!作者简介刘煦阳> 湖南长城科技生态研发部工程师> 6年PKS平台支持维护经验> 红帽RHCSA和RHCE认证系统工程师> 首批麒麟KOSE-P认证系统工程师教程目录一、..._银河麒麟安装安卓app
文章浏览阅读1.1k次。(一)实验总结1. 求圆面积和周长(1)题目输入圆的半径,计算圆的周长和面积。(2)流程图 (3)测试数据及运行结果测试数据1:r=2运行结果: (4)实验分析没有问题2.判断闰年(1)题目输入一个四位年份,判断其是否是闰年。闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。(2)流程图 (3)测试数据及运行结果测试数据1:y=1980运行结果: (4)实验分析没错误3.求..._程序运行结果与执行结果图片
文章浏览阅读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的版本、各个库之间的版本配合往往藏着坑
文章浏览阅读1.1w次,点赞23次,收藏272次。我们获得的图像难免会伴随着很多的噪声,有时会使图像质量下降;有时会干扰我们的视觉,使拍摄出的图像效果不满意;有时甚至会出现一些特殊情况,遮挡住人脸或重要物体。这时我们需要对获得的图像进行一些图像处理,以使我们的图像观感更好,图像质量更优质。本平台致力于将多种图像处理功能集成于一体,方便用户直观快捷的对图像进行操作处理,快速地获得一幅较为优质的图像;另外,本平台亦可作为教育教学软件使用,教师可以直观的为学生展示各种图像操作的变换的效果,也可进一步延伸,展示一些偏向于应用和中级图像处理的图像操作。_图像综合处理
文章浏览阅读785次,点赞5次,收藏12次。C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)-程序员宅基地。动态函数指针free报错_编程语言-CSDN问答。_c++异步回调
文章浏览阅读102次。说明到3就没有了,直接进行union查询 (此时将1改为-1)本题考察sql注入联合查询union select。继续到1‘ order by 4--+首先我们试着注入1‘ and 1=1’继续到1‘ order by 3--+回显异常,说明存在注入。_ctfshowweb171
文章浏览阅读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: 字符串去特定字符
文章浏览阅读5.3k次,点赞3次,收藏18次。git上代码整体拉到vscode上步骤1.将代码克隆到本地2.终端cd到项目的根目录(在其他分支写项目)git项目更新到本地步骤方法一:方法二(好用)vscode 上传本地更改文件至git上方法一:使用命令提交方法二:直接在vscode界面提交(推荐,简单方便)_vscodegit拉取最新代码到本地
文章浏览阅读779次。本文详细介绍了在ubuntu20.04系统中安装gtsam-4.0.3 realsease版本的matlab gtsam_toobox库的流程,希望能够帮助更多读者减少安装过程遇到的问题。_gstam anzhuang
文章浏览阅读1.5k次。喜欢英文来英文的~_devc++5.16下载
文章浏览阅读1.1k次。系统的学习linux常用的命令,命令很全所以篇幅很长,可以作为你查阅命令的手册
文章浏览阅读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层