Linux 网络驱动 phy 读写寄存器调试方法_phy寄存器读写-程序员宅基地

Linux 网络 phy 调试方法

目前嵌入式芯片支持双网卡的有很多。在调试网络驱动时,需要通过mdc 和mdio信号对phy的寄存器进行操作调试。如果每次调试都修改网络驱动的话会很麻烦。下面提供我常用的网络驱动调试方法
在这里插入图片描述
在驱动层,设备树绑定mac与mdio总线的关系。

在Linux应用层,编写测试程序mdio 。代码如下:

如果是写寄存器操作,就传入四个参数./mdio ethX phyId addr value.。

ethX 表示是哪个网卡,如eth0 eth1 。

phyId是 phy的物理地址,一般0x00是广播地址.有些phy 的0x00不是广播地址,如marvell 的88e1512 ID 只能时0x00 0x11,0x00不是88e1512的广播地址。

addr 是phy手册的寄存器地址

value 是phy地址要写入的值

如果是读寄存器操作,就传入三个参数./mdio ethX phyId addr

#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>
#include <unistd.h>
 
//#include <QDebug>
 
 
int main(int argc, char *argv[])
{
    
    int sockfd;
    struct mii_ioctl_data *mii = NULL;
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
    sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    ioctl(sockfd, SIOCGMIIPHY, &ifr);
    mii = (struct mii_ioctl_data*)&ifr.ifr_data;
 
    if(argc == 4)
    {
    
        strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
        sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
        ioctl(sockfd, SIOCGMIIPHY, &ifr);
        mii = (struct mii_ioctl_data*)&ifr.ifr_data;
 
        mii->phy_id    = (uint16_t)strtoul(argv[2], NULL, 0);
        mii->reg_num    = (uint16_t)strtoul(argv[3], NULL, 0);
 
        ioctl(sockfd, SIOCGMIIREG, &ifr);
 
        printf("read --- value : 0x%x", mii->val_out);
    }
    else if(argc == 5)
    {
    
        strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
        sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
        ioctl(sockfd, SIOCGMIIPHY, &ifr);
        mii = (struct mii_ioctl_data*)&ifr.ifr_data;
        mii->phy_id    = (uint16_t)strtoul(argv[2], NULL, 0);
        mii->reg_num    = (uint16_t)strtoul(argv[3], NULL, 0);
        mii->val_in     = (uint16_t)strtoul(argv[4], NULL, 0);
 
        ioctl(sockfd, SIOCSMIIREG, &ifr);
    }else{
    
       printf("mdio ethX phyId addr value\n");
    }
 
    close(sockfd);
 
 
 
    return 0;
}

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

智能推荐

基于FPGA的BPSK、QPSK以及OQPSK实现_fpga实现bpsk调制-程序员宅基地

文章浏览阅读2.8k次,点赞10次,收藏56次。在现代通信领域中,大多数的信道因具有带通特性而不能直接传送基带信号,为了使数字信号能在带通信道中传输,必须用数字基带信号对载波进行调制,以使信号与信道的特性相匹配。二进制相移键控(BSPK)、正交相移键控(QPSK)、偏置正交相移键控(OQPSK)是重要的调制方式,被广泛地应用于现代通信的各个领域。_fpga实现bpsk调制

编写一个 函数把华氏温度转化为 摄氏温度,转换公式用递归的方法 编写 函数求Fibonacci级数。编写函数求两个数的最大公约数和最小公倍数_编写一个函数,将华氏温度转换为摄氏温度。公式为c=(f-32)×5/9。-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏24次。编写一个 函数把华氏温度转化为 摄氏温度,转换公式:C=(F-32)*5/9//编写一个 函数把华氏温度转化为 摄氏温度,转换公式:C=(F-32)*5/9#include<iostream>#include<cmath>using namespace std;double Transform(double F) { return (F - 32) * 5 / 9;}int main() { double F; cout << "请输入华氏._编写一个函数,将华氏温度转换为摄氏温度。公式为c=(f-32)×5/9。

海康威视摄像头视频在web端播放解决方案ffmpeg + nginx + http-flv_海康威视 java sdk web 预览-程序员宅基地

