劉文元
(中國(guó)電科網(wǎng)絡(luò)通信研究院,河北 石家莊 050011)
隨著物聯(lián)網(wǎng)時(shí)代的到來(lái),嵌入式系統(tǒng)的以太網(wǎng)設(shè)備需求量與日俱增,而負(fù)責(zé)以太網(wǎng)數(shù)據(jù)編碼和傳輸?shù)奈锢韺邮瞻l(fā)器的需求量也隨之增長(zhǎng)。在加快集成電路產(chǎn)業(yè)自主可控步伐的趨勢(shì)下,PHY 芯片的研發(fā)工作正如火如荼地進(jìn)行。
芯片的測(cè)試工作,是芯片在流片完成之后,交付給客戶之前的重要一環(huán),旨在驗(yàn)證芯片的硬件功能,為終端用戶提供驅(qū)動(dòng)程序的代碼原型。在產(chǎn)業(yè)實(shí)踐中,對(duì)于PHY 的UVM驗(yàn)證工作雖有文獻(xiàn)可參考,但對(duì)于PHY 芯片的板級(jí)測(cè)試問題,尚無(wú)統(tǒng)一的標(biāo)準(zhǔn),需要開發(fā)者自己按照PHY 的數(shù)據(jù)手冊(cè)編寫驅(qū)動(dòng)。若沒有PHY 芯片廠商提供直接的技術(shù)支持,調(diào)試過(guò)程就會(huì)面臨苦難。
考慮到用戶可能會(huì)面臨的PHY 調(diào)試問題,基于一款自主研發(fā)的GPHY(Gigabit Physical Layer Transceiver)的功能驗(yàn)證工作,本文首先介紹了GPHY 測(cè)試系統(tǒng)的架構(gòu),也即GPHY 的典型使用場(chǎng)景;然后著重論述了測(cè)試程序的設(shè)計(jì),提出了將數(shù)據(jù)分階段loopback 的測(cè)試方法;最后展示了測(cè)試過(guò)程中的系統(tǒng)日志和基于LwIP 的網(wǎng)絡(luò)實(shí)驗(yàn)結(jié)果。希望能為同行的以太網(wǎng)PHY 功能測(cè)試和應(yīng)用開發(fā)提供參考經(jīng)驗(yàn)。
以太網(wǎng)是遵守IEEE 802.3 標(biāo)準(zhǔn)的局域網(wǎng),TCP/IP 參考模型中的物理層(PHY)一般由專用的數(shù)?;旌霞呻娐穪?lái)實(shí)現(xiàn),即PHY 芯片,而與之直接交互的就是數(shù)據(jù)鏈路層中的介質(zhì)訪問控制子層(MAC),因此PHY 芯片的功能驗(yàn)證離不開MAC 的支持。
為了驗(yàn)證GPHY 的功能,本文選取了一種基于Cortex-M4 內(nèi)核的32 位微控制器(MCU),它的APB 總線上掛載的以太網(wǎng)外設(shè)模塊支持千兆速率MAC(GMAC)的功能。以太網(wǎng)外設(shè)模塊中還集成了站管理接口(SMI),專門用于和外部PHY 之間的通信,以訪問PHY 芯片的寄存器。MCU 與GPHY 通過(guò)標(biāo)準(zhǔn)的千兆介質(zhì)獨(dú)立接口(GMII)來(lái)連接,GMII 提供了時(shí)鐘和數(shù)據(jù)的傳輸途徑。
為便于在線調(diào)試和單步跟蹤,選擇了使用非常廣泛的Keil-5 作為測(cè)試程序的開發(fā)環(huán)境,該環(huán)境自帶了交叉編譯工具,方便用戶移植本測(cè)試程序到特定的應(yīng)用場(chǎng)景。程序的在線調(diào)試與跟蹤依賴調(diào)試器CMSIS-DAP Debugger,它通過(guò)Jtag 接口與MCU 相連接,通過(guò)USB 接口與PC 相連接。此外,MCU 的UART 通過(guò)RS232 與PC 的串口相連接,在PC端開啟串口調(diào)試助手,可以查看包括了程序運(yùn)行狀態(tài)、PHY寄存器狀態(tài)和測(cè)試信息的系統(tǒng)日志。PC 機(jī)上的網(wǎng)線通過(guò)水晶頭插在RJ-45 上,RJ-45 與PHY 芯片之間有一個(gè)負(fù)責(zé)電壓變換的器件H5007,二者之間的引線MDI+/-上傳輸?shù)氖遣罘中盘?hào)。GPHY 測(cè)試系統(tǒng)的架構(gòu)圖,如圖1所示。
圖1 GPHY 測(cè)試系統(tǒng)架構(gòu)圖
為了方便逐級(jí)厘清PHY 測(cè)試中的問題,本文根據(jù)以太網(wǎng)數(shù)據(jù)信號(hào)的流經(jīng)途徑,設(shè)計(jì)了兩種類型的環(huán)回測(cè)試,內(nèi)部環(huán)回和外部環(huán)回分別如圖2和圖3所示。
圖2 GPHY 內(nèi)部環(huán)回結(jié)構(gòu)圖
圖3 GPHY 外部環(huán)回結(jié)構(gòu)圖
PHY 內(nèi)部環(huán)回用以檢查PHY 內(nèi)部數(shù)據(jù)流是否正常。期望的正常情況是 RXD[7:0]上的信號(hào)與TXD[7:0]上的信號(hào)相同,只是存在一段短暫時(shí)間上的滯后。在測(cè)試程序內(nèi)部,邏輯應(yīng)這樣設(shè)計(jì):數(shù)據(jù)發(fā)送后,比較接收數(shù)據(jù)緩沖區(qū)與發(fā)送數(shù)據(jù)緩沖區(qū)之間的數(shù)據(jù)差異,即可判斷該項(xiàng)測(cè)試是否通過(guò)。若數(shù)據(jù)相同,則符合預(yù)期,測(cè)試通過(guò);否則,測(cè)試未通過(guò),這時(shí)系統(tǒng)會(huì)通過(guò)串口打印出數(shù)據(jù)差異的所在位置和錯(cuò)誤提示信息。在PC 機(jī)上,開發(fā)人員根據(jù)這些日志,便可迅速定位問題。
在進(jìn)行外部環(huán)回測(cè)試前,需要在RJ-45 上插入一個(gè)特制的水晶頭。該水晶頭的差分信號(hào)線要按照?qǐng)D3所示,把對(duì)應(yīng)的差分信號(hào)線進(jìn)行互連,水晶頭插入RJ-45 后,就實(shí)現(xiàn)外部環(huán)回測(cè)試所需的信號(hào)連接。外部環(huán)回與內(nèi)部環(huán)回的測(cè)試程序是一致的,差異點(diǎn)僅在于:外部環(huán)回模式要把GPHY 的0地址寄存器中的bit14 清零,以解除內(nèi)部環(huán)回模式。
環(huán)回測(cè)試的流程如圖4所示,其主要完成了如下6 項(xiàng)內(nèi)容。
圖4 環(huán)回測(cè)試流程圖
(1)設(shè)定系統(tǒng)時(shí)鐘,給APB 總線上的ETH 模塊提供125 MHz 的PLLCLK。
(2)UART 初始化,將UART 速率配置為“115 200 bps,8 bit,無(wú)校驗(yàn)位”格式。通過(guò)重定義標(biāo)準(zhǔn)庫(kù)中的fputc實(shí)現(xiàn)對(duì)printf 函數(shù)的重定向,從而在日志中使用printf 格式化運(yùn)行過(guò)程中變量,如寄存器的值、錯(cuò)誤類型等,重定向的實(shí)現(xiàn)代碼如下所示:
在調(diào)試階段,我們期望盡可能詳細(xì)地觀察程序運(yùn)行過(guò)程中的狀態(tài),而調(diào)試完成后,只想看關(guān)鍵的運(yùn)行結(jié)果,忽略調(diào)試階段加入的日志。為了實(shí)現(xiàn)這一目的,通過(guò)如下所示的宏函數(shù)來(lái)輸出系統(tǒng)日志,便可動(dòng)態(tài)地調(diào)整的日志等級(jí)。例如,當(dāng)調(diào)試完畢后,進(jìn)行循環(huán)的壓力測(cè)試時(shí),可以把宏函數(shù)LOG()中的“l(fā)evel>=DBG”修改為,“l(fā)evel>=INFO”,那么調(diào)試階段所加入的DBG 等級(jí)的日志便不會(huì)輸出。
(3)為了測(cè)試不同速率(10M-Base/100M-Base/1000MBase)、雙工/ 半雙工(Full/Half Duplex)、環(huán)回/ 非環(huán)回(Loopback/Non-Loopback)、是否自協(xié)商 (Auto-Negotiation)等模式的組合情況,我們?cè)O(shè)計(jì)了統(tǒng)一的多參數(shù)函數(shù),來(lái)對(duì)PHY 寄存器的設(shè)定內(nèi)容進(jìn)行封裝,函數(shù)聲明如下所示:
int PHY_TEST(int rate, bool duplex, bool loopback, bool Auto-Neg);
PHY 寄存器的讀寫依賴SMI 接口,我們封裝了讀寫操作的API,其聲明如下:
unsigned short SMI_Read(unsigned short Address);
void SMI_Write(unsigned short Address, unsigned short Data);
因?yàn)镮EEE802.3 規(guī)定的PHY 寄存器的地址和數(shù)據(jù)寬度都是16 比特,故采用unsigned short(無(wú)符號(hào)半字)類型作為形參和返回值的類型。SMI_Read()用于查詢PHY 的狀態(tài)標(biāo)志位,如Link 狀態(tài)、速度模式、自動(dòng)交叉線等。SMI_Write()用于把PHY_TEST()傳入的形參寫入到PHY 的寄存器對(duì)應(yīng)的比特位。
(4)在設(shè)定以太網(wǎng)發(fā)送數(shù)據(jù)包時(shí),我們把源地址和目標(biāo)地址固定下來(lái),數(shù)據(jù)段長(zhǎng)度設(shè)定為最大1 500,類型為ARP 數(shù)據(jù)包,除了地址和包長(zhǎng)度之外,其他數(shù)據(jù)使用rand()生成的偽隨機(jī)數(shù)來(lái)填充,這樣隨機(jī)化的數(shù)據(jù)讓測(cè)試更接近真實(shí)使用PHY 時(shí)的情況。
(5)為實(shí)現(xiàn)對(duì)ETH_DMA 接收和發(fā)送描述符的設(shè)定,編寫了如下的API:
void ETH_DMA_Desc(void *TxBuf, int TxSize, void*RxBuf, int RxSize);
ETH 發(fā)送數(shù)據(jù)時(shí),ETH_DMA 從地址TxBuf 處搬移數(shù)據(jù)到GMII_TXD[7:0];ETH 接收數(shù)據(jù)時(shí),ETH_DMA 從GMII_RXD[7:0]搬移數(shù)據(jù)到RxBuf。
(6)查詢ETH_MAC 的接收標(biāo)志位,若沒有置位則循環(huán)查詢,當(dāng)循環(huán)的累積的次數(shù)超過(guò)了設(shè)定的上限,說(shuō)明沒有接收到數(shù)據(jù),使用如下語(yǔ)句輸出錯(cuò)誤日志:
LOG(ERR,“ Receive polling timeout”);
若查詢到ETH_MAC 的接收標(biāo)志置為1 時(shí),表示接收到了有效數(shù)據(jù),并且接收已完成,這時(shí)通過(guò)對(duì)比接收到的數(shù)據(jù)包內(nèi)容與發(fā)送時(shí)的數(shù)據(jù)包內(nèi)容,如相同,則表明PHY 功能正常;如不同,則用如下語(yǔ)句輸出錯(cuò)誤日志:
LOG(ERR, “Index:%u, Expect: %u,Real:%u ”, i,TxBuf[i], RxBuf[i]);
為了檢驗(yàn)GPHY 穩(wěn)定性,在main 函數(shù)內(nèi),循環(huán)調(diào)用PHY_TEST(),內(nèi)部環(huán)回和外部環(huán)回測(cè)試若都能通過(guò),即可證明GPHY 功能正常。GPHY 的功能有保障后,再移植TCP/IP 協(xié)議棧LwIP,不需要操作系統(tǒng),即可實(shí)現(xiàn)ping 命令測(cè)試、TCP-Server 等功能。
內(nèi)部環(huán)回和外部環(huán)回的測(cè)試結(jié)果如圖5、圖6所示,圖中展示的是壓力測(cè)試過(guò)程中的系統(tǒng)日志,cnt 表示測(cè)試的計(jì)數(shù),每循環(huán)調(diào)用一次PHY_TEST();[result]后的內(nèi)容表示測(cè)試的結(jié)果,fail 或pass。
圖5 內(nèi)部環(huán)回測(cè)試結(jié)果
圖6 外部環(huán)回測(cè)試結(jié)果
環(huán)回測(cè)試完成后,確保了PHY 可工作正常,通過(guò)LwIP協(xié)議棧,可以實(shí)現(xiàn)MCU 作為TCP Server,在window 的命令行中,用ping 來(lái)測(cè)試PC 機(jī)與MCU 之間的網(wǎng)絡(luò)通路,實(shí)驗(yàn)結(jié)果如圖7所示。
圖7 ping 測(cè)試結(jié)果
同時(shí)借助網(wǎng)絡(luò)調(diào)試助手,在PC 機(jī)上通過(guò)TCP Client 協(xié)議,連接上作為TCP Server 的MCU,我們?cè)贛CU 的應(yīng)用程序里設(shè)計(jì)Server 將收到的數(shù)據(jù),再發(fā)送回給client,實(shí)驗(yàn)結(jié)果如圖8所示。
圖8 TCP-Server 測(cè)試結(jié)果
本文介紹了千兆以太網(wǎng)物理層收發(fā)器測(cè)試系統(tǒng)的架構(gòu),提出了根據(jù)數(shù)據(jù)流分階段對(duì)GPHY 進(jìn)行環(huán)回測(cè)試的方法,闡述了環(huán)回測(cè)試程序的設(shè)計(jì)和實(shí)現(xiàn),其中設(shè)計(jì)的可分級(jí)調(diào)整的日志系統(tǒng)與統(tǒng)一的測(cè)試函數(shù)接口,方便了多輪循環(huán)壓力測(cè)試。最后,展示的兩種環(huán)回測(cè)試的日志和基于LwIP 的ping與TCP-Server 測(cè)試結(jié)果,表明本文提出的測(cè)試方法科學(xué)有效,有利于快速定位問題,代碼易于復(fù)用,同時(shí)可以為其他PHY 測(cè)試工作提供參考。