Linux 下訪問PHY晶元暫存器

2021-09-24 13:01:46 字數 1979 閱讀 8501

mdio eth0 1          讀取phy暫存器1的數值

mdio eth0 0 0x1120      將0x1120寫入 phy暫存器1

eth0 為mac層控制器的名稱, 一般為eth0 或mgmt0。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define reteck(ret)     \

if(ret < 0)

#define help() \

printf("mdio:\n");                  \

printf("read operation: mdio reg_addr\n");          \

printf("write operation: mdio reg_addr value\n");    \

printf("for example:\n");            \

printf("mdio eth0 1\n");             \

printf("mdio eth0 0 0x12\n\n");      \

exit(0);

int sockfd;

int main(int argc, char *ar**)

struct mii_ioctl_data *mii = null;

struct ifreq ifr;

int ret;

memset(&ifr, 0, sizeof(ifr));

strncpy(ifr.ifr_name, ar**[1], ifnamsiz - 1);

sockfd = socket(pf_local, sock_dgram, 0);

reteck(sockfd);

//get phy address in smi bus

ret = ioctl(sockfd, siocgmiiphy, &ifr);

reteck(ret);

mii = (struct mii_ioctl_data*)&ifr.ifr_data;

if(argc == 3)else if(argc == 4)

lab:

close(sockfd);

return 0;

}很多人在read操作裡面判斷phy的link狀態,

if(mii->val_out& 0x0004)else{

printf("linkdown\n");

其實這個做法是比較通用可行的。

解釋一下,關於mii->val_out& 0x0004

大多數phy晶元的暫存器0為控制暫存器, 暫存器1 為狀態暫存器, 

暫存器3和4為 identifiier register

, 這裡的內容為phy晶元產商的識別碼。

舉個例項,marvell 88e1116, 無論是光口模式還是電口模式, 暫存器1都是 status register 

一般暫存器有16個bit, 第2個bit為link 狀態, 第5個bit為自動協商, 

一般這個狀態暫存器的數值為: 0x796d

意思是:

14bit : 有能力實現全雙工100base-x工作模式

13bit :  有能力實現半雙工 100base-x工作模式

12bit :  有能力實現全雙工 10base-t工作模式

11 bit :  有能力實現半雙工 10base-t工作模式

8bit : 擴充套件資訊描述在暫存器15.

6bit :  mf報頭抑制

5bit : 自動協商完成

3bit : 有能力自動協商

2bit : link 狀態: up

0bit : 有擴充套件暫存器

開發環境 Linux下獲取PHY暫存器值

下面 描述了在使用者層訪問smi mdio匯流排,讀寫phy晶元暫存器的通用 linux核心2.6以上通用。將下面 編譯後,將可執行檔案a.out 重新命名為mdio mdio eth0 1 讀取phy暫存器1的數值 mdio eth0 0 0x1120 將0x1120寫入 phy暫存器1 eth0...

PHY晶元暫存器讀寫測試TL138FI EVM

1適用性說明 表 1開發板型號 是否支援本實驗 tl5728 easyevm 支援 tl5728 idk 不支援 tl5728f evm 不支援 phy是ieee802.3中定義的乙個標準模組,sta station management entity,管理實體,一般為mac或cpu 通過smi s...

關於linux下訪問暫存器

由於linux體系特殊的結構,於是我們在嵌入式linux中是不能夠直接訪問暫存器的。比如,我們在51中,想讓乙個io口輸出高電平,只需要讓相應的暫存器置1就可以,但是,linux為了保證其程式的可移植性,以及程式的穩定性,不允許這樣直接訪問暫存器。那麼,linux中怎樣才能夠像我們平常操作微控制器一...