高學群
摘要:嵌入式 Linux是以Linux系統為基礎的嵌入式操作系統,將Linux操作系統定制成能夠運行的嵌入式操作系統。嵌入式Linux不僅具有嵌入式操作系統的特點還有著大量的開放源碼資源和免費的版權,最重要的是有著優異的性能和許多應用軟件的支持。憑借著產品應用開發周期短,可參考和移植實時開放代碼,被開發人員廣泛關注。
關鍵詞: Linux;設備驅動;軟件平臺
Linux系統作為嵌入式操作系統有著明顯的優勢,首先,Linux源代碼是開放的,全球的Linux愛好者都是在不斷地開發完善Linux內核;其次,Linux系統內核很小,最小可達約134KB。同時Linux內核的更新速度很快并且可以定制。Linux一大亮點就是免費。Linux適應多種CPU硬件平臺表現了嵌入式操作系統必須的特色。如今,Linux操作系統不僅支持二三十種CPU,而且容易開發、使用和性能良好。Linux的平臺移植成為CPU芯片行業的熱門項目,移植速度更是超過了Java。在網絡方面,Linux內核的結構更有優勢,能夠完備的支持TCP/IP協議并且能夠提供了最高千兆的以太網以及無線等網絡支持。
本設計選用Linux作為軟件平臺進行開發,內核版本2.6.39。
設備驅動在字面可以清楚的理解為“驅使硬件設備行動”。驅動是與底層硬件接觸,而不同硬件設備具有不同的工作方式,所以驅動要按照具體的工作方式讀寫硬件設備寄存器,完成中斷處理、物理內存向虛擬內存的映射等,使設備各功能能夠正常工作,如能夠收發數據的通信設備,能顯示文字的顯示設備等。
驅動的對象不是CPU內核而是存儲器和外設。Linux把存儲器和外設分為字符設備、塊設備和網絡設備。字符設備是像觸摸屏、鼠標之類的以串行順序依次進行訪問的設備。塊設備是可以用任意順序進行訪問并經過系統的快速緩沖的設備。雖然字符設備不經過系統的快速緩沖,但是它們之間并沒有明顯的界限,就像有塊設備特點的Flash設備,也可以把它看成一個字符設備來訪問。網絡設備主要是接收和發送數據包。
2.1串口底層驅動程序
異步串口是通信最常用的資源。RS-232和RS-485都是串行數據接口標準。RS-485比RS-232在傳輸速度、距離等方面都有著明顯優勢,同時一條總線上最多可連接32個接收器。由于它們的時序完全一樣,只是在電氣特性上有所區別,所以它們之間也很容易實現轉換。
串口驅動位于tty子系統。對于用戶來說,訪問串口與訪問其它字符設備的方法一樣,都是通過系統調用訪問設備文件從而訪問設備。串口主要有open函數,read函數,write函數。因此驅動程序中也要實現這三個實現函數,如圖1串口驅動包含以下部分:
本設計基于Linux-2.6.39內核源碼完成對串口驅動程序的開發。其主要代碼在linux-2.6.39\drivers\tty\ serial\atmel_serial.c中實現。其中部分函數如下:
(1)驅動加載與卸載函數
2.2以太網口底層驅動程序
在物聯網發展的今天,嵌入式系統都會擁有網絡模塊。以太網作為通信接口有著傳輸速度快、穩定等優點。它也可以作為嵌入式系統開發的調試的接口。Linux網絡驅動程序的體系結構如圖2所示
網絡設備接口及以上層次的源碼都可以通過Linux內核中找到,因此對于特定網絡硬件驅動程序的移植關鍵在于設備驅動功能層,包含接收數據、發送數據等控制。所有網絡設備在Linux中都可以抽象為一個接口,網絡設備在內核中的運行情況由網絡設備接口(結構體struct net_ device)來表示。以dev_base為頭指針的設備鏈表(每個元素代表一個網絡設備接口)管理著所有網絡設備。大部分供系統訪問和協議層調用的設備方法都在結構體net_ device中,有init函數(初始化)、open和stop函數(設備打開關閉)、hard_start_xmit函數(數據包發送)以及中斷處理函數等。
本設計基于Linux-2.6.39內核源碼完成對網口驅動程序的開發。其主要代碼在linux-2.6.39\drivers\net\fec.c中實現。其中部分功能如下: