韓冷(1977-)
男,碩士研究生,研究方向為網絡控制技術。
1 引言
過去的十年中,嵌入式系統的開發發生了很大的變化。以前嵌入式設備往往是一個孤立的、資源有限的系統,它們追求的是在有限的價格上滿足一定的功能性要求。通常它們采用那些功能并不強大的CPU。而今天人們對嵌入式設備在智能化和互連性上提出了要求,這使得嵌入式設備不再是孤立的,它們要通過互聯網、無線或是其他的方式實現相互連 接,同時它們也是軟件生態系統(software ecosystem)的一部分。嵌入式設備今天變成了稱之為“等同PC”的系統。它們必須運行很多相同的應用程序,它們需要采用相同的方式實現互連或是在某些情況下增強互連性。
而近年來在國內,支持802.11b的無線網絡已經日漸普及,無線網卡價格大幅跌落,給廣大的無線電子產品設計者提供了更多的選擇,極大豐富了設計和開發者的想象空間,逐漸設計出具有無線網絡數據共享、無線數據采集、無線告警等功能的最具競爭力的“后PC時代”產品。
與此同時,配備一個優秀的圖形用戶界面,使產品和用戶能進行友善可靠的交互也已成為開發工作中非常緊迫的要求。本系統中使用的MiniGUI就是嵌入式Linux系統下一個輕量級的圖形用戶界面支持系統,目前已比較成熟,并已被用到很多項目的實際開發中。
2 無線終端的硬件系統設計
無線終端設備的硬件模塊如圖1所示。
• PowerPC與Flash,RAM組成最小運行系統,提供無線終端設備軟件運行的環境。PowerPC還提供一個以太網端口和一個RS-232串行口,用于程序的調試、修改、編譯及燒寫。
• MPC823系列處理器是迄今為止摩托羅拉推出的PowerQUICC家族中,被廣泛使用的通訊處理器。它是嵌入式處理器內核(embedded PowerPC core)和通訊處理器模塊(CPM)的雙處理器的結構,片內的數據和指令cache,I/O腳的數目,一個實時時鐘,低功耗特性和一個增強的存儲控制器,性能遠勝于68360 QUICC。
圖1 無線終端的硬件模塊
3 軟件系統框架結構
用戶應用程序是最上層的開發,其交互界面直接通過MiniGUI圖形系統的API接口函數實現。MiniGUI交叉編譯安裝后一般以庫的形式存放在操作系統/powerpc-linux/local/lib文件目錄下。
該嵌入式系統的框架結構如圖2所示。
圖2 無線終端設備的軟件模塊
4 Linux設備驅動
系統調用是操作系統內核和應用之間的接口,設備驅動程序是操作系統內核和機器硬件之間的接口。Linux設備驅動程序為應用程序屏蔽了硬件的細節,在應用程序看來,Linux硬件設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。設備驅動程序是內核的一部分,它完成以下的功能:
• 對設備初始化和釋放;
• 把數據從內核傳送到硬件和從硬件讀取數據;
• 讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;
• 檢測和處理設備出現的錯誤。
Linux系統的設備分為三種:字符設備(Char Device)、塊設備(Block Device)和網絡設備(Network Device)。字符設備是指存取時沒有緩存,只能順序訪問的設備。塊設備的讀/寫都有緩存來支持,并且塊設備必須能夠隨機存取,字符設備則沒有這個要求。典型的字符設備包括鼠標、鍵盤、串行口等。塊設備主要包括硬盤、軟盤設備、CDROM等。文件系統必須安裝在塊設備上。塊設備主要是針對磁盤等慢速設備設計的,以免耗費過多的CPU時間來等待。
網絡設備在Linux里做專門的處理。Linux的網絡系統主要是基于BSD Unix的Socket機制。在系統和驅動程序之間定義有專門的數據結構(sk_buff)進行數據的傳遞。系統里支持對發送資料和接收資料的緩存,提供流量控制機制,提供對多協議的支持。
Linux給每個設備都分配一個主設備號(Major Number)和次設備號(Minor Number)。主設備號一般用來定義這個設備的類型。次設備號是一個8位的數字,它是指定一個特定的設備(主設備號指定設備的類型)。Linux具有設備無關性,它把每個設備都抽象為文件系統的一個文件。Linux為每個設備在/dev目錄下建立一個文件。
4.1 無線網絡設備驅動編程
Linux中的網絡設備又被稱為網絡接口,作為其中的三類設備之一,它有其非常特殊的地方。網絡接口在Linux的文件系統中不存在一個對應的文件,而是在核心中用一個net_device數據結構表示的。Linux網絡驅動程序的體系結構如圖3所示。可以劃分為四層,從上到下分別為協議接口層,網絡設備接口層,再就是提供實際功能的設備驅動功能層,以及網絡設備和網絡媒介層。在設計網絡驅動程序時,最主要的工作就是完成設備驅動功能層,使其滿足自己所需的功能。
圖3 網絡設備驅動結構
在Linux中所有網絡設備都抽象為一個接口,這個接口提供了對所有網絡設備的操作集合。由數據結構struct net_device來表示網絡設備在內核中的運行情況,即網絡設備接口。它既包括純軟件網絡設備接口,如環路(Loopback),也包括硬件網絡設備接口,如無線網卡。而由以dev_base為頭指針的設備鏈表來集體管理所有網絡設備,該設備鏈表中的每個元素代表一個網絡設備接口。數據結構net_device中有很多供系統訪問和協議層調用的設備方法,包括初始化,打開和關閉網絡設備的open和stop函數,處理數據包發送的hard_start_xmit函數,以及中斷處理函數等。
由于采用PCMCIA接口的無線網卡,首先是向內核注冊該PCMCIA設備(register_pccard_driver),然后driver_info_t數據結構中的attach函數指針所指向的偵測函數來初始化該PCMCIA設備,并且同時注冊和初始化該網絡設備。
4.2 字符設備驅動