下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码。Linux内核2.6以上通用。
将下面代码编译后,将可执行文件a.out 重命名为mdio
eth0 为mac层控制器的名称, 一般为eth0 或mgmt0。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define help() \
int sockfd;
int main(int argc, char *argv[]){
lab:
}
很多人在read操作里面判断phy的link状态,
if(mii->val_out& 0x0004){
printf("linkup\n");
}else{
printf("linkdown\n");
}
其实这个做法是比较通用可行的。
解释一下,关于mii->val_out& 0x0004
寄存器3和4为 Identifiier Register
, 这里的内容为phy芯片产商的识别码。
一般这个状态寄存器的数值为: 0x796d
意思是:
14bit : 有能力实现全双工100BASE-X工作模式
8bit : 扩展信息描述在寄存器15.
5bit : 自动协商完成
3bit : 有能力自动协商
2bit : link 状态: up
0bit : 有扩展寄存器