chapter8嵌入式Linux設(shè)備驅(qū)動程序開發(fā)_第1頁
chapter8嵌入式Linux設(shè)備驅(qū)動程序開發(fā)_第2頁
chapter8嵌入式Linux設(shè)備驅(qū)動程序開發(fā)_第3頁
chapter8嵌入式Linux設(shè)備驅(qū)動程序開發(fā)_第4頁
chapter8嵌入式Linux設(shè)備驅(qū)動程序開發(fā)_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式Linux設(shè)備驅(qū)動程序開發(fā)1設(shè)備管理2設(shè)備驅(qū)動根底3字符設(shè)備驅(qū)動4常用設(shè)備驅(qū)動實例設(shè)備管理1設(shè)備管理概述2I/O控制方式3設(shè)備分配4Linux中的設(shè)備管理

1設(shè)備管理概述1.1I/O設(shè)備的類型按設(shè)備的所屬關(guān)系可以將I/O設(shè)備分為以下兩類?!?〕系統(tǒng)設(shè)備系統(tǒng)設(shè)備是在系統(tǒng)生成時已登記于系統(tǒng)中的標(biāo)準設(shè)備,屬于系統(tǒng)的根本配置?!?〕用戶設(shè)備用戶設(shè)備是在系統(tǒng)生成時未登記在系統(tǒng)中的非標(biāo)準設(shè)備。按設(shè)備的信息交換的單位可將I/O設(shè)備分為以下兩類。〔1〕字符設(shè)備字符設(shè)備是以字符為單位進行輸入和輸出的設(shè)備。〔2〕塊設(shè)備塊設(shè)備的輸入和輸出是以數(shù)據(jù)塊為單位的。按設(shè)備的共享屬性可將I/O設(shè)備分為以下三類。〔1〕獨占設(shè)備所有的字符設(shè)備都是獨占設(shè)備。獨占設(shè)備是指一段時間內(nèi)只允許一個用戶〔進程〕訪問的設(shè)備,即臨界資源?!?〕共享設(shè)備塊設(shè)備都是共享設(shè)備。共享設(shè)備是指一段時間內(nèi)允許多個進程同時訪問的設(shè)備。〔3〕虛擬設(shè)備通過虛擬設(shè)備技術(shù)把一臺獨占設(shè)備變換為假設(shè)干臺邏輯設(shè)備,供假設(shè)干個用戶〔進程〕同時使用,以提高設(shè)備的利用率。1.2設(shè)備管理的任務(wù)和功能設(shè)備管理是對計算機的輸入/輸出系統(tǒng)的管理,它是操作系統(tǒng)中最具有多樣性和復(fù)雜性的局部。其主要任務(wù)如下所述?!?〕選擇和分配I/O設(shè)備以便進行數(shù)據(jù)傳輸操作?!?〕控制I/O設(shè)備和CPU〔或內(nèi)存〕之間交換數(shù)據(jù)。〔3〕為用戶提供一個友好的透明接口,把用戶和設(shè)備硬件特性分開,使得用戶在編制應(yīng)用程序時不必涉及具體設(shè)備,由系統(tǒng)按用戶的要求來對設(shè)備的工作進行控制。另外,這個接口還為新增加的用戶設(shè)備提供一個和系統(tǒng)核心相連接的入口,以便用戶開發(fā)新的設(shè)備管理程序?!?〕提高設(shè)備和設(shè)備之間、CPU和設(shè)備之間以及進程和進程之間的并行操作程度,以使操作系統(tǒng)獲得最正確效率。為了完成上述主要任務(wù),設(shè)備管理程序一般要提供下述功能。〔1〕提供和進程管理系統(tǒng)的接口〔2〕進行設(shè)備分配〔3〕實現(xiàn)設(shè)備和設(shè)備、設(shè)備和CPU等之間的并行操作〔4〕進行緩沖管理〔5〕設(shè)備控制與驅(qū)動1.3設(shè)備控制器設(shè)備控制器是CPU與I/O設(shè)備之間的接口,它接收從CPU發(fā)來的命令并去控制I/O設(shè)備工作。設(shè)備控制器是一個可編址設(shè)備,當(dāng)它僅控制一個設(shè)備時,它只有一個惟一的設(shè)備地址;當(dāng)它控制多個設(shè)備時,那么應(yīng)具有多個設(shè)備地址,使每一個地址對應(yīng)一個設(shè)備。為實現(xiàn)設(shè)備控制器的功能,大多數(shù)設(shè)備控制器都由以下三局部組成。1.設(shè)備控制器與處理機的接口2.設(shè)備控制器與設(shè)備的接口3.I/O邏輯圖10.1設(shè)備控制器的組成1.4I/O通道設(shè)置I/O通道的目的是使一些原來由CPU處理的I/O任務(wù)轉(zhuǎn)由通道來承擔(dān),從而把CPU從繁雜的I/O任務(wù)中解脫出來。在設(shè)置了通道后,CPU只需向通道發(fā)送一條I/O指令。通道在收到該指令后,便從內(nèi)存中取出本次要執(zhí)行的通道程序,然后執(zhí)行該通道程序,僅當(dāng)通道完成了規(guī)定的I/O任務(wù)后,才向CPU發(fā)中斷信號。實際上,I/O通道是一種特殊的處理機,它具有執(zhí)行I/O指令的能力,并通過執(zhí)行通道〔I/O〕程序來控制I/O操作。通道有兩種根本類型:選擇通道和多路通道。圖10.2單通路I/O系統(tǒng)圖10.3多通路I/O系統(tǒng)1.6設(shè)備驅(qū)動設(shè)備驅(qū)動程序的主要任務(wù),是接收上層軟件發(fā)來的抽象要求,如read或write命令,再把它轉(zhuǎn)換為具體要求,發(fā)送給設(shè)備控制器;此外,它也將由設(shè)備控制器發(fā)來的信號傳送給上層軟件,從而完成兩者間的相互通信。設(shè)備驅(qū)動程序的處理過程。〔1〕將抽象要求轉(zhuǎn)換為具體要求〔2〕檢查I/O請求的合法性〔3〕讀出和檢查設(shè)備的狀態(tài)〔4〕傳送必要的參數(shù)〔5〕工作方式的設(shè)置〔6〕啟動I/O設(shè)備2I/O控制方式2.1程序I/O方式圖10.4示出了程序I/O方式的流程。圖10.4程序I/O方式的流程2.2中斷驅(qū)動I/O控制方式在現(xiàn)代計算機系統(tǒng)中,都毫無例外地引入了中斷機構(gòu),致使對I/O設(shè)備的控制,廣泛采用中斷驅(qū)動〔InterruptDriven〕方式。即當(dāng)某進程要啟動某個I/O設(shè)備工作時,便由CPU向相應(yīng)的設(shè)備控制器發(fā)出一條I/O命令,然后立即返回繼續(xù)執(zhí)行原來的任務(wù),設(shè)備控制器那么按照該命令的要求去控制指定I/O設(shè)備。此時,CPU與I/O設(shè)備并行操作。例如,在輸入時,當(dāng)設(shè)備控制器收到CPU發(fā)來的讀命令后,便去控制相應(yīng)的輸入設(shè)備讀數(shù)據(jù)。一旦數(shù)據(jù)進入數(shù)據(jù)存放器,控制器便通過控制線向CPU發(fā)送一個中斷信號,由CPU檢查輸入過程中是否出錯,假設(shè)無錯,便向控制器發(fā)送取走數(shù)據(jù)的信號,然后再通過控制器及數(shù)據(jù)線,將數(shù)據(jù)寫入內(nèi)存指定單元中。圖10.5示出了中斷驅(qū)動I/O控制方式的流程。圖10.5中斷驅(qū)動I/O控制方式的流程2.3DMA控制方式DMA方式的根本思想是,在外圍設(shè)備和內(nèi)存之間開辟直接的數(shù)據(jù)交換通路。在DMA控制器中,除了控制狀態(tài)存放器和數(shù)據(jù)緩沖存放器外,還包括傳送字節(jié)計數(shù)器和內(nèi)存地址存放器以及控制電路等。因此,DMA控制器可用來代替CPU,以實現(xiàn)內(nèi)存和設(shè)備之間進行成批的數(shù)據(jù)交換。DMA方式的傳送結(jié)構(gòu)如圖10.6所示。圖10.6DMA方式的傳送結(jié)構(gòu)3.2設(shè)備分配時應(yīng)考慮的因素1.設(shè)備的固有屬性2.設(shè)備分配算法I/O設(shè)備的分配,除了與I/O設(shè)備的固有屬性有關(guān)之外,還與系統(tǒng)所采用的設(shè)備分配算法有關(guān)。I/O設(shè)備的分配與進程調(diào)度很相似,同樣可采用如下一些算法。〔1〕先來先效勞〔2〕優(yōu)先級最高者優(yōu)先3.設(shè)備分配中的平安性從進程運行的平安性方面考慮,設(shè)備分配方式有以下兩種?!?〕靜態(tài)分配〔2〕動態(tài)分配4.設(shè)備獨立性為了提高系統(tǒng)的可適應(yīng)性和可擴展性,應(yīng)使所編制的用戶程序與實際使用的物理設(shè)備無關(guān),即應(yīng)用程序獨立于具體使用的物理設(shè)備,這就是所謂的設(shè)備獨立性。6Linux中的設(shè)備管理6.1Linux設(shè)備管理概述在Linux系統(tǒng)中,用戶是通過文件系統(tǒng)與設(shè)備接口的。所有設(shè)備都作為特別文件,從而在設(shè)備管理上具有以下特性?!?〕每個設(shè)備都對應(yīng)文件系統(tǒng)中的一個索引節(jié)點,都有一個文件名?!?〕應(yīng)用程序通??梢酝ㄟ^系統(tǒng)調(diào)用open〔〕翻開設(shè)備文件,建立起與目標(biāo)設(shè)備的連接。〔3〕對設(shè)備的使用類似于對文件的存取。〔4〕設(shè)備驅(qū)動程序都是系統(tǒng)內(nèi)核的一局部,它們必須為系統(tǒng)內(nèi)核或者它們的子系統(tǒng)提供一個標(biāo)準的接口?!?〕設(shè)備驅(qū)動程序使用一些標(biāo)準的內(nèi)核效勞,如內(nèi)存分配等。圖10.18設(shè)備驅(qū)動分層結(jié)構(gòu)7用戶態(tài)與內(nèi)核態(tài)在單內(nèi)核模式系統(tǒng)中,操作系統(tǒng)提供效勞的流程為〔即用戶應(yīng)用程序調(diào)用系統(tǒng)內(nèi)核功能〕:應(yīng)用主程序使用指定的參數(shù)執(zhí)行系統(tǒng)調(diào)用指令〔intx80〕,使CPU從用戶態(tài)〔UserMode〕切換到核心態(tài)〔KernelMode〕,然后系統(tǒng)根據(jù)參數(shù)值調(diào)用特定的系統(tǒng)調(diào)用效勞程序,而這些效勞程序那么根據(jù)需要調(diào)用底層的支持函數(shù)以完成特定的功能。在完成了應(yīng)用程序要求的效勞后,操作系統(tǒng)又從核心態(tài)切換回用戶態(tài),回到應(yīng)用程序中繼續(xù)執(zhí)行后續(xù)指令。因此,單內(nèi)核模式的內(nèi)核也可粗略的分為三層:調(diào)用效勞的主程序?qū)印?zhí)行系統(tǒng)調(diào)用的效勞層和支持系統(tǒng)調(diào)用的底層函數(shù)。簡單來講一個進程由于執(zhí)行系統(tǒng)調(diào)用而開始執(zhí)行內(nèi)核代碼,那么稱該進程處于內(nèi)核態(tài)中。一個進程執(zhí)行應(yīng)用程序自身代碼那么稱該進程處于用戶態(tài)。7Linux程序驅(qū)動結(jié)構(gòu)以Linux的方式看待設(shè)備可區(qū)分為3種根本設(shè)備類型。每個模塊常常實現(xiàn)3種類型中的1種,因此可分類成字符模塊、塊模塊,或者網(wǎng)絡(luò)模塊。這種將模塊分成不同類型或類別的方法并非是固定不變的,程序員可以選擇建立在一個大塊代碼中實現(xiàn)了不同驅(qū)動的巨大模塊。但是,好的程序員,常常創(chuàng)立一個不同的模塊給每個它們實現(xiàn)的新功能,因為分解是可伸縮性和可擴張性的關(guān)鍵因素。7Linux程序驅(qū)動結(jié)構(gòu)1〕字符設(shè)備一個字符〔char〕設(shè)備是一種可以當(dāng)作一個字節(jié)流來存取的設(shè)備〔如同一個文件〕,一個字符驅(qū)動負責(zé)實現(xiàn)這種行為。2〕塊設(shè)備Linux允許應(yīng)用程序讀寫一個塊設(shè)備像一個字符設(shè)備一樣--它允許一次傳送任意數(shù)目的字節(jié)。區(qū)別:字符設(shè)備〔無緩沖且只能順序存取〕、塊設(shè)備〔有緩沖且可以隨機存取〕8設(shè)備文件與設(shè)備文件系統(tǒng)每個字符設(shè)備和塊設(shè)備都必須有主、次設(shè)備號,主設(shè)備號相同的設(shè)備是同類設(shè)備〔使用同一個驅(qū)動程序〕。這些設(shè)備中,有些設(shè)備是實際存在的物理硬件的抽象,而有些設(shè)備那么是內(nèi)核自身提供的功能〔不依賴于特定的物理硬件,又稱為“虛擬設(shè)備”〕。每個設(shè)備在/dev目錄下都有一個對應(yīng)的文件〔節(jié)點〕。可以通過cat/proc/devices命令查看當(dāng)前已經(jīng)加載的設(shè)備驅(qū)動程序的主設(shè)備號。內(nèi)核能夠識別的所有設(shè)備都記錄在原碼樹下的Documentation/devices.txt文件中8設(shè)備文件與設(shè)備文件系統(tǒng)1〕設(shè)備文件Linux內(nèi)核所能識別的所有設(shè)備都記錄在:///docs/device-list/,而內(nèi)核原碼樹中的Documentation/devices.txt可能不是最新版本。8設(shè)備文件與設(shè)備文件系統(tǒng)2〕設(shè)備文件系統(tǒng)過去的Linux系統(tǒng)中提供了一個抽象化的設(shè)備目錄,叫做/dev。在該目錄中用戶可以找到設(shè)備節(jié)點,這些特殊的文件直接指向了系統(tǒng)中的硬件設(shè)備。例如,/dev/hda指向了系統(tǒng)中的第一個IDE設(shè)備。利用這些提供給用戶的設(shè)備文件,他們可以編寫應(yīng)用程序像訪問普通文件一樣來訪問硬件,而不需要通過特殊的API。9Linux模塊Linux是單內(nèi)核結(jié)構(gòu),也就是說,它是一個大程序,其中任一函數(shù)都可以訪問公共數(shù)據(jù)結(jié)構(gòu)和其它函數(shù)調(diào)用。單核結(jié)構(gòu)在添加新模塊時,一種方法是重新調(diào)整設(shè)置,所以非常費時。比方,你想在內(nèi)核中加一個NCR810SCSI的驅(qū)動程序,你必須重新設(shè)置,重建內(nèi)核。這也有另外一個方法,Linux允許動態(tài)裝載和卸掉模塊。Linux模塊是一段可以在機器起動后任意時間被動態(tài)連接的代碼。在不需要時,它們可以被從內(nèi)核中卸掉。大多數(shù)Linux模塊是設(shè)備驅(qū)動程序或偽設(shè)備驅(qū)動程序,如網(wǎng)絡(luò)驅(qū)動程序,文件系統(tǒng)等??梢允褂胕nsmod和rmmod命令來裝載和卸掉Linux模塊,內(nèi)核自己也可以調(diào)用內(nèi)核駐留程序〔Kerneld〕來按需要裝載和卸掉模塊。10驅(qū)動操作的數(shù)據(jù)結(jié)構(gòu)注冊設(shè)備編號僅僅是驅(qū)動代碼必須進行的諸多任務(wù)中的第一個。首先需要涉及一些驅(qū)動操作,大局部的根底性的驅(qū)動操作包括3個重要的內(nèi)核數(shù)據(jù)結(jié)構(gòu),稱為file_operations,file,和inode,需要對這些結(jié)構(gòu)進行根本了解才能夠做大量感興趣的事情。structfile_operations是一個字符設(shè)備把驅(qū)動的操作和設(shè)備號聯(lián)系在一起的紐帶,是一系列指針的集合,每個被翻開的文件都對應(yīng)于一系列的操作,這就是file_operations,用來執(zhí)行一系列的系統(tǒng)調(diào)用。structfile代表一個翻開的文件,在執(zhí)行file_operation中的open操作時被創(chuàng)立,這里需要注意的是與用戶空間inode指針的區(qū)別,一個在內(nèi)核,而file指針在用戶空間,由c庫來定義。structinode被內(nèi)核用來代表一個文件,注意和structfile的區(qū)別,structinode是代表文件,structfile是代表翻開的文件。structinode包括很重要的二個成員:dev_ti_rdev設(shè)備文件的設(shè)備號;structcdev*i_cdev代表字符設(shè)備的數(shù)據(jù)結(jié)構(gòu)。structinode結(jié)構(gòu)是用來在內(nèi)核內(nèi)部表示文件的。同一個文件可以被翻開好屢次,所以可以對應(yīng)很多structfile,但是只對應(yīng)一個structinode。structfile_operations{}頭文件Linux/fs.h中定義,用來存儲驅(qū)動內(nèi)核模塊提供的對設(shè)備進行各種操作的函數(shù)的指針。該結(jié)構(gòu)體的每個域都對應(yīng)著驅(qū)動內(nèi)核模塊用來處理某個被請求的事務(wù)的函數(shù)的地址。loff_t(*llseek)(structfile*,loff_t,int);llseek方法用作改變文件中的當(dāng)前讀/寫位置,并且新位置作為〔正的〕返回值。loff_t參數(shù)是一個“l(fā)ongoffset”,并且就算在32位平臺上也至少64位寬,錯誤由一個負返回值指示。如果這個函數(shù)指針是NULL,seek調(diào)用會以潛在地?zé)o法預(yù)知的方式修改file結(jié)構(gòu)中的位置計數(shù)器。ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);用來從設(shè)備中獲取數(shù)據(jù)。在這個位置的一個空指針導(dǎo)致read系統(tǒng)調(diào)用以-EINVAL〔"Invalidargument"〕失敗。一個非負返回值代表了成功讀取的字節(jié)數(shù)〔返回值是一個“signedsize”類型,常常是目標(biāo)平臺本地的整數(shù)類型〕。ssize_t(*write)(structfile*,constchar__user*,

溫馨提示

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

評論

0/150

提交評論