何玲玲,王永兵
(中國電子科技集團公司 第三十二研究所,上海 201808)
隨著嵌入式系統(tǒng)設備的廣泛應用,當設備需要與多個網(wǎng)絡設備交互數(shù)據(jù)時,需要設備具有多網(wǎng)口、多連接的功能,同時能夠解析應用規(guī)約[1].目前大部分對TMS320C6678處理器的應用場景下,都要求網(wǎng)卡工作在switch模式,這樣兩個slave 端口始終接收到相同的數(shù)據(jù).所以不論是TI提供的keystone架構下的網(wǎng)卡參考驅動,還是互聯(lián)網(wǎng)上能搜索到的關于此網(wǎng)卡的驅動開發(fā),都是關于switch模式的.隨著TMS320C6678處理器的廣泛應用,越來越多的場景需要使用雙網(wǎng)卡模式,即port1和port2作為兩個獨立的網(wǎng)卡使用,分別與不同的設備連接完成不同的功能,這就需要研究基于TMS320C6678的雙網(wǎng)卡驅動實現(xiàn).
本文從網(wǎng)卡模塊簡介、驅動原理分析、驅動設計實現(xiàn)以及驅動測試等多個方面介紹了基于TMS320C6678的雙網(wǎng)卡的原理和實現(xiàn),對TI keystone架構下的多種DSP處理器的雙網(wǎng)卡模式的實現(xiàn)都具有參考和借鑒意義,能極大的擴展該系列處理器的應用范圍.
TMS320C6678處理器基于KeyStone I架構,片上集成了一個網(wǎng)絡協(xié)處理器NETCP,NETCP由千兆以太網(wǎng)交換子系統(tǒng)、包加速器PA (Packet Accelerator)和安全加速器SA (Security Accelerator Engine)組成[2].PA負責數(shù)據(jù)包的分類操作和修改操作,SA負責數(shù)據(jù)包的加密和解密,交換子系統(tǒng)由三端口網(wǎng)絡交換機、MDIO模塊和SGMII模塊組成,其組成框圖如下[3]:
系統(tǒng)中三端口網(wǎng)絡交換機的host port(即port0)負責交換機與網(wǎng)絡協(xié)處理器NETCP之間的通信,兩個slave port(即port1和port2)分別與兩個SGMII模塊相連,負責交換機與SGMII之間的數(shù)據(jù)傳輸.NETCP與 主機之間的數(shù)據(jù)傳輸由PKTDMA完成.
圖1 以太網(wǎng)交換子系統(tǒng)框圖[3]
交換機主要由以下模塊組成: 流媒體數(shù)據(jù)接口、MAC控制器、MAC接收FIFO、信息統(tǒng)計模塊、時間同步模塊和ALE模塊.
流媒體數(shù)據(jù)接口包括發(fā)送流媒體數(shù)據(jù)接口和接收流媒體數(shù)據(jù)接口.發(fā)送流媒體數(shù)據(jù)接口負責將數(shù)據(jù)包從port 0傳輸?shù)絅ETCP,交換機有兩個相同的發(fā)送流媒體數(shù)據(jù)接口(TXA和TXB),其中TXA輸出從port1傳給port0的數(shù)據(jù)包,TXB輸出從port2傳給port0的數(shù)據(jù)包.接收流媒體數(shù)據(jù)接口負責接收來自于NETCP內的數(shù)據(jù)[3].
MAC控制器不僅負責完成交換機與SGMII模塊之間的信號轉換,還負責與IEEE802.3以太網(wǎng)幀相關的操作; MAC接收FIFO供數(shù)據(jù)傳輸時使用; 信息統(tǒng)計模塊用來記錄三個端口數(shù)據(jù)收發(fā)的情況,便于網(wǎng)絡調試; 時間同步模塊的主要用途是檢測時間同步事件并生成時間戳,然后將此信息提供給主機軟件進行處理.
ALE模塊處理所有接收的包,確定每個包被發(fā)往哪個端口.當ALE非能時,所有數(shù)據(jù)包都被丟棄.當ALE工作在bypass模式時,MAC模塊接收的所有數(shù)據(jù)包都只給port0,port0可以發(fā)送定向包給port1或者(和)port2.
多核導航器是Keystone架構的核心組成部分.多核導航器使用隊列管理子系統(tǒng)(Queue Manager SubSystem,QMSS)和打包DMA(PKTDMA)來控制和完成高速數(shù)據(jù)包在設備內的傳輸.NETCP與主機之間的數(shù)據(jù)傳輸由PKTDMA完成,PKTDMA處理的數(shù)據(jù)是以描述符的形式存在的,描述符存在于隊列中,由QMSS的PDSP固件完成隊列中描述符的操作.當網(wǎng)卡硬件初始化完成后,主機發(fā)送數(shù)據(jù)時,從發(fā)送空閑隊列分配一個描述符,填寫描述符域和負載數(shù)據(jù)后,將描述符PUSH到發(fā)送隊列,隊列管理器為隊列提供一個層敏感(level sensitive)狀態(tài)信號量,負責DMA的調度操作,DMA控制器最終引入相應通道的上下文,并且開始處理包.DMA控制器通過將數(shù)據(jù)塊中的內容傳輸出去的方式,來清空緩沖區(qū).根據(jù)包大小域中指定的大小,包中的數(shù)據(jù)全部傳輸完之后,DMA會將包描述符的指針寫到隊列中,這個隊列在返回隊列管理(包描述符的返回隊列數(shù)目域)中被指定,通常指定為發(fā)送空閑隊列便于以后發(fā)送數(shù)據(jù)時使用.當Rx DMA給定的通道上開始一個包接收操作時,這個端口會從接收空閑隊列中取出一個描述符,將數(shù)據(jù)寫入描述符對應的緩存中.當整個包被接收之后,PKTDMA 將包描述符指針寫入相應的接收完成隊列,用戶處理完接收數(shù)據(jù)包后,將描述符重新PUSH到接收空閑隊列供PKTDMA下次接收使用.
主機發(fā)送數(shù)據(jù)時,接收流媒體數(shù)據(jù)接口能夠從接收的將要發(fā)送給以太網(wǎng)交換機的描述符的PS_FLAGS字段中提煉出額外的控制信息.該字段的說明如表1所示.
從表1可看出,可以在發(fā)送描述符的PS_FLAGS字段中設置端口號從而將數(shù)據(jù)包定向發(fā)送給交換機的某個端口,前提是ALE必須工作在bypass模式.
表1 PS_FLAGS字段說明[3]
數(shù)據(jù)接收時,不論port1還是port2接收到數(shù)據(jù)都會傳輸?shù)絧ort0,通過發(fā)送流媒體數(shù)據(jù)接口傳輸?shù)絅ETCP,其中來自port1的數(shù)據(jù)通過TXA傳輸,來自port2的數(shù)據(jù)通過TXB傳輸.TXA和TXB不僅傳輸數(shù)據(jù)包,還提供了一些額外信息,這些信息由PKTDMA的接收flow控制.接收flow的配置寄存器C的部分字段描述如表2所示.
表2 接收flow的配置寄存器C的字段描述[4]
Host packet描述符的字段描述見表3.
從表2和表3可以看出,如果將網(wǎng)卡接收flow的配置寄存器C的bit26-24(RX_SRC_TAG_LO_SEL)設置成4,則當端口接收到數(shù)據(jù)時,PKTDMA控制器會將接收描述符的word1的source tag-lo字段設置成該端口的SRC_ID值,兩個slave端口的SRC_ID值是不同的.網(wǎng)卡接收到數(shù)據(jù)時,根據(jù)接收描述符的word1的source tag-lo字段的值就可判斷出該數(shù)據(jù)包來自哪個端口.
表3 Host packet描述符的字段描述[4]
為了實現(xiàn)TMS320C6678的雙網(wǎng)卡驅動,需要完成硬件初始化、數(shù)據(jù)包的發(fā)送和接收等功能.尤其是要解決好下面兩個問題: 數(shù)據(jù)包發(fā)送時,交換機內部的接收流媒體數(shù)據(jù)接口需要知道它從NETCP接收的數(shù)據(jù)將要發(fā)給哪個端口; 接收到數(shù)據(jù)包后,驅動需要根據(jù)接收的數(shù)據(jù)包判斷其來自哪個端口.
(1) 網(wǎng)卡硬件初始化
這里需要完成跟網(wǎng)卡工作相關的所有硬件的初始化,包括:
a) 多核導航器的初始化
多核導航器由隊列管理器、PKTDMA、導航云、打包數(shù)據(jù)結構協(xié)處理器(Packed-Data Structure Processors,PDSP)固件等模塊組成[4].初始化時,主要完成PDSP固件的下載和執(zhí)行.
b) memory region的初始化
完成網(wǎng)卡工作時使用的描述符區(qū)間的初始化工作,包括描述符的起始地址、大小、數(shù)量、使用的內存區(qū)域的序號等的初始化.
c) 描述符的初始化
由于數(shù)據(jù)在NETCP與主機之間的傳輸由PKTDMA完成,數(shù)據(jù)包需要封裝成PKTDMA能夠識別的描述符格式.驅動中使用了host packet描述符的格式.
從已經(jīng)初始化的memory region中分配一定數(shù)量的發(fā)送空閑描述符和接收空閑描述符,并為每個描述符分配buffer地址空間,所有的發(fā)送空閑描述符被PUSH到發(fā)送空閑隊列,所有的接收空閑描述符被PUSH到接收空閑隊列.兩個網(wǎng)卡具有不同的描述符地址和不同的發(fā)送接收空閑隊列號.
d) SGMII_SERDES初始化
依次配置PLL寄存器,兩個端口的發(fā)送配置和接收配置寄存器.
e) SGMII模塊初始化
配置兩個端口的連接模式(master或者slave)、工作模式(全雙工或半雙工)、連接速度、是否自動協(xié)商等.
f) MAC初始化
設置MAC地址,雖然器件的MAC地址只有一個,但是可以虛擬一個出來,確保兩個端口分別配置了不同的MAC地址,除此之外,還配置了VLAN和接收幀的最大長度.
g) 三端口交換機switch初始化
完成端口0的使能啟動、網(wǎng)卡統(tǒng)計功能的配置(便于調試)以及ALE (Address Lookup Engine)的配置等,這里需要注意的是,雙網(wǎng)卡模式時,ALE必須工作在bypass模式.
由于需要通過接收描述符中的SRC_ID判斷接收數(shù)據(jù)的來源,所以分別為port1和port2設置SRC_ID值.port1和port2的SRC_ID值即TXA_SRC_ID和TXB_SRC_ID,可通過設置寄存器P0_CPPI_SRC_ID來設置.
h) cppi初始化
完成網(wǎng)卡的發(fā)送通道和接收通道的使能,接收Flow ID、接收空閑隊列和接收完成隊列的配置等.
i) PA子系統(tǒng)初始化
完成PA固件下載、廣播和組播路由配置、添加MAC地址到PA PDSP查找表等工作.
j) 接收flow初始化
完成Rx DMA的接收完成隊列、接收空閑隊列、描述符類型等的配置,需要注意配置寄存器C的RX_SRC_TAG_LO_SEL字段要設置成4.
(2) 數(shù)據(jù)包發(fā)送
從發(fā)送空閑隊列分配一個描述符,填寫描述符域和負載數(shù)據(jù),注意在描述符word2的Protocol Specific Flags字段中指定數(shù)據(jù)包發(fā)給哪個端口,然后將描述符PUSH到發(fā)送隊列,PKTDMA將將數(shù)據(jù)包直接發(fā)送給指定的端口.
(3) 數(shù)據(jù)包接收
當PKTDMA的接收完成隊列接收到數(shù)據(jù)后會產(chǎn)生接收完成中斷,在中斷服務程序中,根據(jù)接收描述符word1的source tag-lo字段的值即可判斷出數(shù)據(jù)的來源,從而做出正確處理.
如果TMS320C6678開發(fā)板上的兩個網(wǎng)絡端口都通過RJ45接口引出來了,那么就把它們當作兩個獨立的普通網(wǎng)卡,分別進行測試驗證即可.但是實際上有很多DSP6678開發(fā)板的網(wǎng)口只引出來了一個,在使用中另一個端口通過特定的背板與其他以太網(wǎng)設備進行通信.這里以TIC6678公板為例重點介紹只引出一個網(wǎng)絡端口的情況下的雙網(wǎng)卡測試方法.
TIC6678公板的網(wǎng)卡0沒有通過RJ45接口引出來,只引出了網(wǎng)卡1,通過配套的背板可以將兩塊公板的網(wǎng)卡0對連起來.當兩條鏈路都能正常通信時,表明雙網(wǎng)卡能正常工作了.具體有以下兩種測試方法:
(1) 兩塊公板的網(wǎng)卡1分別與兩臺PC機相連
分別為兩塊公板的兩個網(wǎng)卡設置不同網(wǎng)段的IP地址,并分別與兩臺PC機相連,IP的具體要求以及整個測試系統(tǒng)的連接如圖2所示.
圖2 TIC6678公板的雙網(wǎng)卡測試系統(tǒng)
當同時滿足以下測試結果時,表明兩塊公板的雙網(wǎng)卡均工作正常.
a) PC機1可以ping通公板1的網(wǎng)卡1,PC機1不能ping通公板2的兩個網(wǎng)卡;
b) PC機2可以ping通公板2的網(wǎng)卡1,PC機2不能ping通公板1的兩個網(wǎng)卡;
c)公板1 ping不通公板2的網(wǎng)卡1,公板2 ping不通公板1的網(wǎng)卡1;
d) 兩塊公板的網(wǎng)卡0互相可以ping通.
(2) 兩塊公板的網(wǎng)卡1互連
當兩塊公板的網(wǎng)卡1互相可以ping通,網(wǎng)卡0互相可以ping通,但是一塊板子的網(wǎng)卡1和另一塊板子的網(wǎng)卡0 ping不通時,則雙網(wǎng)卡工作正常.
按照圖2的IP要求配置了通過背板連接的兩塊TIC6678開發(fā)板的網(wǎng)卡,并將它們的網(wǎng)卡1通過網(wǎng)線互連,網(wǎng)卡1互相可以ping通,網(wǎng)卡0互相可以ping通,測試結果如圖3和圖4所示.
圖3 兩塊公板網(wǎng)卡1通過網(wǎng)線互連時,公板1網(wǎng)卡ping公板2網(wǎng)卡
圖4 兩塊公板網(wǎng)卡1通過網(wǎng)線互連時,公板2網(wǎng)卡ping公板1網(wǎng)卡
斷開兩塊公板的網(wǎng)卡1之間的網(wǎng)線,雙網(wǎng)卡模式下網(wǎng)卡1的網(wǎng)絡連接就斷了,測試結果如圖5和圖6所示.
測試結果表明本文實現(xiàn)的基于TMS320C6678的雙網(wǎng)卡驅動工作正常.雙網(wǎng)卡工作模式目前已在多個項目中投入使用.
圖5 兩塊公板網(wǎng)卡1之間的網(wǎng)線斷開時,公板1網(wǎng)卡ping公板2網(wǎng)卡
圖6 兩塊公板網(wǎng)卡1之間的網(wǎng)線斷開時,公板2網(wǎng)卡ping公板1網(wǎng)卡
測試結果以及實際應用情況表明,本文設計的基于TMS320C6678的雙網(wǎng)卡驅動是成功的,該功能的實現(xiàn)使得TI KEYSTONE 1架構下的DSP芯片的應用范圍更加廣泛而不僅僅局限于switch模式下的應用場景.