何玲玲,王永兵
(中國電子科技集團公司 第三十二研究所,上海 201808)
隨著嵌入式系統設備的廣泛應用,當設備需要與多個網絡設備交互數據時,需要設備具有多網口、多連接的功能,同時能夠解析應用規約[1].目前大部分對TMS320C6678處理器的應用場景下,都要求網卡工作在switch模式,這樣兩個slave 端口始終接收到相同的數據.所以不論是TI提供的keystone架構下的網卡參考驅動,還是互聯網上能搜索到的關于此網卡的驅動開發,都是關于switch模式的.隨著TMS320C6678處理器的廣泛應用,越來越多的場景需要使用雙網卡模式,即port1和port2作為兩個獨立的網卡使用,分別與不同的設備連接完成不同的功能,這就需要研究基于TMS320C6678的雙網卡驅動實現.
本文從網卡模塊簡介、驅動原理分析、驅動設計實現以及驅動測試等多個方面介紹了基于TMS320C6678的雙網卡的原理和實現,對TI keystone架構下的多種DSP處理器的雙網卡模式的實現都具有參考和借鑒意義,能極大的擴展該系列處理器的應用范圍.
TMS320C6678處理器基于KeyStone I架構,片上集成了一個網絡協處理器NETCP,NETCP由千兆以太網交換子系統、包加速器PA (Packet Accelerator)和安全加速器SA (Security Accelerator Engine)組成[2].PA負責數據包的分類操作和修改操作,SA負責數據包的加密和解密,交換子系統由三端口網絡交換機、MDIO模塊和SGMII模塊組成,其組成框圖如下[3]:
系統中三端口網絡交換機的host port(即port0)負責交換機與網絡協處理器NETCP之間的通信,兩個slave port(即port1和port2)分別與兩個SGMII模塊相連,負責交換機與SGMII之間的數據傳輸.NETCP與 主機之間的數據傳輸由PKTDMA完成.

圖1 以太網交換子系統框圖[3]
交換機主要由以下模塊組成: 流媒體數據接口、MAC控制器、MAC接收FIFO、信息統計模塊、時間同步模塊和ALE模塊.
流媒體數據接口包括發送流媒體數據接口和接收流媒體數據接口.發送流媒體數據接口負責將數據包從port 0傳輸到NETCP,交換機有兩個相同的發送流媒體數據接口(TXA和TXB),其中TXA輸出從port1傳給port0的數據包,TXB輸出從port2傳給port0的數據包.接收流媒體數據接口負責接收來自于NETCP內的數據[3].
MAC控制器不僅負責完成交換機與SGMII模塊之間的信號轉換,還負責與IEEE802.3以太網幀相關的操作; MAC接收FIFO供數據傳輸時使用; 信息統計模塊用來記錄三個端口數據收發的情況,便于網絡調試; 時間同步模塊的主要用途是檢測時間同步事件并生成時間戳,然后將此信息提供給主機軟件進行處理.
ALE模塊處理所有接收的包,確定每個包被發往哪個端口.當ALE非能時,所有數據包都被丟棄.當ALE工作在bypass模式時,MAC模塊接收的所有數據包都只給port0,port0可以發送定向包給port1或者(和)port2.
多核導航器是Keystone架構的核心組成部分.多核導航器使用隊列管理子系統(Queue Manager SubSystem,QMSS)和打包DMA(PKTDMA)來控制和完成高速數據包在設備內的傳輸.NETCP與主機之間的數據傳輸由PKTDMA完成,PKTDMA處理的數據是以描述符的形式存在的,描述符存在于隊列中,由QMSS的PDSP固件完成隊列中描述符的操作.當網卡硬件初始化完成后,主機發送數據時,從發送空閑隊列分配一個描述符,填寫描述符域和負載數據后,將描述符PUSH到發送隊列,隊列管理器為隊列提供一個層敏感(level sensitive)狀態信號量,負責DMA的調度操作,DMA控制器最終引入相應通道的上下文,并且開始處理包.DMA控制器通過將數據塊中的內容傳輸出去的方式,來清空緩沖區.根據包大小域中指定的大小,包中的數據全部傳輸完之后,DMA會將包描述符的指針寫到隊列中,這個隊列在返回隊列管理(包描述符的返回隊列數目域)中被指定,通常指定為發送空閑隊列便于以后發送數據時使用.當Rx DMA給定的通道上開始一個包接收操作時,這個端口會從接收空閑隊列中取出一個描述符,將數據寫入描述符對應的緩存中.當整個包被接收之后,PKTDMA 將包描述符指針寫入相應的接收完成隊列,用戶處理完接收數據包后,將描述符重新PUSH到接收空閑隊列供PKTDMA下次接收使用.
主機發送數據時,接收流媒體數據接口能夠從接收的將要發送給以太網交換機的描述符的PS_FLAGS字段中提煉出額外的控制信息.該字段的說明如表1所示.
從表1可看出,可以在發送描述符的PS_FLAGS字段中設置端口號從而將數據包定向發送給交換機的某個端口,前提是ALE必須工作在bypass模式.

