加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、前言
    • 二、mdio基礎(chǔ)概念
    • 三、mdio協(xié)議波形
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

如何使用gpio模擬mdio通信?

11/12 11:40
1571
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、前言

實際項目開發(fā)中,由于設(shè)計原因,會將phy的mdio引腳連接到SoC的2個空閑gpio上,這樣就無法通過Gmac自有的架構(gòu)實現(xiàn)修改phy,因此只能通過GPIO模擬的方式實現(xiàn)MDIO,好在Linux支持MDIO via GPIO功能。

該功能需要用到內(nèi)核驅(qū)動mdio-bitbang.c和mdio-gpio.c。

本例 :

    平臺:復(fù)旦微
    kernel 版本:linux 4.14.55-xxxxx
    phy連接到gmac0
    mdio總線連接到:gpioc 2、portc 3

二、mdio基礎(chǔ)概念

1、SMI接口

SMI是MAC內(nèi)核訪問PHY寄存器接口,它由兩根線組成,雙工:

MDC(Management Data Clock)為時鐘,MDIO(Management Data Input/Output)為雙向數(shù)據(jù)通信,原理上跟I2C總線很類似,也可以通過總線訪問多個不同的phy。

MDIO協(xié)議是以太網(wǎng)標(biāo)準(zhǔn)IEEE802.3中專門用于MAC和PYH之間管理的串行接口總線,該接口主要用于MAC控制器對PYH層的狀態(tài)讀取和設(shè)置(寄存器操作)、獲取鏈路狀態(tài),控制物理層協(xié)商等操作。

MDC/MDIO基本特性:
    兩線制 ? ?:MDC(時鐘線)和MDIO(數(shù)據(jù)線)。分主從設(shè)備。
    時鐘頻率:2.5MHz
    通信方式:總線制,可同時接入的PHY數(shù)量為32個通過SMI接口,MAC芯片主動的輪詢PHY層芯片,獲得狀態(tài)信息,并發(fā)出命令信息。

其中主設(shè)備稱作STA,從設(shè)備稱作MDI,一個主設(shè)備可以對多個從設(shè)備進(jìn)行命令讀寫操作。

三、mdio協(xié)議波形

1、MDIO接口數(shù)據(jù)幀

在IEEE802.3協(xié)議中,把MDIO接口數(shù)據(jù)幀分為兩種,一種是Clause22,另一種是Clause45

前者主要用于百兆千兆以太網(wǎng),后者用于千兆以上的以太網(wǎng)。

2、Clause22

MDIO 接口的讀寫通信協(xié)議如下圖所示:

CLAUSE22 數(shù)據(jù)幀協(xié)議

Preamble

32 位前導(dǎo)碼,由 MAC 端發(fā)送 32 位邏輯“1”,用于同步 PHY 芯片。

ST(Start of Frame):

2 位幀開始信號,用 01 表示。

OP(Operation Code):

2 位操作碼,讀:10 寫:01。

PHYAD(PHY Address):

5 位 PHY 地址,用于表示與哪個 PHY 芯片通信,因此一個 MAC 上可以連 接多個 PHY 芯片。

REGAD(Register Address):

5 位寄存器地址,可以表示共 32 位寄存器。

TA(Turnaround):

2 位轉(zhuǎn)向,

在讀命令中,MDIO 在此時由 MAC 驅(qū)動改為 PHY 驅(qū)動,在第一個 TA 位,MDIO 引腳為高阻狀態(tài),第二個 TA 位,PHY 將 MDIO 引腳拉低,準(zhǔn)備發(fā)送數(shù)據(jù);

在寫命令中,不需 要 MDIO 方向發(fā)生變化,MAC 固定輸出 2’b10,隨后開始寫入數(shù)據(jù)。

DATA:

16 位數(shù)據(jù),在讀命令中,PHY 芯片將讀到的對應(yīng) PHYAD 的 REGAD 寄存器的數(shù)據(jù)寫到 DATA 中;在寫命令中,PHY 芯片將接收到的 DATA 寫入 REGAD 寄存器中。需要注意的是,在 DATA 傳 輸?shù)倪^程中,高位在前,低位在后。

