Linux 下smi/mdio总线通信
韩大卫@吉林师范大学
下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码。Linux内核2.6以上通用。
将下面代码编译后,将可执行文件a.out 重命名为mdio

mdio eth0 1  		读取phy寄存器1的数值
mdio eth0 0 0x1120 将0x1120写入 phy寄存器1 eth0 为mac层控制器的名称, 一般为eth0 或mgmt0。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/mii.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <linux/types.h>
#include <netinet/in.h> #define reteck(ret) \
if(ret < 0){ \
printf("%m! \"%s\" : line: %d\n", __func__, __LINE__); \
goto lab; \
} #define help() \
printf("mdio:\n"); \
printf("read operation: mdio reg_addr\n"); \
printf("write operation: mdio reg_addr value\n"); \
printf("For example:\n"); \
printf("mdio eth0 1\n"); \
printf("mdio eth0 0 0x12\n\n"); \
exit(0); int sockfd; int main(int argc, char *argv[]){ if(argc == 1 || !strcmp(argv[1], "-h")){
help();
} struct mii_ioctl_data *mii = NULL;
struct ifreq ifr;
int ret; memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1); sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
reteck(sockfd); //get phy address in smi bus
ret = ioctl(sockfd, SIOCGMIIPHY, &ifr);
reteck(ret); mii = (struct mii_ioctl_data*)&ifr.ifr_data; if(argc == 3){ mii->reg_num = (uint16_t)strtoul(argv[2], NULL, 0); ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
reteck(ret); printf("read phy addr: 0x%x reg: 0x%x value : 0x%x\n\n", mii->phy_id, mii->reg_num, mii->val_out);
}else if(argc == 4){ mii->reg_num = (uint16_t)strtoul(argv[2], NULL, 0);
mii->val_in = (uint16_t)strtoul(argv[3], NULL, 0); ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
reteck(ret); printf("write phy addr: 0x%x reg: 0x%x value : 0x%x\n\n", mii->phy_id, mii->reg_num, mii->val_in);
} lab:
close(sockfd);
return 0;
}
很多人在read操作里面判断phy的link状态,

if(mii->val_out& 0x0004){

printf("linkup\n");

}else{

printf("linkdown\n");

}

其实这个做法是比较通用可行的。

解释一下,关于 mii->val_out& 0x0004

大多数phy芯片的寄存器0为控制寄存器, 寄存器1 为状态寄存器, 

寄存器3和4为 Identifiier Register
, 这里的内容为phy芯片产商的识别码。 举个实例,marvell 88E1116, 无论是光口模式还是电口模式, 寄存器1都是 Status register 一般寄存器有16个bit, 第2个bit为link 状态, 第5个bit为自动协商, 一般这个状态寄存器的数值为: 0x796d 意思是: 14bit : 有能力实现全双工100BASE-X工作模式 13bit : 有能力实现半双工 100BASE-X工作模式 12bit : 有能力实现全双工 10BASE-T工作模式 11 bit : 有能力实现半双工 10BASE-T工作模式 8bit : 扩展信息描述在寄存器15. 6bit : MF报头抑制 5bit : 自动协商完成 3bit : 有能力自动协商 2bit : link 状态: up 0bit : 有扩展寄存器 NOTE: 上面的ioctl()在linux最底层的实现函数是在drivers/net/phy/
目录下, 如octeon处理器平台: drivers/net/phy/mdio-octeon.c 这里面有mii总线读写phy寄存器的方法的实现函数: octeon_mdiobus_read
octeon_mdiobus_write ioctl的执行路径是: 用户层ioctl系统调用 --> drivers/net层接口函数 ndo_do_ioctl --> drivers/net/phy层接口函数 phy_mii_ioctl --> 通用接口函数mdiobus_read , 封装了mii_bus->read --> 最终是read的实现函数drivers/net/phy/mdio-octeon.c : octeon_mdiobus_read