表1 PS_FLAGS字段說明[3]
數據接收時,不論port1還是port2接收到數據都會傳輸到port0,通過發送流媒體數據接口傳輸到NETCP,其中來自port1的數據通過TXA傳輸,來自port2的數據通過TXB傳輸.TXA和TXB不僅傳輸數據包,還提供了一些額外信息,這些信息由PKTDMA的接收flow控制.接收flow的配置寄存器C的部分字段描述如表2所示.

表2 接收flow的配置寄存器C的字段描述[4]
Host packet描述符的字段描述見表3.
從表2和表3可以看出,如果將網卡接收flow的配置寄存器C的bit26-24(RX_SRC_TAG_LO_SEL)設置成4,則當端口接收到數據時,PKTDMA控制器會將接收描述符的word1的source tag-lo字段設置成該端口的SRC_ID值,兩個slave端口的SRC_ID值是不同的.網卡接收到數據時,根據接收描述符的word1的source tag-lo字段的值就可判斷出該數據包來自哪個端口.

表3 Host packet描述符的字段描述[4]
為了實現TMS320C6678的雙網卡驅動,需要完成硬件初始化、數據包的發送和接收等功能.尤其是要解決好下面兩個問題: 數據包發送時,交換機內部的接收流媒體數據接口需要知道它從NETCP接收的數據將要發給哪個端口; 接收到數據包后,驅動需要根據接收的數據包判斷其來自哪個端口.
(1) 網卡硬件初始化
這里需要完成跟網卡工作相關的所有硬件的初始化,包括:
a) 多核導航器的初始化
多核導航器由隊列管理器、PKTDMA、導航云、打包數據結構協處理器(Packed-Data Structure Processors,PDSP)固件等模塊組成[4].初始化時,主要完成PDSP固件的下載和執行.
b) memory region的初始化
完成網卡工作時使用的描述符區間的初始化工作,包括描述符的起始地址、大小、數量、使用的內存區域的序號等的初始化.
c) 描述符的初始化
由于數據在NETCP與主機之間的傳輸由PKTDMA完成,數據包需要封裝成PKTDMA能夠識別的描述符格式.驅動中使用了host packet描述符的格式.
從已經初始化的memory region中分配一定數量的發送空閑描述符和接收空閑描述符,并為每個描述符分配buffer地址空間,所有的發送空閑描述符被PUSH到發送空閑隊列,所有的接收空閑描述符被PUSH到接收空閑隊列.兩個網卡具有不同的描述符地址和不同的發送接收空閑隊列號.
d) SGMII_SERDES初始化
依次配置PLL寄存器,兩個端口的發送配置和接收配置寄存器.
e) SGMII模塊初始化
配置兩個端口的連接模式(master或者slave)、工作模式(全雙工或半雙工)、連接速度、是否自動協商等.
f) MAC初始化
設置MAC地址,雖然器件的MAC地址只有一個,但是可以虛擬一個出來,確保兩個端口分別配置了不同的MAC地址,除此之外,還配置了VLAN和接收幀的最大長度.
g) 三端口交換機switch初始化
完成端口0的使能啟動、網卡統計功能的配置(便于調試)以及ALE (Address Lookup Engine)的配置等,這里需要注意的是,雙網卡模式時,ALE必須工作在bypass模式.
由于需要通過接收描述符中的SRC_ID判斷接收數據的來源,所以分別為port1和port2設置SRC_ID值.port1和port2的SRC_ID值即TXA_SRC_ID和TXB_SRC_ID,可通過設置寄存器P0_CPPI_SRC_ID來設置.
h) cppi初始化
完成網卡的發送通道和接收通道的使能,接收Flow ID、接收空閑隊列和接收完成隊列的配置等.
i) PA子系統初始化
完成PA固件下載、廣播和組播路由配置、添加MAC地址到PA PDSP查找表等工作.
j) 接收flow初始化
完成Rx DMA的接收完成隊列、接收空閑隊列、描述符類型等的配置,需要注意配置寄存器C的RX_SRC_TAG_LO_SEL字段要設置成4.
(2) 數據包發送
從發送空閑隊列分配一個描述符,填寫描述符域和負載數據,注意在描述符word2的Protocol Specific Flags字段中指定數據包發給哪個端口,然后將描述符PUSH到發送隊列,PKTDMA將將數據包直接發送給指定的端口.
(3) 數據包接收
當PKTDMA的接收完成隊列接收到數據后會產生接收完成中斷,在中斷服務程序中,根據接收描述符word1的source tag-lo字段的值即可判斷出數據的來源,從而做出正確處理.
如果TMS320C6678開發板上的兩個網絡端口都通過RJ45接口引出來了,那么就把它們當作兩個獨立的普通網卡,分別進行測試驗證即可.但是實際上有很多DSP6678開發板的網口只引出來了一個,在使用中另一個端口通過特定的背板與其他以太網設備進行通信.這里以TIC6678公板為例重點介紹只引出一個網絡端口的情況下的雙網卡測試方法.
TIC6678公板的網卡0沒有通過RJ45接口引出來,只引出了網卡1,通過配套的背板可以將兩塊公板的網卡0對連起來.當兩條鏈路都能正常通信時,表明雙網卡能正常工作了.具體有以下兩種測試方法:
(1) 兩塊公板的網卡1分別與兩臺PC機相連
分別為兩塊公板的兩個網卡設置不同網段的IP地址,并分別與兩臺PC機相連,IP的具體要求以及整個測試系統的連接如圖2所示.

