Доступ к phy-драйверу Ethernet из пространства пользователя linux - PullRequest
0 голосов
/ 31 августа 2018

я хочу получить доступ к phy-драйверу Ethernet из пространства пользователя linux,

В uboot мы можем напрямую обращаться к фи-регистрам, используя mii команды

Точно так же я хочу читать и записывать фи-регистры из пространства пользователя Linux.

причина в том, что в случае phy драйвера не указано ни старшего, ни младшего номера (возможно, причиной является сетевой драйвер) как это сделать. И возможно ли это

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Для этого есть следующие 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;
}
0 голосов
/ 31 августа 2018

Попробуйте использовать mii-tool или ethtool. Посмотрите на источники этих программ, как получить доступ к phy api.

...