開源Wi-Fi芯片/FPGA設計以及背後的中國開發者(轉載)

”白菜價”的Wi-Fi芯片爲何用軟件無線電實現起來如此困難。openwifi項目爲你揭祕。

站在21世紀後4/5開始之際,回望前段時間發佈的openwifi項目(https://github.com/open-sdr/openwifi),對個人而言,再一次提升了自己的能力邊界。對社區而言,我想說這是中國開發者給Wi-Fi研究領域的一點點基礎性貢獻。(更多進展,移步專欄 開源芯片/FPGA設計 https://zhuanlan.zhihu.com/openwifi

(補上面二個的鏈接:https://m.newsmth.net/article/METech/384177  https://github.com/open-sdr/openwifi )

​正文:

​Wi-Fi已經誕生20多年了。如今,Wi-Fi就像空氣和水,視而不見卻如影隨形。一方面它是連接互聯網的”生活必需品”,另一方面,因爲十分低廉的硬件價格和無線電信號的開放性,也成爲黑客們最喜歡的研究對象之一。

​這裏的黑客也包括各大學和研究機構的研究員們。他們的利用Wi-Fi開展了各種”腦洞”研究。比如從Wi-Fi信號裏竊取或保護你的隱私,2015年央視315晚會上現場從Wi-Fi信號中獲取的用戶隱私展示仍歷歷在目。近幾年,Wi-Fi信號甚至被用來探測物理世界裏人的活動。MIT的研究人員利用無處不在的Wi-Fi信號實現了穿牆無源雷達,可以”看到”牆後面的人。其他”腦洞”研究還有比如利用Wi-Fi信號給低功耗物聯網芯片供電等。這些有趣的研究工作大都是基於商用芯片或者軟件無線電(SDR)。基於商用芯片主要採用開源驅動,反向驅動或固件的手段(比如github上的nexmon項目)。SDR在這些研究中一般“僅接收”或者“僅發射”,而不是”實時收發”。因爲像商用Wi-Fi芯片那樣實時收發對於SDR並不容易,原因後面會講到。

​說到軟件無線電(SDR),在無線通信和安全研究領域它是一種重要的手段。SDR的基本思想是用軟件實現無線通信硬件(比如芯片或基站)的功能。比如在移動通信領域,2G/3G時代的gsm監聽以及僞基站,就是基於OsmocomBB發佈的SDR硬件和軟件。到了4G/5G時代,著名的SDR項目(LTE/5G軟基站和UE)有:開源的srsLTE,OAI(Open Air Interface),以及非開源但性能逆天的Amarisoft(法國傳奇黑客Fabrice Bellard出品)。

​反觀Wi-Fi領域,廉價/免費的且廣爲應用的開源設計卻幾乎沒有。難道寫出一個幾塊錢的Wi-Fi芯片功能的軟件,比移動通信(2/3/4/5G)基帶芯片更難?這種現象背後的原因涉及到Wi-Fi和移動通信頻譜性質以及設計哲學的不同。

​Wi-Fi工作在共享頻譜(比如免費的2.4GHz和5GHz ISM頻段)。在這個頻譜中,不只Wi-Fi一種通信系統,藍牙和Zigbee等也使用同一頻譜,因此各國的無線電法規大都要求共享頻譜中的設備採用Listen-Before-Talk (LBT)方式工作,即:發射前,先監聽信道確保當前信道是空閒的,避免干擾到其他設備正在進行的傳輸。基於類似考慮,當一個設備發送完一個數據包之後最好能立刻從對方的反饋(ACK)中知道成功與否,這樣可以縮短一次傳輸對信道的佔用時間。因爲,如果對方需要較長的時間才能給出反饋,那麼其他設備則必須等待,此時信道白白浪費。如果其他設備不等待,那麼這個關鍵的反饋信息可能被其他設備的傳輸所阻塞/干擾,其本身的不確定度加大,這是協議所不希望看到的,因爲反饋信息對於協議是重要的狀態信息。所以在儘可能短的時間內立即反饋成爲一種簡單有效的策略,它也可以避免芯片記錄太長時間的狀態/隊列信息,從而減小片上RAM,降低成本。因此Wi-Fi協議規定如果成功接收到一個數據包(CRC校驗通過),則需要在SIFS(Short Inter Frame Space)時間內發送給對方ACK包,這樣對方就知道自己發送成功,可以發下一包了。如果對方在SIFS時間內沒有接收到ACK包,則認爲自己發送失敗,對方會根據高層設置決定立刻重傳(高層設置最大重傳次數)或者放棄。SIFS在2.4GHz頻段爲10us,在5GHz頻段爲16us,在60GHz頻段則更短。極短的SIFS時間保證了兩個Wi-Fi設備每次通信對信道的佔用是”連續”的(因爲SIFS遠小於包時間長度)。兩個Wi-Fi設備的一次交互(數據包+ACK)未完成前,信道中的其他設備都會安靜等待,但因爲SIFS很短,這種等待造成的浪費並不嚴重。這種快速ACK只是Wi-Fi CSMA/CA MAC協議的一小部分,但對芯片來說也是收發時延要求最苛刻的部分。Wi-Fi標準中詳細描述了CSMA/CA協議的各方面功能,確保信道共享公平且高效。這裏不進一步展開。

​與Wi-Fi不同,移動通信使用昂貴的授權頻譜,追求最高的頻譜利用率。所有終端的發送和接收都受到基站的管理和控制。發送(包括髮送ACK這種反饋)都是被基站按時調度的。比如LTE的HARQ(混合自動請求重發)過程就規定,收到一個1ms的subframe數據後,給對方的反饋是調度在4ms之後的,這個反饋延遲比起Wi-Fi的10us那就長很多了。當然,這4ms之內信道並不會閒着,基站會調度有需要的終端繼續發送/接收新數據。對頻譜的調度式佔用一般說來會比隨機競爭效率更高,因爲無需競爭信道時的隨機等待時間。4ms的反饋延遲,也留給接收方足夠的處理時間。

​請記住這兩個數字10us和4ms,他們決定了能否方便的用電腦軟件來實現無線通信協議。最流行的軟件無線電架構是電腦加射頻前端(USRP/BladeRF/HackRF等)。他們之間的連接方式主要有pcie,以太網和USB這三種方式。目前主流射頻前端(比如USRP)和電腦的通信延遲最快都在幾百us量級。所以對於移動通信,可以利用電腦強大的處理能力按照協議要求從容計算,然後在規定時間之內發送反饋(比如LTE的4ms反饋延遲)。反而對於Wi-Fi的10us SIFS 反饋延遲,基於電腦軟件的實現則變成了幾乎不可能完成的任務。(我用了”幾乎”,不是完全沒可能,請看到最後)。

​因此,用軟件無線電(SDR)去實現Wi-Fi的合理選擇是用FPGA芯片直接連接射頻前端芯片。調製解調以及CSMA/CA MAC層都在FPGA內部實現,那麼是可以實現10us的ACK反饋延遲的。這也是商用Wi-Fi芯片的實現方式,只不過商用Wi-Fi芯片從成本和功耗角度考慮不會使用FPGA而是設計並流片ASIC。

​用基於FPGA的軟件無線電平臺去實現完整的Wi-Fi協議理論上不存在問題,問題是這世界上熟練的FPGA工程師數量估計不到軟件工程師數量的百分之一。而開發同樣一個功能模塊,軟件的開發時間可能是FPGA開發時間的幾十分之一。因此,並不是說Wi-Fi的協議有多麼複雜,而是用FPGA來開發Wi-Fi比起軟件更耗時耗力。

以上只是介紹了Wi-Fi實現的一個關鍵點,並不是Wi-Fi實現的全部。要實現一個完整的Wi-Fi芯片功能,僅用FPGA實現Wi-Fi標準定義的OFDM調製解調是遠遠不夠的,還需要MAC功能(CSMA/CA),驅動和上層協議軟件(Association/Authentication/Encryption/etc)的支持。

​以目前廣泛應用(尤其在嵌入式,路由器和手機領域)的Linux操作系統爲例,在https://wireless.wiki.kernel.org/ 詳細描述了它是如何支持Wi-Fi芯片的。Wi-Fi芯片廠家只需要按照Linux的要求提供Driver(即驅動程序,面向Linux內核實現Linux預定義的ieee80211_ops API)。在驅動之上,Linux內核提供了Wi-Fi的高層MAC支持(mac80211,cfg80211),鏈路速率自動調整功能,user space和kernel space的通信接口nl80211,以及user space豐富的工具軟件,比如作爲station模式的wpa_supplicant和作爲AP模式的hostapd。因此,藉助Linux對於商用Wi-Fi芯片的支持,可以減輕很大部分基於FPGA的Wi-Fi實現的工作量。即便如此,基於FPGA的Wi-Fi實現依然涉及到調製解調之外的許多工作。主要有:

  • 克服本振泄漏等零中頻收發機自干擾(目前流行的射頻前端架構是零中頻)。因爲Wi-Fi收發頻率是相同的,即TDD半雙工。這涉及到FPGA數字中頻的一些設計考量。
  • 實時獲取射頻前端AGC增益,並根據I/Q採樣值大小計算RSSI。因爲Linux高層需要RSSI報告。RSSI在不同頻率和射頻通道/天線可能需要不同的校準/補償值。RSSI也是判斷信道是否被佔用的重要依據,是CSMA/CA協議的基礎。
  • 在FPGA上實現完整的CSMA/CA協議(Low MAC層)。根據Linux wireless的設計,Wi-Fi的MAC層分爲實時的low MAC (比如SIFS,ACK,重傳,CCA,NAV,backoff等CSMA/CA操作)和非實時的high MAC。Linux的mac80211子系統負責high MAC,但low MAC必須由FPGA實現,因爲Linux的實時性不足以實現us量級的精確時延,此架構即典型的SoftMAC Wi-Fi芯片。還有一種Wi-Fi芯片類型是FullMAC芯片,此時high MAC也在芯片裏而不是Linux中。這種芯片廠家不必依賴Linux mac80211子系統的high MAC實現,有更大的性能優化自由度,當然芯片開發也需要更多人力物力。
  • FPGA和Linux的通信接口。比如Wi-Fi包的DMA接口,FPGA寄存器配置和狀態接口。需要在Linux驅動裏去響應Wi-Fi包的收發中斷,以及訪問FPGA寄存器。
  • FPGA內發包隊列的管理。因爲Linux Driver把包交給FPGA後,FPGA需要等待合適的發送時機(CSMA/CA裏的TXOP),因此必須先把包緩存到隊列中。此隊列需要被Linux Driver查詢和操作。
  • Linux Driver和FPGA交互所需的各種信息(RSSI,timestamp,序列號等)的插入和提取,因爲這些信息是Linux上層所需要的。有些信息跟隨數據包,有些信息通過寄存器交換。
  • Linux Driver(驅動)的編寫。驅動程序需要綜合調用FPGA和射頻前端的各種功能接口,實現Linux mac80211子系統預定義的ieee80211_ops API。
  • 基於nl80211的user space工具的編寫(例如openwifi裏的sdrctl)。如果你想從user space實時訪問/配置一些driver/FPGA/射頻底層功能的話,則需要通過nl80211接口與內核中的驅動程序通信。

​從上面的介紹可以看到,看似簡單的Wi-Fi芯片,”全棧”開發是必須的。在商業公司內部,Wi-Fi的實現需要一個工程團隊密切分工合作,並假以年計來完成。但在研究領域,具有完整和豐富工程經驗的學生和老師/研究員並不多,實現完整Wi-Fi對於大多數博士生來說是投入產出比太低的工作,這也是爲何在研究領域鮮有完整Wi-Fi實現的原因。

openwifi項目的目標就是要爲研究領域提供一個完整的Wi-Fi基帶芯片/FPGA實現。這樣廣大博士生和研究人員就無需Wi-Fi實現所需的巨大投入,直接進入產出階段。目前openwifi第一版基於Xilinx的Zynq FPGA實現(SoC,System on Chip)。這款FPGA內嵌了ARM處理器,可以跑Linux,即可以提供我們所需要的mac80211子系統,而且開發板可以方便的連接Analog devices的射頻前端(例如AD9361)。因此在這個Xilinx加Analog devices的SDR平臺上,射頻,FPGA,ARM和Linux都齊了。因爲是基於ARM處理器,並且ARM和FPGA在一顆芯片內(SoC),所以openwifi的設計也很適合用於嵌入式領域(無人機圖傳,Wi-Fi視頻會議,IoT等)。

​需要說明的是,雖然openwifi實現了”全棧”,但它並不是每個部分都從頭開始,比如OFDM接收機模塊就是在openofdm開源項目之上修改,添補,整合而來。下面梳理一下社區多年來不同研究者在Wi-Fi實現上的各種嘗試,以及openwifi與他們的異同。​

  • WARP 802.11 design

https://warpproject.org/trac/wiki/802.11

https://mangocomm.com/802.11-mac-phy/

這是rice大學很早就發佈的基於FPGA的Wi-Fi參考設計。需要購買license纔可以使用,費用大約30k歐左右(根據需要哪部分),費用不包括自己購買板子(比如ADRV9361-z7035)的費用。從公開資料來看,它並沒有使用Linux mac80211子系統,而是high MAC和low MAC用FPGA裏的MicroBlaze軟核處理器實現。​

  • National Instruments Labview 802.11 framework

http://www.ni.com/product-documentation/53279/en/

http://www.ni.com/product-documentation/54094/en/

來自大廠NI的基於FPGA的參考設計,除了這套集成在Labview的設計的license費用(6k歐左右)之外,你還需要購買9k歐左右的高端USRP-2944才能跑起來。從公開資料來看,它也沒有使用Linux mac80211子系統,而是使用PC上的NS3網絡仿真器作爲high MAC,FPGA內實現low MAC。因爲綁定Labview,所以開發環境必須Windows。

  • Microsoft SORA和ziria

https://github.com/microsoft/Sora

https://github.com/dimitriv/Ziria

微軟亞洲研究院n年前發佈的一個Wi-Fi實現。物理層和MAC全部使用PC上的軟件實現,他們在多年前就"幾乎"做到了我之前說的“幾乎”不可能。他們設計了一塊pcie的RCB(radio control board,FPGA實現低延遲pcie接口)卡和射頻板相連,這說明pcie延遲實際上足夠低。項目的水平的確逆天,至今無人超越。涉及大量PC架構下的優化技巧(查表替代計算,緩存替代計算等),以及如何在Windows操作系統下隔離出幾個核專用於高實時處理。RCB板加射頻板大約2.5k歐的樣子。許多高校也在此架構基礎上做了4G/5G實現。在項目創始人Kun Tan離開去了華爲之際,SORA放到github上開源了。但貌似github上開發活動並不活躍也基本不再更新。後來微軟的兩個老外設計了一種DSL(Domain Specific Language),並用這種新語言重寫了SORA架構下的Wi-Fi實現。但即使用了DSL,要想實現最嚴苛的SIFS延遲,還是需要用基於pcie的RCB卡,使用其他接口的射頻前端(例如基於USB的BladeRF和USRP)滿足不了SIFS反饋延遲。公開資料來看也並沒有使用Linux mac80211子系統。(Windows實現可能用Linux內核裏的子系統麼?)​

爲什麼我說它“幾乎”做到,因爲根據SORA的論文,受限於pcie的延遲和電腦處理速度,對於接收到的短包,他們依然無法及時給出ACK,因爲短包留給他們的處理時間不夠。只有接收到長包時,纔有足夠的時間去反饋ACK給對方。

  • mobicom 2017上北大Haoyang Wu的FPGA實現(tick)

http://metro.cs.ucla.edu/papers/mobicom17-tick.pdf

在2017年美國鹽湖城mobicom會上,北京大學Haoyang Wu 發表了 The Tick Programmable Low-Latency SDR System。印象中還獲得了community貢獻獎,因爲這是社區首次有人基於FPGA實現了全棧Wi-Fi,工作相當硬核,和我們的實現架構也非常接近。主要的不同是,他們做了USB3.0接口把FPGA接到電腦上,然後使用電腦上Linux的mac80211子系統,也就是說他們的驅動是基於USB3.0接口。而我們的openwifi是”全棧”都在單芯片上(SoC):Linux跑在片上ARM處理器,通過Xilinx AXI DMA通道和片上FPGA相連。因爲省去了USB這種PC接口,端到端延遲更低。如果你用ping來測試openwifi,並與其他基於USB/pcie的Wi-Fi網卡對比,就會發現片上全棧的延遲更低。此外,在mobicom上作者貌似提到過將來會開源,但兩年過去了依然沒有任何消息。​

  • gnuradio/USRP/RFNoC社區

https://static1.squarespace.com/static/543ae9afe4b0c3b808d72acd/t/55f85aaee4b02e1b84d8ff51/1442339502956/7-pendlum_johathan-OFDM_RFNoC-2015-08-27.pdf

這是目前最大最活躍的SDR社區。但對於Wi-Fi大都是一些小模塊實現或者爲了寫論文的一些快速原型,沒有相對完整的模塊級和系統級實現。在USRP的FPGA開發框架RFNoC(RF Network on Chip)提出的初期,曾經在一個ppt(見前面鏈接:Building an OFDM receiver with RFNoC)中提到過基於RFNoC框架在USRP的FPGA中實現Wi-Fi接收機,不過貌似始終沒發佈一個相對完整的RFNoC Wi-Fi接收機模塊。而且RFNoC開發門檻還是略高,本來使用FPGA原廠工具鏈開發FPGA已經有一定門檻,使用RFNoC則還需要在FPGA基礎架構上再多一層,涉及到和gnuradio companion的通信和控制接口,需要對整個USRP和gnuradio的概念有比較深入的瞭解。因此RFNoC框架中開發者貢獻的IP core並不多,猜測RFNoC主要還是Ettus公司內部開發USRP上的FPGA用。​

  • gr-ieee802-11項目

https://github.com/bastibl/gr-ieee802-11

這是Bastian Bloessl基於gnuradio的802.11實現。這是一個相對完整的和應用較爲廣泛的軟件無線電Wi-Fi實現。因爲使用PC上的gnuradio,所以不可能實現真正的SIFS反饋延遲以及和商用Wi-Fi芯片通信。作者很清楚這一點,也給出了一些workaround,比如關閉ACK機制。該項目對於不熟悉FPGA而是想從gnuradio入門的人來說,是一個可以很快上手並且根據需求二次開發的不錯的選擇。而且一臺PC加一塊廉價的SDR前端(HackRF,BladeRF,USRP B系列N系列等)即可工作。

  • openofdm

https://github.com/jhshi/openofdm

這是近兩年開源的一個面向USRP N210的Wi-Fi FPGA接收機完整實現!作者是中國人Jinghao Shi (史經浩)。兩年前有openwifi項目的想法時,老老實實的先開發了Matlab的Wi-Fi接收機算法,然後打算進行FPGA實現。後來偶然間發現openofdm項目,看了它的文檔感覺相當靠譜,於是決定採用。openofdm採用了面向N210內部小容量FPGA的一種高度優化的設計,因此付出了一些解調性能上的代價,但對於第一版以驗證全棧集成爲主要目的openwifi來說夠用了。使用過程中也發現了一些openofdm的bug和缺失的一些全棧集成必要功能,我們進行了相應的改進。目前openofdm的作者已經把openwifi對openofdm的改進合併進了openofdm。

​這裏用一張表格來說明openwifi和其他項目的異同:

此外,openwifi在軟件無線電平臺(Zynq SoC+AD9361)方面使用了Analog devices的HDL參考設計(https://github.com/analogdevicesinc/hdl)和它的Linux kernel版本(https://github.com/analogdevicesinc/linux),也使用了Xilinx的一些相關IP core和Xilinx AXI DMA Linux驅動例程,並根據Wi-Fi需求進行了必要的修改,這樣可以省去大量的FPGA與射頻前端和ARM的接口開發工作。openwifi對Analog devices和Xilinx相應的github資源進行了引用和說明。

​openwifi的Linux驅動部分當然也是參考了Linux 裏面的各種Wi-Fi芯片的驅動源代碼。由於openwifi與Linux之間採用Xilinx AXI DMA接口(片內FPGA和ARM接口),而Linux內核代碼中的Wi-Fi芯片大都是基於pcie和USB的,因此只能借鑑而無法直接移植。研究了Linux內核代碼裏的各種Wi-Fi芯片驅動後,發現臺灣realtek公司的rtl8180/8187芯片驅動最爲簡單。我還專門淘到了一些古老的基於rtl8180/8187芯片的網卡,在Linux下通過學習和修改rtl8180/8187驅動學習真正的Wi-Fi網卡是如何工作的。參照這些芯片驅動,並結合Xilinx給的DMA驅動代碼,成功實現了openwifi的mac80211子系統兼容驅動。

​爲了方便測試和調試,我們還自己開發了整套的Matlab基帶收發算法,作爲FPGA實現的benchmark。不然有問題時,會不知道目標在哪裏。

​回顧openwifi的誕生歷程,有一點感到很自豪的是項目的主導和主要貢獻來自中國開發者。

  • 我本人。兩年多來幾乎是120%的時間在投入。openwifi的工作是這個歐盟H2020項目(ORCA)https://www.orca-project.eu/ 的一部分。主要動機是希望2020年項目結束時能給社區留下一些真正廣爲使用和流傳的東西。當然也十分感謝公司(imec https://www.imec-int.com/en/home)支持開源。
  • 我的中國同事劉薇(https://telefoonboek.ugent.be/nl/people/802000881827)。把openofdm從USRP N210平臺移植到Zynq平臺,並且配合我做了大量模塊和系統級調試和測試工作。
  • openofdm的作者史經浩。看linkedin,這位同學畢業後去了Facebook而且貌似早就不搞Wi-Fi了。但他的openofdm開源實現,使得我們的openwifi在兩年內做完成爲可能,否則至少還需要額外的半年到一年。
  • 來自中國臺灣的realtek公司的Wi-Fi芯片驅動是我學習Wi-Fi驅動的主要對象。大名鼎鼎的rtl-sdr電視棒也是這家公司的,堪稱業界良心了。
  • 最後是一位開發者不是來自中國,但也必須提到:來自埃塞俄比亞的同事Michael Mehari (https://biblio.ugent.be/person/802001220721)。他在我們最初的Matlab仿真代碼基礎上開發出了ofdm tx FPGA模塊。因爲他沒有看到過和參考過WARP 的PHY tx FPGA實現,所以我們的開源代碼是”無污染”的。

最後想說明的一點是:openwifi現階段一定是在各方面會被商用芯片吊打,這一點毋庸置疑。現階段它對標的對象也不是商用芯片,而是前面的對比表格中的其他項目。但就像當初Linus Torvalds發佈Linux的時候,在強大的商用UNIX面前Linux也只是nothing,誰也不會想到後面Linux竟然變得如此強大。這其中的關鍵就在於你---廣大開發者。感到欣喜的是,我前段時間發佈openwifi項目的twitter在短時間內就獲得了13萬次展示和2萬4千次播放量(demo視頻),來自東西南北半球的人們紛紛表示“這下有得玩了”。

"Talk is cheap. Show me the code." -- Linus Torvalds

我們動手吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章