示例:
niyu@raspberrypi:~$ sudo ./test
Current MII_MMD_CTRL value: 0x0
MII register MII_MMD_CTRL set to 0x11.
Modified BMCR value: 0x11
代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/if.h>
#include <linux/sockios.h>
#include <linux/mii.h>
int main() {
int sockfd;
struct ifreq ifr;
struct mii_ioctl_data *mii;
// 创建一个用于DATAGRAM的socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
return 1;
}
// 准备ifreq结构
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "eth0"); // 确保使用正确的网络接口名称
mii = (struct mii_ioctl_data *)&ifr.ifr_data;
mii->phy_id = 1; // PHY的地址
mii->reg_num = MII_MMD_CTRL; // 寄存器编号,MII_MMD_CTRL 是基本控制寄存器
// 读取当前寄存器值
if (ioctl(sockfd, SIOCGMIIREG, &ifr) != -1) {
printf("Current MII_MMD_CTRL value: 0x%x\n", mii->val_out);
} else {
perror("Failed to read MII register");
close(sockfd);
return 1;
}
// 设置寄存器值
mii->val_in = 0x11;
if (ioctl(sockfd, SIOCSMIIREG, &ifr) != -1) {
printf("MII register MII_MMD_CTRL set to 0x11.\n");
} else {
perror("Failed to write MII register");
}
// 读取修改后的寄存器值
if (ioctl(sockfd, SIOCGMIIREG, &ifr) != -1) {
printf("Modified MII_MMD_CTRL value: 0x%x\n", mii->val_out);
} else {
perror("Failed to read MII register after write");
}
close(sockfd);
return 0;
}