張 康
(桂林電子科技大學,廣西 桂林 541004)
近年來,嵌入式系統(tǒng)越來越廣泛應用于人們生活的方方面面。在很多的應用場景下,嵌入式設備需要與外界進行網(wǎng)絡通信。傳統(tǒng)的有線組網(wǎng)方案對設備的移動性和靈活性限制很大,越來越多的嵌入式設備需要采用無線網(wǎng)絡進行數(shù)據(jù)傳輸。嵌入式ARM微處理器及技術的應用幾乎已經(jīng)深入到各個領域。而Linux操作系統(tǒng)作為一款免費、開源的操作系統(tǒng),在保證可靠性、穩(wěn)定性、多任務性、實時性的同時,又具有可裁減性和可定制性,并且對硬件設備具有豐富的支持,因而在嵌入式開發(fā)中得到了廣泛的應用。基于以上,本文分析了Linux網(wǎng)絡設備驅(qū)動結構,研究了基于ARM-Linux平臺的無線網(wǎng)絡設備搭建和配置方法。
相應的驅(qū)動例程,使控制從用戶例程轉(zhuǎn)移到驅(qū)動例程,完成相關操作后返回用戶例程。
Linux的內(nèi)核部分與設備驅(qū)動之間通過接口的形式進行標準化的互操作。對于每一類設備,如塊設備、字符設備和網(wǎng)絡設備都存在相應的通用接口以供硬件為內(nèi)核提供相關服務。有了這些通用接口,內(nèi)核就可以采用相同的方式來處理不同的硬件設備和它們的驅(qū)動程序。設備驅(qū)動程序是位于應用層和硬件設備之間的軟件,它隱藏了設備的工作細節(jié)。它只負責處理硬件,而如何使用這些硬件設備則由應用程序來決定。應用程序?qū)υO備的使用是通過一系列標準形式的調(diào)用來完成的,而設備驅(qū)動程序負責將這些調(diào)用映射到對硬件設備特定的操作上。圖 1描述了用戶應用程序、系統(tǒng)內(nèi)核、TCP/IP協(xié)議棧、網(wǎng)絡設備驅(qū)動和硬件設備之間是如何進行交互的。
Linux設備驅(qū)動程序是Linux內(nèi)核與硬件設備之間的軟件接口。當內(nèi)核需要對硬件設備進行操作的時候,它就調(diào)用
圖1 Linux各層接口
在 Linux中,對于每一個網(wǎng)絡設備,都用一個 struct device的數(shù)據(jù)結構作為內(nèi)核空間和網(wǎng)絡設備間的網(wǎng)絡接口,網(wǎng)絡驅(qū)動程序通過該接口進行網(wǎng)絡數(shù)據(jù)傳輸。Linux網(wǎng)絡驅(qū)動的體系結構可從上至下劃分為以下四層,分別是網(wǎng)絡協(xié)議接口層、網(wǎng)絡設備接口層、設備驅(qū)動功能層、網(wǎng)絡設備媒介層,如圖2所示。
圖2 Linux設備驅(qū)動結構
Linux 設備驅(qū)動,可以通過兩種方式進行加載。一種是將設備驅(qū)動直接編譯進系統(tǒng)內(nèi)核,設備驅(qū)動將隨著Linux內(nèi)核的啟動進行加載,內(nèi)核啟動完成之后,設備驅(qū)動功能也隨即實現(xiàn)。這種方式會增加內(nèi)核的大小,另外要在現(xiàn)有的內(nèi)核中新增或刪除功能,將不得不重新編譯內(nèi)核。第二種方式是通過模塊進行加載。模塊化設計使得Linux內(nèi)核功能更容易擴展。這種方式可以控制內(nèi)核大小, 并且方便對設備驅(qū)動的開發(fā),每次修改驅(qū)動,只需重新編譯驅(qū)動即可,無需再次編譯內(nèi)核,方便調(diào)試。本文中的網(wǎng)絡設備驅(qū)動通過第二種方式進行加載:首先通過模塊加載命令insmod將網(wǎng)絡設備驅(qū)動程序加載到系統(tǒng)內(nèi)核之中,之后insmod命令調(diào)用init_module函數(shù)對網(wǎng)絡設備的 init函數(shù)指針進行初始化,并通過調(diào)用register_netdev()函數(shù)將該網(wǎng)絡設備注冊到系統(tǒng)中。接下來則調(diào)用 init函數(shù)指針指向的網(wǎng)絡設備初始化函數(shù)對設備進行初始化,將設備的device數(shù)據(jù)結構插入到dev_base鏈表的末尾。如果要對模塊進行卸載,可以通過執(zhí)行命令 rmmod來調(diào)用網(wǎng)絡驅(qū)動程序中的cleanup_module函數(shù),對網(wǎng)絡驅(qū)動程序模塊進行卸載,具體過程如圖3所示。
圖3 Linux模塊加載過程
本文中實現(xiàn)無線網(wǎng)絡接入功能的目標平臺為 Xilinx公司生產(chǎn)的ZC702開發(fā)板。該開發(fā)板的主芯片為Xilinx公司推出的Z-7020芯片。該芯片將FPGA(現(xiàn)場可編程邏緝器件)和雙核ARM Cortex-A9 MPCore集成到一塊器件中,將處理器的軟件可編程能力與 FPGA 的硬件可編程能力實現(xiàn)無縫結合,具有突出的系統(tǒng)性能、靈活性、可擴展性。本設計采用無線網(wǎng)卡作為系統(tǒng)的無線接入設備,通過USB接口連接無線網(wǎng)卡與 ARM處理器。該系統(tǒng)中使用的無線網(wǎng)卡的主芯片是Ralink公司生產(chǎn)的RT3070,支持IEEE802.11n標準,傳輸速率最大支持150Mbps,支持操作系統(tǒng)Windows/Linux。
目標平臺采用Linux操作系統(tǒng),內(nèi)核版本為3.0.0。宿主機使用的操作系統(tǒng)為 Windows系統(tǒng),需要安裝 VMware Workstation虛擬機,在虛擬機中安裝運行Ubuntu10.0系統(tǒng)(內(nèi)核板本為Linux 2.6.36)作為開發(fā)環(huán)境。交叉編譯工具使用Xilinx提供的arm-xilinxa9-linux。
在虛擬機中啟動 Ubuntu10.0,打開終端,進入Linux3.0.0內(nèi)核目錄/opt/linux-xlnx,在SHELL中運行命令make ARCH=arm menuconfig進入內(nèi)核配置菜單,在菜單中配置內(nèi)核選項,添加內(nèi)核對Wlan的支持及對USB驅(qū)動的支持。
保存內(nèi)核配置,進行內(nèi)核編譯:在SHELL中運行命令make ARCH=arm CROSS_COMPILE = arm-xilinxa9-linux-gnueabizImage。
編譯結束后將在/opt/linux-xlnx/arch/arm/boot路徑下生成zImage內(nèi)核二進制文件,Linux3.0.0內(nèi)核就編譯好了。
4.2.1 修改Makefile文件
從Ralink官網(wǎng)獲取RT3070的驅(qū)動程序源碼。進入驅(qū)動源碼目錄/opt/rt3070,打開Makefile文件,進行修改,添加以下內(nèi)容:
PLATFORM = Xarm
ifeq ($(PLATFORM),Xarm)
LINUX_SRC = /opt/linux-xlnx
CROSS_COMPILE = arm-xilinxa9-linux-gnueabi-
4.2.2 修改config.mk文件
進入目錄/opt/rt3070/os/linux/,打開config.mk文件進行修改,修改內(nèi)容如圖4所示。
最后保存文件,開始交叉編譯驅(qū)動,在SHELL中運行命令make ARCH=arm CROSS_COMPILE = arm-xilinxa9-linux-gnueabi-。最終生成rt3070sta.ko文件,交叉編譯完成。
圖4 config.mk文件修改內(nèi)容
將目標板設置為SD卡啟動方式,將編譯好的內(nèi)核映像文件及Uboot文件、設備樹、根文件系統(tǒng)拷入SD卡中。啟動開發(fā)板,進入操作系統(tǒng),并通過串口終端在PC上進行顯示。通過開發(fā)板的USB接口,使用U盤將相關文件拷貝到目標機中:
(1)把驅(qū)動源文件中的 RT2870STA.dat 拷貝到目標機根文件系統(tǒng)/etc/Wireless/RT2870STA/路徑下。
(2)將驅(qū)動模塊 rt3070sta.ko,拷貝到目標機根文件系統(tǒng)中,在SHELL中執(zhí)行安裝模塊命令insmod rt3070sta.ko。
(3)從Ralink官網(wǎng)獲取網(wǎng)卡固件rt2870.bin。將網(wǎng)卡固件拷貝到目標機根文件系統(tǒng)目錄/lib/firmwire/下,在SHELL中執(zhí)行命令 export FIRMWARE=/lib/firmware。再執(zhí)行命令ifconfig ra0 up啟動無線網(wǎng)卡。這樣RT3070無線網(wǎng)卡就移植完畢了,此時網(wǎng)卡就可以開始工作了。
對無線網(wǎng)卡的設置需要使用無線網(wǎng)絡配置工具,所以就要在目標板系統(tǒng)中安裝相關配置工具。下面介紹使用wireless-tools工具的安裝方法。
(1)可通過網(wǎng)絡獲取wireless-tools源碼,修改其中的 Makefile文件。修改交叉編譯工具路徑為CROSS_COMPILE=/root/CodeSourcery/Sourcery_G++_Lite/b in/arm-xilinxa9-linux-gnueabi-。
(2)運行make命令,編譯wireless-tools。
(3)拷貝生成的庫文件libiw.so.29和libiw.so到目標板文件系統(tǒng)/lib目錄下;拷貝iwconfig、iwlist、iwpriv等可執(zhí)行文件到目標板文件系統(tǒng)/usr/bin目錄下,wireless-tools工具就安裝好了。
在完成網(wǎng)卡的移植及wireless-tools的安裝后,就可對無線網(wǎng)卡進行配置和測試了。
(1)在目標平臺上運行ifconfig ra0 up命令啟用無線網(wǎng)卡。分別使用ifconfig ra0和iwconfig ra0可以查看無線網(wǎng)卡目前的狀態(tài)。顯示結果如圖5所示。
圖5 顯示無線網(wǎng)卡狀態(tài)
(2)要搜尋周圍環(huán)境的無線網(wǎng)絡信號可運行iwlist ra0 scanning命令,圖6和圖7中為搜尋到的部分無線網(wǎng)絡,其中圖7顯示的是本次測試中使用無線路由器所產(chǎn)生的無線網(wǎng)絡,其ESSID(擴展服務區(qū)標識)為“TEST”。
圖6 部分無線網(wǎng)絡信號
圖7 測試用的無線路由信號
(3)運行命令iwconfig ra0 essid TEST,接入無線路由所在的測試網(wǎng)絡。運行結果如圖8所示。
圖8 接入測試網(wǎng)絡
(4)通過命令udhcpc –i ra0從無線路由獲取動態(tài)分配的IP地址,運行結果如圖9所示。
圖9 動態(tài)獲取IP地址
(5)無線路由的IP地址為192.168.1.1。在目標平臺上運行ping 192.168.1.1,有數(shù)據(jù)返回,表明目標平臺的無線網(wǎng)卡和無線路由間的網(wǎng)絡是連通的。該無線網(wǎng)絡中另一臺主機的IP地址為192.168.1.100,再次運行ping命令進行測試,結果顯示無線網(wǎng)卡和該主機的網(wǎng)絡是連通的。Ping命令的顯示結果如圖10所示。
圖10 Ping命令運行結果
本文對Linux網(wǎng)絡設備驅(qū)動的體系結構和工作原理進行了分析,研究了ARM-Linux平臺接入無線網(wǎng)絡的實現(xiàn)方案,將無線網(wǎng)卡移植到目標平臺,并進行了相關配置及測試。結果表明,該方案成功實現(xiàn)了嵌入式系統(tǒng)的無線接入功能,使用嵌入式設備的數(shù)據(jù)傳輸方式更加靈活。
[1] Gene Sally. Linux嵌入式系統(tǒng)高級程序設計[M].郭旭,譯.北京:人民郵電出版社,2010.
[2] 商斌.嵌入式Linux C語言開發(fā)入門與編程實踐[M].北京:電子工業(yè)出版社,2008.
[3] 趙炯.Linux內(nèi)核完全注釋[M].北京:機械工業(yè)出版社,2004.
[4] 郭磊,廖啟征,魏世民.基于ARM9系統(tǒng)的USB無線網(wǎng)卡驅(qū)動程序設計[J].計算機系統(tǒng)應用,2007(1):92-94.
[5] 楊宗德.嵌入式 ARM 系統(tǒng)原理與實例開發(fā)[M].北京:北京大學出版社,2010.