引言
隨著WLAN的廣泛應(yīng)用,越來越多的芯片廠商投入到WLAN芯片開發(fā)上。因此各種接口的WLAN芯片成為了各大廠商發(fā)展的主要方向。目前主流的接口有:USB,SDIO,UART,SPI等。
本文設(shè)計(jì)了一款支持多接口、多協(xié)議的無線局域網(wǎng)802.11n(1T1R)的SoC芯片。該SoC芯片集成了SDIO,SPI,UART等接口。為了驗(yàn)證各個(gè)接口是否能夠達(dá)到設(shè)計(jì)需求,需要對(duì)各個(gè)接口進(jìn)行功能、性能和兼容性的測(cè)試。所謂接口驗(yàn)證,是指以接口為測(cè)試對(duì)象,詳細(xì)測(cè)試接口功能和性能。本文中是指UART接口和SPI接口。對(duì)于UART接口,需要對(duì)接口的波特率、數(shù)據(jù)長度、奇偶校驗(yàn)位、停止位、流控、異常錯(cuò)誤等進(jìn)行驗(yàn)證。對(duì)于SPI接口,需要對(duì)接口的大小端、工作模式、工作速率等進(jìn)行驗(yàn)證。
1 接口單元驗(yàn)證的必要性
1.1 接口單元驗(yàn)證簡(jiǎn)介
如圖1所示,是接口單元驗(yàn)證的示意圖。測(cè)試板有兩個(gè)UART接口和一個(gè)SPI接口。下位機(jī)完成固件部分,也就是直接操作硬件;而上位機(jī)完成測(cè)試用例管理和接口驅(qū)動(dòng)兩部分。
1.2 對(duì)接口進(jìn)行單元驗(yàn)證的原因
(1)驗(yàn)證接口的功能是否實(shí)現(xiàn)。保證設(shè)備能夠正確枚舉,各種配置下數(shù)據(jù)收發(fā)通路暢通。
(2)對(duì)各個(gè)接口的性能有一個(gè)準(zhǔn)確的把握。有了接口性能數(shù)據(jù)后,可以幫助在系統(tǒng)測(cè)試階段定位問題。在系統(tǒng)測(cè)試階段,性能瓶頸一方面來自于接口,一方面來自于WiFi。在接口驗(yàn)證階段獲得這個(gè)數(shù)據(jù)后可以幫助分析和定位問題。
(3)在平臺(tái)兼容性測(cè)試中,由于平臺(tái)的兼容性主要與接口有關(guān),與WiFi無關(guān),如果把兼容性放到系統(tǒng)測(cè)試階段去做,無形中增加了定位問題的難度。
1.3 傳統(tǒng)接口驗(yàn)證的方法及缺陷
傳統(tǒng)的驗(yàn)證方法是將上位機(jī)與下位機(jī)分離開來。首先上位機(jī)修改參數(shù),之后下位機(jī)修改參數(shù),編譯固件、運(yùn)行,上位機(jī)與下位機(jī)進(jìn)行通信。上位機(jī)與下位機(jī)之間沒有協(xié)商,直接進(jìn)行通信。以UART接口的功能驗(yàn)證為例來說明一下接口驗(yàn)證方法的缺陷。
UART的功能驗(yàn)證主要是各種配置下(波特率、數(shù)據(jù)長度、奇偶校驗(yàn)位、停止位的組合)是否能夠準(zhǔn)確無誤地傳輸數(shù)據(jù)。如果按照這種測(cè)試方法的話,測(cè)試效率很低。另外一個(gè)方面,由于主觀因素的影響,采用手動(dòng)的方法容易漏測(cè)測(cè)試用例。
綜上,傳統(tǒng)接口單元驗(yàn)證方法的缺陷為:測(cè)試效率低;容易漏測(cè)測(cè)試用例。
2 接口驗(yàn)證工具的設(shè)計(jì)
2.1 硬件架構(gòu)
2.1.1 PC下的硬件結(jié)構(gòu)
如圖2所示,描述的是PC環(huán)境下的UART接口的驗(yàn)證硬件結(jié)構(gòu)圖。
其中PCI通過JTAG接口控制測(cè)試板,完成固件的下載。PC2與測(cè)試板通過UART接口連接,UART0接口是命令接口,主要傳輸PC2對(duì)測(cè)試板的命令及測(cè)試板的響應(yīng);UART1是數(shù)據(jù)接口,主要傳輸PC2和測(cè)試板之間的數(shù)據(jù)。
2.1.2 嵌入式平臺(tái)下的硬件結(jié)構(gòu)
如圖3所示,描述的是嵌入式平臺(tái)下UART接口和SPI接口的驗(yàn)證硬件結(jié)構(gòu)圖。
其中PCI通過JTAG接口控制測(cè)試板,完成固件的下載。PC2通過串口控制嵌入式平臺(tái)。在驗(yàn)證UART接口時(shí),連接測(cè)試板與嵌入式平臺(tái)的兩個(gè)UART口,UART0接口是命令接口,主要傳輸嵌入式平臺(tái)對(duì)測(cè)試板的命令及測(cè)試板的響應(yīng);UART1是數(shù)據(jù)接口,主要傳輸嵌入式平臺(tái)與測(cè)試板之間的數(shù)據(jù)。
在驗(yàn)證SPI接口時(shí),連接測(cè)試板與嵌入式平臺(tái)的UART0口及SPI接口。同樣地,UART0是命令接口,主要傳輸嵌入式平臺(tái)與測(cè)試板的命令傳輸;SPI是數(shù)據(jù)接口,傳輸嵌入式平臺(tái)與測(cè)試板之間的數(shù)據(jù)。
2.2 軟件結(jié)構(gòu)
驗(yàn)證軟件結(jié)構(gòu)見圖4,其中DUT設(shè)備為驗(yàn)證的對(duì)象。
(1)用例管理層
主要生成各種測(cè)試用例。對(duì)于UART接口來說,包括UART波特率、數(shù)據(jù)長度、停止位、奇偶校驗(yàn)位等屬性組合的設(shè)置及高級(jí)設(shè)置項(xiàng)等。
對(duì)于SPI接口來說,主要包括SPI的各種模式、各種時(shí)鐘、大小端及上下行數(shù)據(jù)的測(cè)試用例的生成。
(2)配置接口層
依據(jù)配置程序與驅(qū)動(dòng)程序命令/事件接口定義完成各種命令的發(fā)送,并做相應(yīng)的事件處理。
(3)驅(qū)動(dòng)接口層
依據(jù)配置程序與驅(qū)動(dòng)程序命令/事件接口定義對(duì)配置程序發(fā)送的命令進(jìn)行解析,同時(shí)對(duì)硬件的狀態(tài)信息進(jìn)行響應(yīng)。
(4)硬件接口層
主要負(fù)責(zé)驅(qū)動(dòng)與固件接口操作,對(duì)DUT設(shè)備進(jìn)行設(shè)置,對(duì)DUT進(jìn)行寫命令/數(shù)據(jù),或從DUT設(shè)備獲取狀態(tài)/數(shù)據(jù)信息。
3 接口驗(yàn)證工具的實(shí)現(xiàn)
考慮到兼容各個(gè)嵌入式平臺(tái)(Linux系統(tǒng)),故整個(gè)上位機(jī)軟件工作在Linux系統(tǒng)下。從圖5可以看出,整個(gè)軟件的實(shí)現(xiàn)主要由配置程序、驅(qū)動(dòng)程序及固件3部分組成。本文重點(diǎn)介紹配置程序及驅(qū)動(dòng)程序部分。
3.1 配置程序
配置程序主要由測(cè)試用例管理和配置接口層兩部分組成,主要完成測(cè)試用例管理及測(cè)試用例的生成。
3.1.1 測(cè)試用例管理
測(cè)試用例管理部分主要完成測(cè)試用例的分發(fā)、定位以及測(cè)試結(jié)果的收集。為了兼容各個(gè)Linux版本,測(cè)試用例管理部分不采用界面的形式進(jìn)行管理,而是采用命令行的形式運(yùn)行。用例管理部分可以選擇單個(gè)或多個(gè)測(cè)試用例進(jìn)行測(cè)試。例如:uart_test case1 case2是對(duì)第一、二個(gè)測(cè)試用例進(jìn)行測(cè)試,uart_test all是對(duì)所有的測(cè)試用例進(jìn)行測(cè)試。測(cè)試用例管理部分會(huì)根據(jù)測(cè)試用例ID自動(dòng)定位到相應(yīng)的程序執(zhí)行。圖5是測(cè)試用例管理部分的流程圖。
3.1.2 測(cè)試用例的生成
以UART接口為例,描述一個(gè)完整的測(cè)試用例。圖6描述的是一個(gè)UART接口的完整的測(cè)試用例。從途中可以清晰地看出配置程序是如何協(xié)調(diào)上位機(jī)與下位機(jī)之間的通信的。
本文提出的驗(yàn)證工具與以往的驗(yàn)證工具最大的區(qū)別在于配置程序可以協(xié)調(diào)上位機(jī)與下位機(jī)。上位機(jī)與下位機(jī)并不是完全分離的,而是由配置程序統(tǒng)一協(xié)調(diào),分別給上位機(jī)和下位機(jī)下發(fā)命令修改參數(shù)及通信。
3.1.3 兼容性的實(shí)現(xiàn)
由于對(duì)SPI接口來說,要求兼容PC機(jī)和多個(gè)嵌入式平臺(tái),所以在程序的設(shè)計(jì)上要考慮兼容性的問題。
兼容性問題需要考慮兩個(gè)方面:
(1)數(shù)據(jù)類型的重定義。
(2)采用分層設(shè)計(jì)的思想。
3.2 驅(qū)動(dòng)程序
驅(qū)動(dòng)程序主要包括驅(qū)動(dòng)接口層和硬件接口層。其中驅(qū)動(dòng)接口層主要完成將配置程序的命令或數(shù)據(jù)進(jìn)行解析,通過接口發(fā)送出去,而硬件接口層主要負(fù)責(zé)驅(qū)動(dòng)與硬件(固件)接口操作,負(fù)責(zé)對(duì)DUT設(shè)備進(jìn)行設(shè)置,對(duì)待測(cè)設(shè)備進(jìn)行寫命令/數(shù)據(jù),或從DUT設(shè)備獲取狀態(tài)/數(shù)據(jù)信息。
3.2.1 UART接口驅(qū)動(dòng)開發(fā)
UART協(xié)議比較簡(jiǎn)單,本文不對(duì)UART協(xié)議進(jìn)行介紹。由于在LINUX系統(tǒng)下,對(duì)串口有相當(dāng)好的支持。Linux下把串口看作一個(gè)文件來處理,故對(duì)串口的讀寫操作相當(dāng)于對(duì)文件直接進(jìn)行讀寫操作。這樣我們可以直接調(diào)用系統(tǒng)函數(shù)如open,write,read,close等對(duì)串口進(jìn)行操作。
需要注意的是,對(duì)串口的寫操作比較容易,但是讀操作存在著阻塞I/O的問題。在對(duì)串口進(jìn)行讀取操作的時(shí)候,如果使用的是RAW模式,每個(gè)read系統(tǒng)調(diào)用將返回當(dāng)前串行輸入緩沖區(qū)中存在的字節(jié)數(shù)。如果沒有數(shù)據(jù),將會(huì)一直阻塞到有字符到達(dá)或者間隔時(shí)鐘到期,或者發(fā)生錯(cuò)誤此時(shí)可采用異步讀取。所謂異步讀取,指的是先查詢串口,看串口是否可用,直到串口可用了再去讀就可以避免阻塞I/O的問題。
3.2.2 SPI接口驅(qū)動(dòng)開發(fā)
(1)SPI概述
SPI的通信原理很簡(jiǎn)單,它以主從方式工作,這種模式通常有一個(gè)主設(shè)備和一個(gè)或多個(gè)從設(shè)備,需要至少4根線,事實(shí)上3根也可以(單向傳輸時(shí)或者硬件復(fù)用兩根數(shù)據(jù)線),也是所有基于SPI的設(shè)備共有的,它們是MISO,MOSI,SCK,CS。
MOSI為主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入;MISO為主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出;SCK為時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生;CS為從設(shè)備使能信號(hào),由主設(shè)備控制。
(2)SPI驅(qū)動(dòng)開發(fā)
在Linux下開發(fā)SPI驅(qū)動(dòng)有兩種方式,一種是采用Linux自帶的SPI子系統(tǒng),一種是采用字符設(shè)備驅(qū)動(dòng)的形式。本文采用了字符設(shè)備驅(qū)動(dòng)的形式。在Linux 2.6內(nèi)核中使用cdev結(jié)構(gòu)體描述字符設(shè)備。cdev結(jié)構(gòu)體如下所示。字符設(shè)備的主要工作是初始化、添加和刪除cdev的結(jié)構(gòu)體,申請(qǐng)和釋放設(shè)備號(hào),以及填充file_operations結(jié)構(gòu)體的操作函數(shù),實(shí)現(xiàn)file_operations結(jié)構(gòu)體中的read(),write()和ioctl()等。
cdev結(jié)構(gòu)體的dev_t成員定義了設(shè)備號(hào),另一個(gè)重要成員file_operations定義了字符設(shè)備驅(qū)動(dòng)提供給虛擬文件系統(tǒng)的接口函數(shù)。file_ operations結(jié)構(gòu)體中的成員函數(shù)是字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的主體內(nèi)容,這些函數(shù)實(shí)際會(huì)在應(yīng)用程序進(jìn)行Linux的open(),write(),read(),close()等系統(tǒng)調(diào)用時(shí)最終被調(diào)用。
Linux字符設(shè)備驅(qū)動(dòng)主要由以下幾部分組成:
(1)字符設(shè)備驅(qū)動(dòng)模塊加載與卸載函數(shù)
在字符設(shè)備驅(qū)動(dòng)模塊加載函數(shù)中應(yīng)該實(shí)現(xiàn)設(shè)備號(hào)的申請(qǐng)和cdev的注冊(cè),對(duì)應(yīng)的是insmod過程,而在卸載函數(shù)中應(yīng)實(shí)現(xiàn)設(shè)備號(hào)的釋放和cdev的注銷,對(duì)應(yīng)的是rmmod過程。
(2)字符設(shè)備驅(qū)動(dòng)的file_operations結(jié)構(gòu)體中成員函數(shù)
file_operations結(jié)構(gòu)體中成員函數(shù)是字符設(shè)備驅(qū)動(dòng)與內(nèi)核的接口,是用戶空間對(duì)Linux進(jìn)行系統(tǒng)調(diào)用最終的落實(shí)者。
(3)加載字符設(shè)備驅(qū)動(dòng)之后,在用戶空間建立一個(gè)設(shè)備節(jié)點(diǎn),在用戶空間就可以對(duì)設(shè)備進(jìn)行操作了,操作方式操作文件的方式相同。
3.2.3 驅(qū)動(dòng)與固件的接口
驅(qū)動(dòng)與固件之間的交互是通過自定義的“AT+”協(xié)議,協(xié)議交互流程見圖7。
AT+命令主要包括3個(gè):“AT+”:判斷串口鏈路是否正常。如果正常,返回OK;不正常,返回error;“AT+set”:接口參數(shù)設(shè)置命令。如果參數(shù)設(shè)置完成,返回OK;不正常,返回error;“AT+send”:數(shù)據(jù)發(fā)送命令。如果數(shù)據(jù)發(fā)送/接收正確,返回OK;否則,返回error。
4 結(jié)語
本文介紹的工具適用于UART接口和SPI接口的功能、性能和兼容性測(cè)試,可實(shí)現(xiàn)測(cè)試的自動(dòng)化。采用該測(cè)試工具,一方面提高了測(cè)試效率,大大節(jié)約了人力資源,時(shí)間和人力成本節(jié)約了50%以上;另一方面可以保證測(cè)試用例100%的覆蓋。
評(píng)論