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中怎樣才能夠像我們平常操作微控制器一...