解永亮,任洪偉,付國楷,房利國
(1.中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041;2.中國石油西南油氣田分公司 重慶氣礦,重慶 400021)
?
多通道SDIO驅(qū)動(dòng)框架設(shè)計(jì)與實(shí)現(xiàn)*
解永亮1,任洪偉2,付國楷1,房利國1
(1.中國電子科技集團(tuán)公司第三十研究所,四川 成都 610041;2.中國石油西南油氣田分公司 重慶氣礦,重慶 400021)
為了滿足移動(dòng)互聯(lián)設(shè)備對(duì)功耗、性能以及成本的需求,通過對(duì)SDIO協(xié)議規(guī)范以及ARM、PowerPC等多核CPU異步多處理器模式下負(fù)載均衡技術(shù)進(jìn)行研究,提出了在linux系統(tǒng)下靈活性和通用性較好的多通道SDIO設(shè)備驅(qū)動(dòng)程序構(gòu)架,并詳細(xì)描述了通信機(jī)制的原理、設(shè)備端枚舉和初始化過程、驅(qū)動(dòng)構(gòu)架的實(shí)現(xiàn)要點(diǎn)和技術(shù)優(yōu)勢(shì)。最后,在實(shí)際硬件環(huán)境中對(duì)驅(qū)動(dòng)程序的性能進(jìn)行了測(cè)試和分析,并對(duì)如何進(jìn)一步提高傳輸速率提出了一些建議。
SDIO;Linux驅(qū)動(dòng)程序;NAPI
在實(shí)際的系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)中,USB、PCI/PCIE等都是比較常見的高速互聯(lián)總線,一般情況下,CPU只會(huì)實(shí)現(xiàn)USB的MAC層,還需要外接物理層PHY芯片才能提供完整的支持,而PCI/PCIE總線只會(huì)出現(xiàn)在高端的CPU中。FPGA芯片的USB和PCI/PCIE等總線接口,一般都是通過購買其他公司專門的IP CORE來實(shí)現(xiàn),這對(duì)FPGA芯片的規(guī)模提出了較高的要求。隨著移動(dòng)互聯(lián)的興起,移動(dòng)終端類設(shè)備大量產(chǎn)生,這些設(shè)備使用電池供電,對(duì)功耗也有了更加嚴(yán)格的要求,因此傳統(tǒng)的高速總線不能很好地滿足需要。
安全數(shù)字卡聯(lián)盟(SD Card Association)制定了一套安全數(shù)字輸入/輸出卡(SDIO,Secure Digital Input/Output)規(guī)范,其主要目的是為低功耗移動(dòng)電子設(shè)備提供一種高速的數(shù)據(jù)傳輸方式。SDIO卡除了具有SD卡所具備的信息存儲(chǔ)功能以外還包含數(shù)據(jù)輸入輸出功能,因此在商用存儲(chǔ)領(lǐng)域以及設(shè)備互聯(lián)領(lǐng)域都得到了廣泛應(yīng)用。
在SDIO規(guī)范中針對(duì)每一種類型的設(shè)備都定義了一個(gè)子規(guī)范 ,比如:藍(lán)牙接口規(guī)范、GPS接口規(guī)范、WLAN接口規(guī)范等。本文在此基礎(chǔ)上抽象出一個(gè)更加通用的構(gòu)架,并且以以太網(wǎng)驅(qū)動(dòng)為例詳細(xì)描述了在這種構(gòu)架下驅(qū)動(dòng)程序的實(shí)現(xiàn)要點(diǎn)。
每個(gè)SDIO設(shè)備可以有1到7個(gè)Function外加一個(gè)Memory Function。Function是一個(gè)自包含的IO設(shè)備,彼此之間可以完全相同也可以各不相同。所有Function被組織成寄存器的集合[1]。SDIO設(shè)備必須實(shí)現(xiàn)“通用I/O區(qū)”(CIA, The Common I/O Area),CIA由3部分組成:CCCR(Card Common Control Registers)、FBR(Function Basic Registers)、CIS(Card Information Structure)[2]。CCCR和FBR中分別保存有Function 0和Function 1-7的CIS指針,指向CIS區(qū)域。Function 1-7可以有最大128K的寄存器空間。
多通道SDIO設(shè)備利用多個(gè)Function來實(shí)現(xiàn)。每個(gè)Function的128K空間規(guī)劃為寄存器區(qū)和IO數(shù)據(jù)區(qū)(實(shí)際實(shí)現(xiàn)可以用RAM方式或者FIFO方式)。SDIO設(shè)備端實(shí)現(xiàn)多套邏輯獨(dú)立運(yùn)行在不同的Function上。SDIO主機(jī)端為每個(gè)Function創(chuàng)建不同的數(shù)據(jù)收發(fā)線程,每個(gè)收發(fā)線程有各自的發(fā)送以及接收隊(duì)列,同時(shí)把每個(gè)線程關(guān)聯(lián)在不同的CPU核心上[3]。因?yàn)閿?shù)據(jù)交互過程中涉及的空間是不重疊的,所以多個(gè)通道可以同時(shí)工作。SDIO設(shè)備內(nèi)部空間見圖1。
圖1 SDIO設(shè)備內(nèi)部空間
驅(qū)動(dòng)開發(fā)和測(cè)試所使用的硬件平臺(tái)主體構(gòu)架如圖2所示。CPU是Freescale公司的ARM處理器imx6s,主頻800MHz。FPGA采用Xilinx公司的xc6slx45t芯片,作為SDIO設(shè)備端,不使用專門的SDIO IP CORE,通過采樣時(shí)鐘、數(shù)據(jù)、命令線分析主機(jī)端發(fā)送的內(nèi)容。
圖2 SDIO設(shè)備內(nèi)部空間
由于CPU內(nèi)部SDIO控制器或者外部SDIO控制存在一定差異,因此在操作系統(tǒng)中所對(duì)應(yīng)的控制器驅(qū)動(dòng)也各不相同。本文所描述的驅(qū)動(dòng)框架運(yùn)行在CPU端,軟件層次是在Linux的SDIO控制器驅(qū)動(dòng)之上,目的是為支持多通道功能的設(shè)備在Linux上的驅(qū)動(dòng)開發(fā)提供一種設(shè)計(jì)思路以及實(shí)現(xiàn)方法。
整個(gè)SDIO設(shè)備驅(qū)動(dòng)分為上下兩層,上層為linux以太網(wǎng)接口模塊(業(yè)務(wù)層),與內(nèi)核協(xié)議棧交互;下層為SDIO接口模塊(數(shù)據(jù)傳輸層),與CPU中SDIO控制器交互。下層模塊為上層模塊提供一個(gè)統(tǒng)一、一致的接口調(diào)用,包括:數(shù)據(jù)傳輸、配置管理、寄存器訪問等,當(dāng)上層業(yè)務(wù)層需要修改或者更換時(shí),下層數(shù)據(jù)傳輸層可以無需修改繼續(xù)使用。整體構(gòu)架如圖3所示。
以太網(wǎng)接口模塊符合標(biāo)準(zhǔn)的linux以太網(wǎng)驅(qū)動(dòng)構(gòu)架,使用接收數(shù)據(jù)包效率更高的NAPI模式進(jìn)行接收處理。提供ethtool管理接口,用戶可以通過標(biāo)準(zhǔn)的ethtool命令對(duì)網(wǎng)絡(luò)適配器的參數(shù)以及狀態(tài)進(jìn)行查詢和修改。
圖3 SDIO設(shè)備驅(qū)動(dòng)構(gòu)架
3.1 設(shè)備初始化過程
當(dāng)CPU的SDIO控制器發(fā)現(xiàn)SDIO設(shè)備已經(jīng)連接后它會(huì)通知操作系統(tǒng),由操作系統(tǒng)完成設(shè)備的初始化。整個(gè)過程如圖4所示。
圖4 SDIO設(shè)備枚舉過程
下面對(duì)每一步驟涉及的命令、訪問的寄存器以及設(shè)備狀態(tài)的變化進(jìn)行說明,詳細(xì)的寄存器定義請(qǐng)參見對(duì)應(yīng)參考文檔。
SDIO設(shè)備復(fù)位:發(fā)送CMD52命令寫Function0的寄存器6對(duì)設(shè)備進(jìn)行復(fù)位操作。此時(shí)設(shè)備由“初始化狀態(tài)”切換為“Standby狀態(tài)”。
設(shè)備進(jìn)入IDLE狀態(tài):發(fā)送CMD0命令。
獲取設(shè)備支持的Function數(shù):發(fā)送CMD5命令且參數(shù)值設(shè)置為0,該命令除了可以獲取Function數(shù)以外還能得到SDIO設(shè)備是否具有存儲(chǔ)單元,能支持的電壓范圍。
協(xié)商電壓范圍:發(fā)送CMD5命令,參數(shù)設(shè)置值為通信雙方能支持的電壓范圍的交集[4]。
設(shè)置設(shè)備地址:發(fā)送CMD3命令獲取設(shè)備自動(dòng)產(chǎn)生的設(shè)備地址(Relative Card Address,RCA),如果產(chǎn)生的地址和其他SDIO設(shè)備的地址沖突,會(huì)重新發(fā)送該命令,通知設(shè)備重新產(chǎn)生新的地址[4]。
選中設(shè)備:發(fā)送命令CMD7,參數(shù)為之前產(chǎn)生的設(shè)備地址,接收到該命令后設(shè)備進(jìn)入“命令接收狀態(tài)”[4]。
讀取設(shè)備參數(shù):發(fā)送CMD52命令訪問Function0的寄存器0、8、12h、13h等,設(shè)備需要返回是否支持4比特?cái)?shù)據(jù)模式、是否支持多塊傳輸以及支持的總線速率等信息。
讀取每個(gè)Function的CIS(Card Information Structure)信息:通過CMD52命令讀取每個(gè)Function的CIS信息,CIS信息中包含最重要的數(shù)據(jù)是廠商ID以及設(shè)備ID,上一小節(jié)說的SDIO接口模塊就是通過這兩個(gè)ID來關(guān)聯(lián)實(shí)際設(shè)備的。
3.2 驅(qū)動(dòng)初始化過程
SDIO設(shè)備驅(qū)動(dòng)與實(shí)際設(shè)備的關(guān)聯(lián)與PCIE和USB類似,使用ID進(jìn)行匹配。在驅(qū)動(dòng)模塊初始化函數(shù)中調(diào)用sdio_register_driver函數(shù),并傳遞struct sdio_driver結(jié)構(gòu)體,該結(jié)構(gòu)體包含了驅(qū)動(dòng)能支持的設(shè)備ID以及通道初始化函數(shù)(Probe)等信息。
對(duì)于具備多個(gè)通道的設(shè)備,操作系統(tǒng)會(huì)為每一個(gè)通道調(diào)用一次驅(qū)動(dòng)中的通道初始化函數(shù)。在該函數(shù)中先使用CMD52命令訪問Function0的寄存器2,使能對(duì)應(yīng)的Function,并讀取Function0的寄存器3,等待設(shè)備端Function進(jìn)入“就緒”狀態(tài)。再使用CMD52命令向?qū)?yīng)FBR的寄存器10h和11h配置數(shù)據(jù)傳輸階段使用的塊大小參數(shù)。然后調(diào)用內(nèi)核提供的kthread_create函數(shù)為當(dāng)前Function創(chuàng)建發(fā)送內(nèi)核線程,并通過sdio_claim_irq函數(shù)建立該Function與接收函數(shù)的關(guān)聯(lián)。通過以上兩個(gè)步驟,一個(gè)Function的數(shù)據(jù)發(fā)送以及數(shù)據(jù)接收邏輯通道已經(jīng)建立完成。之后依次對(duì)設(shè)備能支持的每個(gè)通道完成以上的初始化過程以實(shí)現(xiàn)多通道構(gòu)架,創(chuàng)建的多個(gè)通道邏輯上可以同時(shí)工作,每個(gè)通道可以在接收以及發(fā)送函數(shù)中實(shí)現(xiàn)具體業(yè)務(wù)邏輯,并使用不同應(yīng)用層協(xié)議,比如一個(gè)通道傳輸以太網(wǎng)協(xié)議數(shù)據(jù),另一個(gè)通道傳輸Bulkonly存儲(chǔ)協(xié)議數(shù)據(jù)。驅(qū)動(dòng)核心初始化處理流程如圖5所示。
圖5 驅(qū)動(dòng)初始化流程
完成以上核心的初始化過程后,驅(qū)動(dòng)再為每個(gè)使用該驅(qū)動(dòng)的應(yīng)用層進(jìn)程/線程維護(hù)獨(dú)立的事務(wù)隊(duì)列,實(shí)現(xiàn)多個(gè)線程同時(shí)訪問SDIO設(shè)備不會(huì)出現(xiàn)沖突,并且一個(gè)線程發(fā)起的傳輸事務(wù)響應(yīng)結(jié)果只會(huì)返回給發(fā)起者線程,而不會(huì)被其他線程訪問等功能。
3.3 數(shù)據(jù)收發(fā)過程
大塊數(shù)據(jù)的發(fā)送和接收使用CMD53命令來完成,內(nèi)核為該命令提供mmc_io_rw_extended函數(shù),以及該函數(shù)的一些高級(jí)接口,包括數(shù)據(jù)發(fā)送接口:sdio_memcpy_toio和sdio_writesb;數(shù)據(jù)接收接口:sdio_memcpy_fromio和sdio_readsb。
SDIO接口模塊與SDIO設(shè)備之間數(shù)據(jù)傳輸使用自定義的數(shù)據(jù)幀格式。根據(jù)分層思想,實(shí)際傳輸?shù)臄?shù)據(jù)也可以包含更上層的協(xié)議頭,這樣可以保證上層實(shí)現(xiàn)的修改不會(huì)影響其他各個(gè)層次的處理邏輯。
實(shí)際的數(shù)據(jù)接收使用linux內(nèi)核中為提高網(wǎng)絡(luò)數(shù)據(jù)包效率而設(shè)計(jì)的NAPI機(jī)制,它是一種介于中斷接收和查詢接收之間的一種機(jī)制,根據(jù)“配額”來決定本次處理的數(shù)據(jù)包的數(shù)量,如果“配額”不足,則在下一次系統(tǒng)空閑的軟中斷中繼續(xù)處理。如果“配額”夠了,則在下次數(shù)據(jù)接收的硬件中斷中再次調(diào)度[5]。整個(gè)SDIO接口模塊的數(shù)據(jù)處理流程如圖6所示。
圖6的接收處理流程中有幾點(diǎn)需要說明:
(1)每個(gè)通道的上下文數(shù)據(jù)中都包含一個(gè)struct napi_struct結(jié)構(gòu)體,當(dāng)接收到數(shù)據(jù)時(shí),各個(gè)通道獨(dú)立調(diào)度自己的NAPI進(jìn)行接收處理[6]。
(2)圖6中的虛線框表示其內(nèi)部的處理邏輯在專門的NAPI調(diào)度中執(zhí)行,其他的處理邏輯在SDIO中斷處理函數(shù)中執(zhí)行。
圖6 數(shù)據(jù)接收處理流程
實(shí)際測(cè)試平臺(tái)使用雙線程分別對(duì)兩個(gè)通道進(jìn)行壓力和性能測(cè)試。經(jīng)過一系列的測(cè)試,得到的測(cè)試結(jié)果如表1所示。
表1 SDIO接口吞吐量測(cè)試結(jié)果
從表1中的測(cè)試結(jié)果可以得出以下幾個(gè)結(jié)論:
(1)小包的傳輸效率遠(yuǎn)遠(yuǎn)低于大包的傳輸效率,這是因?yàn)閱?dòng)一次SDIO總線傳輸開銷較大,所以在實(shí)際使用中對(duì)于小數(shù)據(jù)包可以考慮在CPU端和FPGA端分別進(jìn)行分片以及合片處理,把若干小數(shù)據(jù)包組成一個(gè)大數(shù)據(jù)包,這樣才能充分利用SDIO總線。
(2)從FPGA端進(jìn)行性能分析可以發(fā)現(xiàn)FPGA大多數(shù)時(shí)候處于空閑狀態(tài),它并非數(shù)據(jù)傳輸?shù)钠款i,在當(dāng)前情況下性能受限于CPU端。這里提出幾點(diǎn)原因以及優(yōu)化方式:①SDIO總線時(shí)鐘為50 MHz,在4比特?cái)?shù)據(jù)模式下理論上只有200 Mb/s的吞吐率,可以根據(jù)CPU情況提高時(shí)鐘;②實(shí)驗(yàn)時(shí)FPGA只能支持單包傳輸不能支持多包傳輸,所以一次不能寫入多包數(shù)據(jù)。
3)當(dāng)前SDIO的吞吐率能夠滿足低功耗移動(dòng)設(shè)備對(duì)性能的要求,能有有效降低FPGA規(guī)模和成本以及CPU外圍芯片的數(shù)量和整機(jī)功耗。
本文設(shè)計(jì)了一種不局限于某種特定處理器的多通道SDIO通信機(jī)制,并對(duì)其原理、軟硬件架構(gòu)、數(shù)據(jù)收發(fā)處理與驅(qū)動(dòng)程序設(shè)計(jì)做了詳細(xì)介紹。本設(shè)計(jì)中的多個(gè)通道可以根據(jù)實(shí)際情況增加或者減少,每個(gè)通道的具體使用方式以及業(yè)務(wù)邏輯也可以靈活搭配,具有較強(qiáng)的適應(yīng)性和擴(kuò)展性。通過性能測(cè)試可以看出,目前該通信機(jī)制具有不錯(cuò)的性能并能滿足對(duì)功耗和成本要求較高的需求。
[1] SD Group and SD Card Association. SD Specifications Part E1 SDIO Simplified Specification Version 3.00 (2011-02-25) [2015-03-20]. http://www.sdcard.org.
[2] 黃曉曦,黃世震. 基于ARM的SDIO驅(qū)動(dòng)設(shè)計(jì)[J]. 計(jì)算機(jī)與數(shù)字工程, 2010(01):160-161. HUANG Xiao-xi, HUANG Shi-zhen. ARM-based Driver Design for SDIO [J]. Computer & Digital Engineering, 2010 (01): 160-161.
[3] 秦培斌,肖志輝,楊大川等. 基于多核處理器的加密卡異步并行驅(qū)動(dòng)設(shè)計(jì)[J]. 通信技術(shù),2014,47(07):833-834. QIN Pei-bin, XIAO Zhi-hui, YANG Da-chuan,et al. Asynchronous Parallel Driver Design of Encryption Card based on Multi-core Processing Unit[J]. Communications Technology, 2014,47(07):833-834.
[4] SD Group and SD Card Association. SD Specifications Part 1 Physical Layer Simplified Specification Version 4.10 (2013-1-22) [2015-03-20]. http://www.sdcard.org.
[5] 許里,馮國仕,李璞. 光纖通道接口通用驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)[J].通信技術(shù), 2014,47(11):1344-1345. XU Li, FENG Guo-shi, LI Pu.Design and Implementation of Fabric Channel Interface Driver[J]. Communications Technology, 2014,47 (11): 1344-1345.
[6] Jonathan Corbet,Alessandro Rubini, GregKroab-Hartman. Linux設(shè)備驅(qū)動(dòng)程序[M]. 第3版. 北京:中國電力出版社,2012:518-520. Jonathan Corbet, Alessandro Rubini,GregKroab-Hartman.Linux Device Dnvers[M].The Third Edition.Beijing:China Elatrn Power Press,2012:518-520.
Design and Implementation of Multi-channels SDIO Driver Framework
XIE Yong-liang1, REN Hong-wei2, FU Guo-kai1, Fang Li-guo1
(1.NO.30 Institute of CETC, Chengdu Sichuan 610041, China;2.Chongqing Gas Field, Southwest Oil and Gas Company of CNPC, Chongqing 400021, China)
For meeting the requirements by power dissipation, performance and costs of mobile interconnection devices, and based on the study of SDIO protocol specifications and load balancing technique in asynchronous multi-CPU mode of multi-core CPU like ARM and PowerPC and so on, a flexible and adaptable program framework of multi-channels SDIO device driver in linux system is proposed, and the theory of communications mechanism, enumeration and initiation process in device end, including implementation outlines and technical advantages of this driver framework,are described in detail. Finally, tests and analysis are also done on driver’s performance in practical hardware environments, and some advices on how to enhance transmission efficiency are also given.
SDIO; Linux driver program; NAPI
10.3969/j.issn.1002-0802.2015.05.022
2014-12-11;
2015-03-18 Received date:2014-12-11;Revised date:2015-03-18
TP309.7
A
1002-0802(2015)05-0616-05
解永亮(1979—),男,學(xué)士,工程師,主要研究方向?yàn)榍度胧较到y(tǒng)、通信安全技術(shù)、計(jì)算機(jī)應(yīng)用;
任洪偉(1978—),男,學(xué)士,工程師,主要研究方向?yàn)樾畔⒕W(wǎng)絡(luò)、信息安全、通信安全技術(shù);
付國楷(1980—),男,學(xué)士,工程師,主要研究方向?yàn)榍度胧较到y(tǒng)、通信安全技術(shù)、計(jì)算機(jī)應(yīng)用;
房利國(1977—),男,碩士,高級(jí)工程師,主要研究方向?yàn)樾畔踩?、通信安全技術(shù)、計(jì)算機(jī)應(yīng)用。