PHY的更多相关文章

  1. Mac与Phy组成原理的简单分析

    1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分 ...

  2. SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化

    网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍 ...

  3. 转!!MAC和PHY的区别

    一块以太网网卡包括OSI(开方系统互联)模型的两个层,物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

  4. IP101A芯片默认物理地址(PHY Adress)确定

    转载:http://blog.csdn.net/ropai/article/details/6961157 根据IP101A的DataSheet,芯片的第9,10,12,13,15脚为PHYAD0~P ...

  5. 网卡及MAC和PHY的区别

    转载:http://blog.sina.com.cn/s/blog_53d7350f0100mudb.html 一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数 ...

  6. 网口扫盲三:以太网芯片MAC和PHY的关系

    转载:http://www.cnblogs.com/jason-lu/articles/3195473.html   问:如何实现单片以太网微控制器? 答:诀窍是将微控制器.以太网媒体接入控制器(MA ...

  7. OK335xS LAN8710 phy driver hacking

    /******************************************************************** * OK335xS LAN8710 phy driver h ...

  8. hi3531 SDK 编译 uboot, 改动PHY地址, 改动 uboot 參数 .

    一,编译uboot SDK文档写得比較清楚了,写一下须要注意的地方吧. 1. 之前用SDK里和别人给的已经编译好的uboot,使用fastboot工具都刷不到板子上.最后自己用SDK里uboot源代码 ...

  9. 802.11(wi-fi)的PHY层(编码与调制方法)

    版本概要: 802.11-2007是目前的基础版本,之前的过时版本不考虑. 2009是较新的版本,就是目前最普及的802.11n.(100Mb/s) 2012就是传说中的802.11ac,工作在5G, ...

随机推荐

  1. CLRS:max_heap and min_heap operation (pseudocode)

    //max_heap heap_maximum:return A[1]    O(1); Extract_Heap_maximum:swap(A[1],A[heap.size])    adjust ...

  2. ASP.NET的SEO:正则表达式

    目前国内主流的网站内容管理系统中,有大部分是可以将动态的PHP.ASP.ASPX等文档直接生成HTML的.但是由于有些网站的内容较多,因此如果单纯的采取直接生成的方式,将会占用大量的服务器资源.在这种 ...

  3. Windows 2003 + IIS6.0 相关 401.1 或 401.2 等问题解决

    我自己处理的过程: 1. 问题场景: 1.1 我本身有一个虚拟机为 win2003 + iis6.0 的环境 c:\ 为NTFS 格式 D:\为Fat32 格式 1.2 我需要部署一个 asp.net ...

  4. HttpClient——连接关闭

    HttpClient client = new HttpClient(); HttpMethod method = new GetMethod("http://www.apache.org& ...

  5. JS回车事件

    <script type="text/javascript"> //当回车按下时,/=47,*=42,+=43 function keypress(form0){ if ...

  6. Git 中级用户的25个提示

    我使用 Git 大约已经有18个月时间,自认为能很好地驾驭它了.但是当我们请到 GitHub 的 Scott Chacon 来到 LVS 公司(一个博彩/游戏软件供应商/开发商)做专场培训时,我在第一 ...

  7. 移植DNS服务bind

    移植DNS服务bind 标签: makefile工作linuxbuildgcc工具 先写用于DNS的bind. 一. 移植环境 1 .硬件环境: Host : X86 PC Target : MPC8 ...

  8. phalcon框架学习之view

    phalcon框架的view分多级:全局-控制器视图-动作视图.视图由上到下,按层级嵌套. 全局视图 默认全局视图为Views/index.html,所有的页面展示时,默认调用此页面,在这个页面中必须 ...

  9. 设计模式-外观模式(Facade)

    简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...

  10. 新手浅谈C#关于abstract和interface

    abstract:抽象类,是对某一类对象的抽象,继承抽象类的类和抽象类是属于关系 interface:接口,可以说是一种规范,继承接口的类表达则是,我继承了这个接口,我能做什么 举个常用的例子:抽象一 ...