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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第10章嵌入式Linux設備驅動10.1Linux設備驅動基本原理10.2Linux設備驅動程序模塊10.3Linux設備驅動程序接口10.4Linux設備驅動程序實現(xiàn)過程10.5怎樣編寫設備驅動程序10.6Linux2.6內(nèi)核驅動原理本章小結

10.1Linux設備驅動基本原理

10.1.1概述

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

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

②它控制著設備的操作動作;

③向應用程序提供一個可用的程序接口與設備互動。10.1.2設備文件

當加載了設備驅動模塊程序后,應該怎樣訪問這些設備呢?

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

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

通過設備文件怎樣訪問到相應的驅動程序呢?

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

10.2Linux設備驅動程序模塊

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

10.3Linux設備驅動程序接口

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

1.?llseek

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

2.?read

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

3.?write

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

4.?readdir

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

5.?poll

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

6.?ioctl

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

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

7.?open

對設備特殊文件進行open()系統(tǒng)調(diào)用時,將調(diào)用驅動程序的open()函數(shù):

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

8.?release

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

10.4Linux設備驅動程序實現(xiàn)過程

Linux的設備驅動程序實現(xiàn)過程大致可以分為如下幾個部分:

(1)驅動程序的注冊與注銷;

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

(3)設備的讀寫操作;

(4)設備的控制操作;

(5)中斷處理。10.4.1驅動程序的注冊與注銷

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

structdevice_struct{

constchar*name;//設備名稱

structfile_operations*fops;//設備相關文件操作

}

staticstrutdevice_structchrdevs[MAXCHRDEV]10.4.2設備的打開與釋放

打開設備:是通過調(diào)用file_operations結構中的函數(shù)open()來完成的,它是驅動程序用來為后面的操作完成初始化準備工作的。10.4.3設備的控制操作(ioctl)

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

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

(1)請求安裝某個中斷號的處理函數(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怎樣編寫設備驅動程序

上面講述了設備驅動程序相關的概念和基本原理,下面通過一個實例來講述編寫設備驅動程序的一般方法。

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

10.6Linux2.6內(nèi)核驅動原理

從2.6版本開始引入了platform這個概念。首先介紹一下2.6版本注冊一個驅動的步驟:

(1)定義一個platform_driver結構;

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

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

溫馨提示

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

評論

0/150

提交評論