《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實(shí)踐》課件第10章_第1頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實(shí)踐》課件第10章_第2頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實(shí)踐》課件第10章_第3頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實(shí)踐》課件第10章_第4頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實(shí)踐》課件第10章_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第10章嵌入式Linux設(shè)備驅(qū)動(dòng)10.1Linux設(shè)備驅(qū)動(dòng)基本原理10.2Linux設(shè)備驅(qū)動(dòng)程序模塊10.3Linux設(shè)備驅(qū)動(dòng)程序接口10.4Linux設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)過程10.5怎樣編寫設(shè)備驅(qū)動(dòng)程序10.6Linux2.6內(nèi)核驅(qū)動(dòng)原理本章小結(jié)

10.1Linux設(shè)備驅(qū)動(dòng)基本原理

10.1.1概述

操作系統(tǒng)是通過各種驅(qū)動(dòng)程序來駕馭硬件設(shè)備,它為用戶屏蔽了各種各樣的硬件設(shè)備,驅(qū)動(dòng)硬件是操作系統(tǒng)最基本的功能,并且提供統(tǒng)一的操作方式。正如我們查看屏幕上的文檔時(shí),不用去管到底使用nVIDIA芯片,還是ATI芯片的顯示卡,只需知道輸入命令后,需要的文字就顯示在屏幕上。硬件驅(qū)動(dòng)程序是操作系統(tǒng)最基本的組成部分,在Linux內(nèi)核源程序中也占有較高的比例。圖10-1設(shè)備驅(qū)動(dòng)程序在系統(tǒng)結(jié)構(gòu)圖中的位置從圖10-1中可以看出,設(shè)備驅(qū)動(dòng)程序在整個(gè)系統(tǒng)中的功能是:

①它是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口;

②它控制著設(shè)備的操作動(dòng)作;

③向應(yīng)用程序提供一個(gè)可用的程序接口與設(shè)備互動(dòng)。10.1.2設(shè)備文件

當(dāng)加載了設(shè)備驅(qū)動(dòng)模塊程序后,應(yīng)該怎樣訪問這些設(shè)備呢?

Linux是一種類Unix系統(tǒng),Unix的一個(gè)基本特點(diǎn)是一切皆為文件,它抽象了設(shè)備的處理,將所有的硬件設(shè)備都像普通文件一樣看待,也就是說硬件可以跟普通文件一樣打開、關(guān)閉和讀寫。

系統(tǒng)中的設(shè)備都用一個(gè)設(shè)備特殊文件代表,叫做設(shè)備文件,設(shè)備文件又分為Block(塊)型設(shè)備文件、Character(字符)型設(shè)備文件和Socket(網(wǎng)絡(luò)插件)型設(shè)備文件。10.1.3使用/proc目錄中的文件監(jiān)視驅(qū)動(dòng)程序的狀態(tài)

通過設(shè)備文件怎樣訪問到相應(yīng)的驅(qū)動(dòng)程序呢?

它們中間有一個(gè)橋梁,那就是proc文件系統(tǒng),它一般會(huì)被加載到?/proc目錄。訪問設(shè)備文件時(shí),操作系統(tǒng)通常會(huì)通過查找?/proc目錄下的值,確定由哪些驅(qū)動(dòng)模塊來完成任務(wù)。如果proc文件系統(tǒng)沒有加載,訪問設(shè)備文件時(shí)就會(huì)出現(xiàn)錯(cuò)誤。

10.2Linux設(shè)備驅(qū)動(dòng)程序模塊

Linux內(nèi)核中采用可加載的模塊化設(shè)計(jì),一般情況下編譯的Linux內(nèi)核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內(nèi)核中,其他的代碼可以選擇是在內(nèi)核中,或者編譯為內(nèi)核的模塊文件。即Linux下的設(shè)備驅(qū)動(dòng)程序可以按照兩種方式進(jìn)行編譯:一種是直接靜態(tài)編譯成內(nèi)核的一部分;另一種是編譯成可以動(dòng)態(tài)加載的模塊。

10.3Linux設(shè)備驅(qū)動(dòng)程序接口

Linux下的設(shè)備驅(qū)動(dòng)程序被組織為一組完成不同任務(wù)的函數(shù)的集合,通過這些函數(shù)使得Linux的設(shè)備操作猶如文件一般。

1.?llseek

該函數(shù)用來修改文件的當(dāng)前讀寫位置,并將新位置作為(正的)返回值返回。

2.?read

當(dāng)對(duì)設(shè)備特殊文件進(jìn)行read()系統(tǒng)調(diào)用時(shí),將調(diào)用驅(qū)動(dòng)程序read()函數(shù)。該函數(shù)用來從設(shè)備中讀取數(shù)據(jù)。當(dāng)該函數(shù)指針被賦為NULL值時(shí),將導(dǎo)致read系統(tǒng)調(diào)用出錯(cuò)并返回-EINVAL(“Invalidargument,非法參數(shù)”)。函數(shù)返回非負(fù)值表示成功讀取的字節(jié)數(shù)(返回值為“signedsize”數(shù)據(jù)類型,通常就是目標(biāo)平臺(tái)上的固有整數(shù)類型)。

3.?write

當(dāng)設(shè)備特殊文件進(jìn)行write()系統(tǒng)調(diào)用時(shí),將調(diào)用驅(qū)動(dòng)程序的write()函數(shù)。該函數(shù)用來向設(shè)備發(fā)送數(shù)據(jù)。如果沒有這個(gè)函數(shù),write系統(tǒng)調(diào)用會(huì)向調(diào)用程序返回一個(gè)?-EINVAL。如果返回值非負(fù),則表示成功寫入的字節(jié)數(shù)。

