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

下載本文檔

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

文檔簡介

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

10.1Linux設備驅動基本原理

10.1.1概述

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

①它是操作系統內核和機器硬件之間的接口;

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

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

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

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

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

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

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

10.2Linux設備驅動程序模塊

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

10.3Linux設備驅動程序接口

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

1.?llseek

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

2.?read

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

3.?write

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

4.?readdir

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

5.?poll

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

6.?ioctl

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

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

7.?open

對設備特殊文件進行open()系統調用時,將調用驅動程序的open()函數:

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

8.?release

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

10.4Linux設備驅動程序實現過程

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

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

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

(3)設備的讀寫操作;

(4)設備的控制操作;

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

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

structdevice_struct{

constchar*name;//設備名稱

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

}

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

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

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

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

(1)請求安裝某個中斷號的處理函數:

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

(2)釋放中斷函數:

externvoidfree_irq(unsignedint,void*);

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

10.5怎樣編寫設備驅動程序

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

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

10.6Linux2.6內核驅動原理

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

(1)定義一個platform_driver結構;

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

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

溫馨提示

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

評論

0/150

提交評論