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