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