天天看點

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

作者:譽天教育ICT認證教育訓練

在嵌入式Linux中,網絡是很常用的一個功能,尤其在工業控制、物聯網等領域,今天我們就來學習一下嵌入式Linux的網絡接口設計!

嵌入式網絡簡介

嵌入式下的網絡硬體接口

提起網絡,我們一般想到的硬體就是“網卡”,現在網卡已經是通過一個晶片來完成了,嵌入式網絡硬體分為兩部分:MAC和PHY,大家都是通過看資料手冊來判斷一款SOC是否支援網絡,如果一款晶片資料手冊說自己支援網絡,一般都是說的這款SOC内置MAC,MAC類似I2C控制器、SPI控制器一樣的外設。但是光有MAC還不能直接驅動網絡,還需要另外一個晶片:PHY,是以對于内置MAC的SOC,其外部必須搭配一個PHY晶片。内部沒有MAC的SOC晶片,就需要使用外置的MAC+PHY一體晶片了,這裡就要牽扯出常見的兩個嵌入式網絡硬體方案了。

1.SOC内部沒有網絡MAC外設

對于内部沒有MAC的SOC晶片,可以使用外置 MAC+PHY一體的網絡晶片來實作網絡功能。比如三星linux開發闆裡面用的最多的DM9000,DM9000對SOC提供了一個SRAM接口,SOC會以SRAM的方式操作DM9000。

有些外置的網絡晶片更強大,内部甚至內建了硬體TCP/IP協定棧,對外提供一個SPI接口,比如W5500。這個一般用于單片機領域,單片機通過SPI接口與W5500進行通信,由于W5500内置了硬體TCP/IP協定棧,是以單片機就不需要移植軟體協定棧,直接通過SPI來操作W5500,簡化了單片機聯網方案。

這種方案的優點就是讓不支援網絡的SOC能夠另辟蹊徑,實作網絡功能,但是缺點就是網絡效率不高,因為一般晶片内置的MAC會有網絡加速引擎,比如網絡專用DMA,網絡處理效率會很高。而且此類晶片網速都不快,基本就是10/100M。另外,相比PHY晶片而言,此類晶片的成本也比較高,可選擇比較少。

SOC與外部MAC+PHY晶片的連接配接如圖1-1所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-1 主要SOC與外置MAC+PHY晶片連接配接

2.SOC内部內建網絡MAC外設

我們一般說某個SOC支援網絡,說的就是他内部內建網絡MAC外設,此時我們還需要外接一個網絡PHY晶片。

目前幾乎所有支援網絡的SOC都是内置MAC外設,比如STM32F4/F7/H7系列、NXP的I.MX系列,内部內建網絡MAC的優點如下:

1)内部MAC外設會有專用的加速子產品,比如專用的DMA,加速網速資料的處理。

2)網速快,可以支援10/100/1000M網速。

3)外接PHY可選擇性多,成本低。

内部的MAC外設會通過MII或者RMII接口來連接配接外部的PHY晶片,MII/RMII接口用來傳輸網絡資料。另外主要需要配置或讀取PHY晶片,也就是讀寫PHY的内部寄存器,是以還需要一個控制接口,叫做MIDO,MDIO很類似IIC,也是兩根線,一根資料線叫做MDIO,一根時鐘線叫做MDC。

SOC内部MAC外設與外部PHY晶片的連接配接如圖1-2所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-2 内部MAC與外部PHY之間的連接配接

大家在做項目的時候,如果要用到網絡功能,強烈建議大家選擇内部帶有網絡MAC外設的主要SOC!I.MX6ULL就有兩個10M/100M的網絡MAC外設,正點原子ALPHA開發闆闆載了兩顆PHY晶片,型号為LAN8720。是以,本章節隻講解SOC内部MAC+外置PHY晶片這種方案。

MII/RMII接口

前面我們說了,内部MAC通過MII/RMII接口來與外部的PHY晶片連接配接,完成網絡資料傳輸,本節我們就來學習一下什麼是MII和RMII接口。

1.MII接口

MII全稱是Media Independent Interface,直譯過來就是媒體獨立接口,它是IEEE-802.3定義的以太網标準接口,MII接口用于以太網MAC連接配接PHY晶片,連接配接示意圖如圖1-3所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-3 MII接口

MII接口一共有16根信号線,含義如下:

TX_CLK:發送時鐘,如果網速為100M的話時鐘頻率為25MHz,10M網速的話時鐘頻率為2.5MHz,此時鐘由PHY産生并發送給MAC。

TX_EN:發送使能信号。

TX_ER:發送錯誤信号,高電平有效,表示TX_ER有效期内傳輸的資料無效。10Mpbs網速下TX_ER不起作用。

TXD[3:0]:發送資料信号線,一共4根。

RXD[3:0]:接收資料信号線,一共4根。

RX_CLK:接收時鐘信号,如果網速為100M的話時鐘頻率為25MHz,10M網速的話時鐘頻率為2.5MHz,RX_CLK也是由PHY産生的。

RX_ER:接收錯誤信号,高電平有效,表示RX_ER有效期内傳輸的資料無效。10Mpbs網速下RX_ER不起作用。

RX_DV:接收資料有效,作用類似TX_EN。

CRS:載波偵聽信号。

COL:沖突檢測信号。

MII接口的缺點就是所需信号線太多,這還沒有算MDIO和MDC這兩根管理接口的資料線,是以MII接口使用已經越來越少了。

2.RMII接口

