资源简介

linux mdio 读写phy 寄存器工具

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#ifndef __GLIBC__
#include 
#include 
#endif
#include 
#include 
#include 

/* This data structure is used for all the MII ioctl‘s */

static struct ifreq ifr;

static int mdio_read(int skfd int location)
{
    struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data;
    mii->reg_num = location;
    if (ioctl(skfd SIOCGMIIREG &ifr) < 0) {
fprintf(stderr “SIOCGMIIREG on %s failed: %s\n“ ifr.ifr_name
strerror(errno));
return -1;
    }
    return mii->val_out;
}

static void mdio_write(int skfd int location int value)
{
    struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data;
    mii->reg_num = location;
    mii->val_in = value;
    if (ioctl(skfd SIOCSMIIREG &ifr) < 0) {
fprintf(stderr “SIOCSMIIREG on %s failed: %s\n“ ifr.ifr_name
strerror(errno));
    }
}

int main(int argc char *argv[])
{
    int skfd;

    if((argc < 2) || (!strcmp(argv[1] “-h“))){
        printf(“%s eth0 reg [val]\n“ argv[0]);

        return 0;
    }
    if ((skfd = socket(AF_INET SOCK_DGRAM0)) < 0) {
perror(“socket“);
exit(-1);
    }
    strncpy(ifr.ifr_name argv[1] IFNAMSIZ);
    if (ioctl(skfd SIOCGMIIPHY &ifr) < 0) {
    fprintf(stderr “SIOCGMIIPHY on ‘%s‘ failed: %s\n“
    argv[1] strerror(errno));
return -1;
    }
    if(!strcasecmp(argv[2] “dump“)){
        int i = 0;

        printf(“%s dump:\n“ argv[1]);
        printf(“      “);
        for(i = 0; i < 16; i++){
            printf(“%4x “ i);
        }
        printf(“\n“);
        for(i = 0; i < 32; i++){
            if((i % 16) == 0){
                printf(“%04x: “ i);
            }
            printf(“%04x “ mdio_read(skfd i));
            if((i % 16) == 15){
                printf(“\n“);
            }
        }
    }else{
        if (argc == 3) {
            printf(“%03x ==> %08x\n“ strtoul(argv[2] NULL 0) mdio_read(skfd strtoul(argv[2] NULL 0)));
        } else if(argc == 4) {
            mdio_write(skfd strtoul(argv[2] NULL 0) strtoul(argv[3] NULL 0));
        }
    }

    close(skfd);

    return 0;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    .......       182  2014-06-20 12:39  mdio\Makefile

    .......      2419  2014-07-24 15:06  mdio\mdio.c

     目录          0  2015-08-04 16:22  mdio

----------- ---------  ---------- -----  ----

                 2601                    3


评论

共有 条评论