开发环境 -- Linux下获取PHY寄存器值

简介: 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码。Linux内核2.6以上通用。将下面代码编译后,将可执行文件a.out 重命名为mdiomdio eth0 1 读取phy寄存器1的数值mdio eth0 0 0x1120 将0x1120写入 phy寄存器1eth0 为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;

}

相关文章
|
2月前
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
|
2月前
|
Oracle Java 关系型数据库
入职必会-开发环境搭建41-Linux软件安装-安装JDK
本文介绍了在Linux系统中下载和安装JDK
入职必会-开发环境搭建41-Linux软件安装-安装JDK
|
2月前
|
域名解析 网络协议 Linux
入职必会-开发环境搭建38-Linux常用操作-Linux设置IP
目前安装的Linux操作系统默认是动态获取IP地址,IP地址可能会发生变动,需要把IP地址设置为静态的。
入职必会-开发环境搭建38-Linux常用操作-Linux设置IP
|
2月前
|
网络协议 Linux 网络安全
入职必会-开发环境搭建39-Linux常用操作-Linux防火墙操作
在CentOS 7中,新引入了firewalld服务(防火墙),取代了CentOS 6之前的iptables服务(防火墙)。
入职必会-开发环境搭建39-Linux常用操作-Linux防火墙操作
|
2月前
|
Linux
入职必会-开发环境搭建37-Linux常用操作-Linux服务管理
系统启动以后一直存在且常驻内存没有界面的进程就是服务。Linux系统中的所有服务都保存在下列目录中:/usr/lib/systemd/system,进入该目录就能看到所有的服务。
入职必会-开发环境搭建37-Linux常用操作-Linux服务管理
|
2月前
|
应用服务中间件 Linux 网络安全
|
2月前
|
应用服务中间件 Linux 网络安全
|
2月前
|
缓存 监控 Linux
入职必会-开发环境搭建40-Linux常用操作-Linux进程管理
进程是正在执行的程序或命令。每个进程独立的,都有需要占用一定的系统资源。Linux系统中启动进程有两种方式:1.Linux操作系统启动的时自动启动的进程。2.用户在终端输入命令启动的进程。
入职必会-开发环境搭建40-Linux常用操作-Linux进程管理
|
2月前
|
NoSQL 前端开发 Linux
入职必会-开发环境搭建45-Linux软件安装-安装Redis
本文介绍了在Linux中3种安装Redis的方式和连接方式
|
2月前
|
关系型数据库 MySQL Linux
入职必会-开发环境搭建44-Linux软件安装-安装MySQL
在企业中MySQL 5.7和MySQL 8.x版本使用都较为广泛,因此本教程使用yum命令安装MySQL 5.7和MySQL 8.x到CentOS系统。 MySQL 5.7和MySQL 8.x版本大部分安装过程相同,仅有少部分配置不同,因此放在一起说明,请注意MySQL 5.7和MySQL 8.x的不同之处。