4.?readdir

讀取目錄,對(duì)于設(shè)備文件來說,這個(gè)字段應(yīng)該為NULL,它僅用于讀且只對(duì)文件系統(tǒng)有用。

5.?poll

用來查詢?cè)O(shè)備是否可讀或可寫,或是否處于某種特殊狀態(tài)。

6.?ioctl

該函數(shù)是特殊的控制函數(shù),可以通過它向設(shè)備傳遞控制信息或從設(shè)備取得狀態(tài)信息,函數(shù)原型為:

int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong)

7.?open

對(duì)設(shè)備特殊文件進(jìn)行open()系統(tǒng)調(diào)用時(shí),將調(diào)用驅(qū)動(dòng)程序的open()函數(shù):

int(*open)(structinode*,structfile*);

8.?release

當(dāng)最后一個(gè)打開設(shè)備的用戶進(jìn)程執(zhí)行close()系統(tǒng)調(diào)用時(shí),內(nèi)核將調(diào)用驅(qū)動(dòng)程序的release()函數(shù)。release函數(shù)的主要任務(wù)是清理未結(jié)束的輸入/輸出操作、釋放資源、用戶自定義排他標(biāo)志的復(fù)位等。

10.4Linux設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)過程

Linux的設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)過程大致可以分為如下幾個(gè)部分:

(1)驅(qū)動(dòng)程序的注冊(cè)與注銷;

(2)設(shè)備的打開與釋放;

(3)設(shè)備的讀寫操作;

(4)設(shè)備的控制操作;

(5)中斷處理。10.4.1驅(qū)動(dòng)程序的注冊(cè)與注銷

內(nèi)核提供一個(gè)字符設(shè)備注冊(cè)表,用于管理登記各種字符設(shè)備的名字和對(duì)應(yīng)操作。該數(shù)據(jù)結(jié)構(gòu)在文件fs/devices.c中定義,定義形式為:

structdevice_struct{

constchar*name;//設(shè)備名稱

structfile_operations*fops;//設(shè)備相關(guān)文件操作

}

staticstrutdevice_structchrdevs[MAXCHRDEV]10.4.2設(shè)備的打開與釋放

打開設(shè)備:是通過調(diào)用file_operations結(jié)構(gòu)中的函數(shù)open()來完成的,它是驅(qū)動(dòng)程序用來為后面的操作完成初始化準(zhǔn)備工作的。10.4.3設(shè)備的控制操作(ioctl)

ioctl方法主要用于對(duì)設(shè)備進(jìn)行讀寫之外的其他控制,比如配置設(shè)備、進(jìn)入或退出某種操作模式,這些操作一般都無法通過read/write文件操作來完成,這就是ioctl操作的功能。10.4.4中斷處理

中斷是所有現(xiàn)在微處理器的重要功能,Linux驅(qū)動(dòng)程序中對(duì)于中斷的處理方法一般使用以下幾個(gè)函數(shù):

(1)請(qǐng)求安裝某個(gè)中斷號(hào)的處理函數(shù):

externintrequest_irq(unsignedintirq,void(*handler)(int,void*,structpt_regs*),unsignedlongflag,constchar*dev_name,void*dev_id);

(2)釋放中斷函數(shù):

externvoidfree_irq(unsignedint,void*);

request_irq函數(shù)中的參數(shù)說明如表10-2所示。

10.5怎樣編寫設(shè)備驅(qū)動(dòng)程序

上面講述了設(shè)備驅(qū)動(dòng)程序相關(guān)的概念和基本原理,下面通過一個(gè)實(shí)例來講述編寫設(shè)備驅(qū)動(dòng)程序的一般方法。

假設(shè)一個(gè)非常簡(jiǎn)單的虛擬字符設(shè)備:這個(gè)設(shè)備中只有一個(gè)4個(gè)字節(jié)的全局變量intglobal_var,而這個(gè)設(shè)備的名字叫做“globalvar”。對(duì)“globalvar”設(shè)備的讀寫等操作,即是對(duì)其中全局變量global_var的操作。驅(qū)動(dòng)程序是內(nèi)核的一部分,因此我們需要給其添加模塊初始化函數(shù),該函數(shù)用來完成對(duì)所控設(shè)備的初始化工作,并調(diào)用register_chrdev()函數(shù)注冊(cè)字符設(shè)備:與模塊初始化函數(shù)對(duì)應(yīng)的就是模塊卸載函數(shù),需要調(diào)用register_chrdev()的反函數(shù)unregister_chrdev():圖10-2加載globalvar模塊結(jié)果圖10-3Linux版本鏈接錯(cuò)誤圖10-4“globalvar”模塊測(cè)試

10.6Linux2.6內(nèi)核驅(qū)動(dòng)原理

從2.6版本開始引入了platform這個(gè)概念。首先介紹一下2.6版本注冊(cè)一個(gè)驅(qū)動(dòng)的步驟:

(1)定義一個(gè)platform_driver結(jié)構(gòu);

(2)初始化這個(gè)結(jié)構(gòu),指定其probe、remove等函數(shù),并初始化其中的driver變量;

(3)實(shí)現(xiàn)其probe、remove等函數(shù)。當(dāng)用戶打開一個(gè)設(shè)備,并調(diào)用其read、write等函數(shù)的時(shí)候,就可以通過上面的file_operations來找到相關(guān)的函數(shù)。所以,用戶驅(qū)動(dòng)程序還需要實(shí)現(xiàn)這些函數(shù),具體實(shí)現(xiàn)和相關(guān)的設(shè)備有密切的關(guān)系

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論