IDLE:

空閑狀態(tài),此時 MDIO 為無源驅(qū)動,處于高阻狀態(tài),但一般用上拉電阻使其上拉至高電平。

波形舉例
向phy:3 寄存器0x00?寫入?數(shù)據(jù)0x4140

3、Clause45

四、YT8521

YT8521S是一款高度集成的以太網(wǎng)收發(fā)器,符合10BASE-Te、100BASE-TX和1000BASE-T IEEE 802.3標(biāo)準(zhǔn)。

1、引腳

其中與mdio相關(guān)引腳:

14??MDC?????????Management?Data?Clock
15??MDIO????????Input/Output?of?Management?Data.
??????Pull?up?3.3V/2.5V/1.8V?for?3.3V/2.5V/1.8V?I/O?respectively

2、模塊圖

3、MDIO協(xié)議時序-[重要]

下面YT8521的SMI時序圖

上升沿讀數(shù)據(jù),下降沿寫數(shù)據(jù)

五、驅(qū)動移植

1、驅(qū)動文件及移植

mdio-gpio.c
mdio-bitbang.c

在這里插入圖片描述

勾選 下面幾項:

??│?│???????????????????<*>???Bitbanged?MDIO?buses????????????????????????????????????????????│?│??
??│?│???????????????????<*>???GPIO?controlled?MDIO?bus?multiplexers???????????????????????????│?│??
??│?│???????????????????<*>???MMIO?device-controlled?MDIO?bus?multiplexers????????????????????│?│??

2、移植設(shè)備樹

?aliases?{
????…………
?????mdio-gpio0?=?&mdio0;
?};
?
?mdio0:?mdio?{
?????compatible?=?"virtual,mdio-gpio";
?????gpios?=?<&portc?2?0?>,<&portc?3?0>;???????????????????????????????????????????????
?????#address-cells?=?<1>;
?????#size-cells?=?<0>;
???
?????phy0:?ethernet-phy@7?{
?????????reg?=?<0x7>;
?????????yt,phy-delay?=?<0xfc>;
?????????phy-connection-type?=?"rgmii-id";
?????};
?};
?&gmac0?{
??status?=?"okay";
??phy-handle?=?<&phy0>;
?};

由設(shè)備樹可知,

    我們創(chuàng)建了1個獨(dú)立的mdio設(shè)備節(jié)點,當(dāng)用命令mdio修改phy時,就會根據(jù)gmac0的phy-handle,找到mdio0節(jié)點從而調(diào)用mdio-gpio驅(qū)動模塊來配置phy:8521。

下圖,是phy直接連接到gmac0的mdio接口,mdio命令執(zhí)行的通路:

下圖是phy連接到gpio口,mdio命令執(zhí)行的通路:

3、查看log

開機(jī)有以下log,說明驅(qū)動 移植成功:

#?dmesg?|?grep?MDIO
[????3.257270]?libphy:?GPIO?Bitbanged?MDIO:?probed
[????3.274202]?libphy:?Fixed?MDIO?Bus:?probed
#?cd?/sys/class/mdio_bus/
#?ls
fixed-0???gpio-0????stmmac-0??stmmac-1
#?cd?gpio-0/
#?ls
device?????gpio-0:03??of_node????power??????subsystem??uevent
#?cd?gpio-0:03/
#?ls
attached_dev????phy_has_fixups??power
driver??????????phy_id??????????subsystem
of_node?????????phy_interface???uevent

4、操作

修改eth0為百兆速率,則設(shè)置Speed_Selection位為01,同時自動協(xié)商為Autoneg_En要禁用,即設(shè)置該寄存器值為0x2140:

#?mdio?eth0?0x00?0x2140
?write?phy?addr:?0x3??reg:?0x0??value?:?0x2140

抓取波形如下:

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號『一口Linux』號主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗和培訓(xùn)經(jīng)驗。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實際項目出發(fā),保持原理+實踐風(fēng)格,適合Linux驅(qū)動新手入門和技術(shù)進(jìn)階。