RMII全稱是Reduced Media Independent Interface,翻譯過來就是精簡的媒體獨立接口,也就是MII接口的精簡版本。RMII接口隻需要7根資料線,相比MII直接減少了9根,極大的友善了闆子布線,RMII接口連接配接PHY晶片的示意圖如圖1-4所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-4 RMII接口

TX_EN:發送使能信号。

TXD[1:0]:發送資料信号線,一共2根。

RXD[1:0]:接收資料信号線,一共2根。

CRS_DV:相當于MII接口中的RX_DV和CRS這兩個信号的混合。

REF_CLK:參考時鐘,由外部時鐘源提供, 頻率為50MHz。這裡與MII不同,MII的接收和發送時鐘是獨立分開的,而且都是由PHY晶片提供的。

除了MII和RMII以外,還有其他接口,比如GMII、RGMII、SMII、SMII等,關于其他接口基本都是大同小異的,這裡就不做講解了。正點原子ALPAH開發闆上的兩個網口都是采用RMII接口來連接配接MAC與外部PHY晶片。

MDIO接口

MDIO全稱是Management Data Input/Output,直譯過來就是管理資料輸入輸出接口,是一個簡單的兩線串行接口,一根MDIO資料線,一根MDC時鐘線。驅動程式可以通過MDIO和MDC這兩根線通路PHY晶片的任意一個寄存器。MDIO接口支援多達32個PHY。同一時刻内隻能對一個PHY進行操作,那麼如何區分這32個PHY晶片呢?和IIC一樣,使用器件位址即可。同一MDIO接口下的所有PHY晶片,其器件位址不能沖突,必須保證唯一,具體器件位址值要查閱相應的PHY資料手冊。

是以,MAC和外部PHY晶片進行連接配接的時候主要是MII/RMII和MDIO接口,另外可能還需要複位、中斷等其他引腳。

RJ45接口

網絡裝置是通過網線連接配接起來的,插入網線的叫做RJ45座,如圖1-5所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-5 RJ45座子

RJ45座要與PHY晶片連接配接在一起,但是中間需要一個網絡變壓器,網絡變壓器用于隔離以及濾波等,網絡變壓器也是一個晶片,外形一般如圖1-6所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-6 網絡變壓器

但是現在很多RJ45座子内部已經內建了網絡變壓器,比如最常用的HR911105A就是内置網絡變壓器的RJ45座。内置網絡變壓器的RJ45座和不内置的引腳一樣,但是一般不内置的RJ45座會短一點。是以,大家在畫闆的時候一定要考慮你所使用的RJ45座是否内置網絡變壓器,如果不内置的話就要自行添加網絡變壓器部分電路!同理,如果你所設計的硬體是需要内置網絡變壓器的RJ45座,肯定不能随便焊接一個不内置變壓器的RJ45座,否則網絡工作不正常!

RJ45座子上一般有兩個燈,一個黃色(橙色),一個綠色,綠色亮的話表示網絡連接配接正常,黃色閃爍的話說明目前正在進行網絡通信。這兩個燈由PHY晶片控制,PHY晶片會有兩個引腳來連接配接RJ45座上的這兩個燈。内部MAC+外部PHY+RJ45座(内置網絡變壓器)就組成了一個完整的嵌入式網絡接口硬體,如圖1-7所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-7 嵌入式網絡硬體接口示意圖

PHY晶片基礎知識

PHY是IEEE 802.3規定的一個标準子產品,前面說了,SOC可以對PHY進行配置或者讀取PHY相關狀态,這個就需要PHY内部寄存器去實作。PHY晶片寄存器位址空間為5位,位址 0~31共32個寄存器,IEEE定義了0~15這16個寄存器的功能,16~31這16個寄存器由廠商自行實作。也就是說不管你用的哪個廠家的PHY晶片,其中0~15這16個寄存器是一模一樣的。僅靠這16個寄存器是完全可以驅動起PHY晶片的,至少能保證基本的網絡資料通信,是以Linux核心有通用PHY驅動,按道理來講,不管你使用的哪個廠家的PHY晶片,都可以使用Linux的這個通用PHY驅動來驗證網絡工作是否正常。

事實上在實際開發中可能會遇到一些其他的問題導緻Linux核心的通用PHY驅動工作不正常,這個時候就需要驅動開發人員去調試了。但是,随着現在的PHY晶片性能越來越強大,32個寄存器可能滿足不了廠商的需求,是以很多廠商采用分頁技術來擴充寄存器位址空間,以求定義更多的寄存器。

這些多出來的寄存器可以用于實作廠商特有的一些技術,是以Linux核心的通用PHY驅動就無法驅動這些特色功能了,這個時候就需要PHY廠商提供相應的驅動源碼了,是以大家也會在Linux核心裡面看到很多具體的PHY晶片驅動源碼。不管你的PHY晶片有多少特色功能,按道理來講,Linux核心的通用PHY驅動是絕對可以讓你這PHY晶片實作基本的網絡通信,是以大家也不用擔心更換PHY晶片以後網絡驅動編寫是不是會很複雜。

IEEE802.3協定英文原版中的 “22.2.4 Management functions”章節,此章節對PHY的前16個寄存器功能進行了規定,如圖1-8所示:

Linux技術幹貨—嵌入式Linux網絡接口設計詳細講解!

圖1-8 IEEE規定的前16個寄存器

關于這16個寄存器的内容協定裡面也進行了詳細的講解,這裡就不分析了。大家可以找個具體的PHY晶片資料手冊對比看一下,比如百M網絡最常用的LAN8720A這個PHY,大家可以看一下LAN8720前面幾個寄存器結構是否和圖1-8中的一樣。

來源:清華大學出版社

繼續閱讀