【问题标题】:Accessing ethernet phy driver from linux user space从 linux 用户空间访问以太网 phy 驱动程序
【发布时间】:2018-08-31 07:58:39
【问题描述】:

我想从 linux 用户空间访问以太网 phy 驱动,

在uboot中我们可以使用mii命令直接访问phy寄存器

同样,我想从 linux 用户空间读取和写入 phy 寄存器。

因为在 phy 驱动程序的情况下没有主要或次要编号(可能是因为它是网络驱动程序) 怎么做。有没有可能

【问题讨论】:

    标签: linux driver linux-device-driver network-driver


    【解决方案1】:

    为此目的有以下ioctl 请求:

    #define SIOCGMIIREG 0x8948      /* Read MII PHY register.   */
    #define SIOCSMIIREG 0x8949      /* Write MII PHY register.  */ 
    

    而MII寄存器常量定义在:

    #include <linux/mii.h>
    

    例子:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <net/if.h>
    #include <sys/ioctl.h>
    #include <linux/mii.h>
    #include <linux/sockios.h>
    
    int main()
    {
        struct ifreq ifr;
    
        memset(&ifr, 0, sizeof(ifr));
        strcpy(ifr.ifr_name, "eth1");
    
        struct mii_ioctl_data* mii = (struct mii_ioctl_data*)(&ifr.ifr_data);
        mii->phy_id  = 1;
        mii->reg_num = MII_BMSR;
        mii->val_in  = 0;
        mii->val_out = 0;
    
        const int fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (fd != -1)
        {
            if (ioctl(fd, SIOCGMIIREG, &ifr) != -1)
            {
                printf("MII_BMSR     = 0x%04hX \n", mii->val_out);
                printf("BMSR_LSTATUS = %d \n", (mii->val_out & BMSR_LSTATUS) ? 1 : 0);
            }
            close(fd);
        }
    
        return 0;
    }
    

    【讨论】:

    • 我的 val_out 似乎总是 FFFF,这正常吗?
    【解决方案2】:

    尝试使用 mii-tool 或 ethtool。查看这些程序的来源如何访问 phy api。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多