圖2 TIC6678公板的雙網卡測試系統
當同時滿足以下測試結果時,表明兩塊公板的雙網卡均工作正常.
a) PC機1可以ping通公板1的網卡1,PC機1不能ping通公板2的兩個網卡;
b) PC機2可以ping通公板2的網卡1,PC機2不能ping通公板1的兩個網卡;
c)公板1 ping不通公板2的網卡1,公板2 ping不通公板1的網卡1;
d) 兩塊公板的網卡0互相可以ping通.
(2) 兩塊公板的網卡1互連
當兩塊公板的網卡1互相可以ping通,網卡0互相可以ping通,但是一塊板子的網卡1和另一塊板子的網卡0 ping不通時,則雙網卡工作正常.
按照圖2的IP要求配置了通過背板連接的兩塊TIC6678開發板的網卡,并將它們的網卡1通過網線互連,網卡1互相可以ping通,網卡0互相可以ping通,測試結果如圖3和圖4所示.

圖3 兩塊公板網卡1通過網線互連時,公板1網卡ping公板2網卡

圖4 兩塊公板網卡1通過網線互連時,公板2網卡ping公板1網卡
斷開兩塊公板的網卡1之間的網線,雙網卡模式下網卡1的網絡連接就斷了,測試結果如圖5和圖6所示.
測試結果表明本文實現的基于TMS320C6678的雙網卡驅動工作正常.雙網卡工作模式目前已在多個項目中投入使用.

圖5 兩塊公板網卡1之間的網線斷開時,公板1網卡ping公板2網卡

圖6 兩塊公板網卡1之間的網線斷開時,公板2網卡ping公板1網卡
測試結果以及實際應用情況表明,本文設計的基于TMS320C6678的雙網卡驅動是成功的,該功能的實現使得TI KEYSTONE 1架構下的DSP芯片的應用范圍更加廣泛而不僅僅局限于switch模式下的應用場景.