文章浏览阅读7k次,点赞2次,收藏19次。一:下载海康JAVA-DEMO我开发环境是window10-64位 IDEA JDK1.8 的 和 mac IDEA JDK1.8 demo下载地址 https://www.hikvision.com/cn/download_more_570.html1:下载完成以后,必须认真看完这个txt,不然后面可能会出现“dll缺失”和“sdk文件不存在”这种异常2:sdk使用手册【必看】二:摄像设备ip,通道查看海康摄像头设备的录像文件一般都是存储在录像机,找出录像机的ip及账号密码在最新版IE11_海康威视 java sdk web 预览

Ubuntu执行mkfs.ubifs、ubinize文件失败解决_ubinize: error!: no sections found the ini-file "b-程序员宅基地

文章浏览阅读556次。Ubuntu执行mkfs.ubifs、ubinize文件失败解决_ubinize: error!: no sections found the ini-file "bin/ubinize.cfg

qml入门教程(20):qml property使用介绍_qml q_property 怎么用-程序员宅基地

文章浏览阅读1.1k次,点赞32次,收藏19次。QML 中的属性property是一个重要的概念,用于定义和访问QML对象的数据。在QML中,属性可以是各种类型,包括基本数据类型(如int, double, string)和复杂类型(如对象和列表)。属性在QML中可用于数据绑定、事件处理和界面更新。_qml q_property 怎么用

oracle查看用户执行的sql,查询Oracle中正在执行和执行过的SQL语句-程序员宅基地

文章浏览阅读2.6k次。查询Oracle正在执行的sql语句及执行该语句的用户SELECT b.sid oracleID,b.username 登录Oracle用户名,b.serial#,spid 操作系统ID,paddr,sql_text 正在执行的SQL,b.machine 计算机名FROM v$process a, v$session b, v$sqlarea cWHERE a.addr = b.paddrAND ..._oracle查看接收的sql参数

随便推点

php抓取网指定内容,php获取网页内容方法总结-程序员宅基地

文章浏览阅读388次。抓取到的内容在通过正则表达式做一下过滤就得到了你想要的内容,至于如何用正则表达式过滤,在这里就不做介绍了,有兴趣的,以下就是几种常用的用php抓取网页中的内容的方法。1.file_get_contentsPHP代码复制代码代码如下:$url="http://www.jb51.net";$contents=file_get_contents($url);//如果出现中文乱码使用下面代码//$getc..._php正则截取file_get_contents里的域名

Android实现与PHP后端的交互(数据传输,文件传输)(超详细/附源码)_用php开发android系统usb通信-程序员宅基地

文章浏览阅读1.4k次。本篇文章将详细介绍Android与PHP的交互,实际上就是利用http进行通信的过程,通过Get方法和Post方法,实现数据传输,文件传输,博主在真机上进行了实测,并附上了源码的链接。_用php开发android系统usb通信

plsql如何导入csv文件,PLSQL导入csv文件到数据库-程序员宅基地

文章浏览阅读2w次,点赞10次,收藏40次。搜索热词好久不用oracle了,突然忘记怎么导入数据了。今天再记录一下吧。1、建表。目的是:被导入到数据的存储位置。因为数据库中曾经有过相同表结构的表,所以直接使用sql建表。sql">-- t_sdh_cc表create table t_sdh_cc as select * from t_sdh_cc_hn_cxh where 1=0;@H_404_7@2、建好表后,开始导入数据。2...._plsql导入csv

Micro Drive Data Recovery_which may indicate disk corruption.-程序员宅基地

文章浏览阅读607次。Our Microdrive data recovery service recovers lost, deleted or damaged photographic images, videos or data from any type of Microdrive. Our recovery specialists are able to un-delete Microdrive file_which may indicate disk corruption.

android权限赋予流程_adb 给app授权-程序员宅基地

文章浏览阅读3k次。android 权限 permission_adb 给app授权

linux支持大磁盘配置_size of device too big to be-程序员宅基地

文章浏览阅读1.5k次。问题:mkfs.ext3: Size of device /dev/sdc1 too big to be expressed in 32 bits using a blocksize of 4096.CentOS 6.3 x64 支持大于2T,小于16T的数据盘 1.支持2T2.支持x>16T磁盘分区,需要安装插件;e2fsprogs-1.43.4.tar.gz(CentOS 6._size of device too big to be

推荐文章

热门文章

相关标签