嵌入式設(shè)備驅(qū)動程序開發(fā)簡介_第1頁
嵌入式設(shè)備驅(qū)動程序開發(fā)簡介_第2頁
嵌入式設(shè)備驅(qū)動程序開發(fā)簡介_第3頁
全文預覽已結(jié)束

下載本文檔

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

文檔簡介

1、嵌入式設(shè)備驅(qū)動程序開發(fā)簡介馬海萍寧夏大學數(shù)學計算機學院 計算機系 軟件工程專業(yè)摘要: 嵌入式設(shè)備隨著電子計算機科技的發(fā)展已經(jīng)越來越普遍并且越來越受歡 迎。計算機軟件和集成電路技術(shù)的發(fā)展, 為嵌入式產(chǎn)業(yè)帶來了巨大的機遇和挑戰(zhàn), Linux 以其穩(wěn)定、高效、易定制、硬件廣泛支持等特點,迅速崛起為當今計算機 領(lǐng)域的一匹黑馬。 文章簡述驅(qū)動程序的開發(fā)過程與基本原理, 從設(shè)備驅(qū)動的體系 結(jié)構(gòu)和內(nèi)核環(huán)境兩方面入手, 對嵌入式 Linux 設(shè)備驅(qū)動程序的開發(fā)原理進行剖析 和闡述。關(guān)鍵詞 : Linux ;嵌入式系統(tǒng);設(shè)備驅(qū)動;程序開發(fā);0 引 言設(shè)備驅(qū)動程序在 Linux 內(nèi)核中占有極其重要的位置, 它是內(nèi)

2、核用于完成對物理設(shè)備的控 制操作的功能模塊。除了 CPU、內(nèi)存以及其他很少的幾個部分以外,所有的設(shè)備控制操作 都必須由與被控設(shè)備相關(guān)代碼驅(qū)動程序來完成。否則設(shè)備就無法在 Linux 下正常工作, 這就是驅(qū)動程序開發(fā)成為 Linux 內(nèi)核開發(fā)的主要工作的原因。然而,在嵌入式 Linux 系統(tǒng)中,內(nèi)核提供保護機制,用戶空間的進程一般不能直接訪 問硬件。 進行嵌入式系統(tǒng)的開發(fā), 很大的工作量是為各種設(shè)備編寫驅(qū)動程序, Linux 設(shè)備驅(qū) 動程序在 Linux 內(nèi)核源代碼中占有 60%以上,從 2.0、 2.2 到 2.4 版本的內(nèi)核,源代碼的長 度日益增加,其實主要是設(shè)備驅(qū)動程序在增加。1、Linu

3、x 下設(shè)備驅(qū)動程序簡介1.1 設(shè)備驅(qū)動程序的概念Linux 設(shè)備驅(qū)動程序是為了特定的硬件提供給用戶程序的一組標準化接口, 它隱藏了設(shè)備工作的細節(jié)。 在應(yīng)用程序看來, 硬件設(shè)備只是一個設(shè)備文件, 應(yīng)用 程序可以像操作普通未見一樣對硬件設(shè)備進行操作。系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口; 設(shè)備驅(qū)動程序是操作系統(tǒng) 內(nèi)核和機器硬件之間的接口; Linux 設(shè)備驅(qū)動的特點是可以以模塊的形式加載各 種設(shè)備類型 ,先安裝再使用;因為嵌入式設(shè)備往往具有大量的獨有外設(shè),開發(fā) 人員需要把很多精力放在設(shè)備驅(qū)動方面。1.2 設(shè)備驅(qū)動程序的功能及特點設(shè)備驅(qū)動程序完成的功能有: 對設(shè)備的初始化和釋放; 把數(shù)據(jù)從內(nèi)核

4、傳送到 硬件和從硬件讀取數(shù)據(jù); 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請 求的數(shù)據(jù);檢測和處理設(shè)備出現(xiàn)的錯誤。Linux 設(shè)備驅(qū)動程序的特點:設(shè)備驅(qū)動是內(nèi)核的一部分,影響內(nèi)核穩(wěn)定;為 內(nèi)核或其從屬子系統(tǒng)提供一個標準接口; 使用標準的內(nèi)核服務(wù)如內(nèi)存分配、 中斷 和等待隊列等;大多數(shù) Linux 設(shè)備驅(qū)動可以動態(tài)可加載; Linux 設(shè)備驅(qū)動程序可 配置;驅(qū)動程序維護其控制的設(shè)備, 該設(shè)備即使不存在也不影響系統(tǒng)的運行, 此 時設(shè)備驅(qū)動只是占用少量系統(tǒng)內(nèi)存,不會對系統(tǒng)造成什么危害。1.3 設(shè)備驅(qū)動程序的分類Linux系統(tǒng)的設(shè)備分為字符設(shè)備(char device)、塊設(shè)備(lock devi

5、ce)和網(wǎng) 絡(luò)設(shè)備(network device)三種。字符設(shè)備是指存取時沒有緩存的設(shè)備,因此咋 idui 字符設(shè)備發(fā)出讀 /寫請求 時,實際的硬件I/O 般就緊接著發(fā)生了。字符設(shè)備是 Linux設(shè)備中最簡單的一 種,應(yīng)用程序可以用與存取文件相同的系統(tǒng)調(diào)用來打開、 讀寫機關(guān)閉它。 典型的 字符設(shè)備包括鼠標、觸摸屏、串行口等。塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機存取(randomaccess,是指那些在輸入輸出時數(shù)據(jù)處理以塊為單位的設(shè)備,采用了緩沖技術(shù), 支持數(shù)據(jù)的隨機讀寫, 系統(tǒng)可以通過它們的設(shè)備做特殊文件訪問, 但是更常見的 是通過文件系統(tǒng)訪問。典型的塊設(shè)備包括硬盤和光盤等。網(wǎng)

6、絡(luò)設(shè)備在 Linux 里做了專門的處理, Linux 的網(wǎng)絡(luò)系統(tǒng)主要是基于 BSD UNIX 的 socket機制。2、設(shè) 備驅(qū)動程序結(jié)構(gòu)Linux 的設(shè)備驅(qū)動程序與外界的接口可以分成三部分:與操作系統(tǒng)內(nèi)核的接 口,通過 file_operations 數(shù)據(jù)結(jié)構(gòu)實現(xiàn);與系統(tǒng)引導的接口,利用驅(qū)動程序?qū)υO(shè) 備進行初始化;與設(shè)備的接口,描述驅(qū)動程序如何與設(shè)備交互。Linux 設(shè)備驅(qū)動程序的代碼結(jié)構(gòu)大致可以分 為如下幾個部分:通過 modulenit()和module_exit()函數(shù)指定模塊驅(qū)動程序初始化及退出的處理函數(shù); 驅(qū)動程序的注冊與注銷、 設(shè)備的打開與釋放、 設(shè)備的讀寫操作、 設(shè)備的控制操作

7、、 設(shè)備的中斷和輪詢處理。3、設(shè)備驅(qū)動程序與內(nèi)核的接口Linux 維護一個設(shè)備驅(qū)動程序的表,并把它作為與驅(qū)動程序接口的一部分。 這些表包 括支持 該類設(shè)備接 口的例 程和其 它信息 。每個驅(qū)動 程序都 有一個 file_operations 的數(shù)據(jù)結(jié)構(gòu),包含了一系列的函數(shù)指針,可以指向自己所開發(fā)的 接口,如open等。file-operations的數(shù)據(jù)結(jié)構(gòu)在/linux/fs.h中定義。在該結(jié)構(gòu)中操 作系統(tǒng)為用戶進程提供了 16種接口,每一種接口定義一種服務(wù)類型。幾種常用的接口: seek移動文件指針的位置。只能用于可以隨機存取的設(shè)備。 read:進行讀操作。參數(shù)char為存放讀取結(jié)果的緩沖

8、區(qū),size_t為所要讀 取的數(shù)據(jù)長度, 返回值為負表示讀取操作發(fā)生錯誤, 否則返回實際讀取的字, lofft 表示讀取的相對位置。 write:進行寫操作與read類似。 readdir:取得下一個目錄的入口點。只有與文件系統(tǒng)相關(guān)的設(shè)備驅(qū)動程序 才使用。 poll:進行選擇操作。如果驅(qū)動程序沒有提供 select入口,select操作將會 認為設(shè)備已經(jīng)準備好進行任何的 I/O 操作。 ioctl:進行讀寫以外的其他操作,比如對硬件進行設(shè)置,對設(shè)備的相關(guān)參數(shù) 進行設(shè)置等。參數(shù) cmd 為自定義的命令, arg 為要進行設(shè)置的值,也可以通過該 函數(shù)取得設(shè)備的相關(guān)參數(shù)。 mmap用于把設(shè)備的內(nèi)容映

9、射到地址空間。一般只有塊設(shè)備驅(qū)動程序使 用。 open:打開設(shè)備,準備進行I/O操作。返回0表示打開成功,返回負數(shù)表 示失敗。如果驅(qū)動程序沒有提供open入口,則只要/dev/driver文件存在就認為打 開成功。 release即lose與open相反,釋放設(shè)備及其使用的資源。4、模塊化驅(qū)動程序設(shè)計思想及流程4.1 模塊化設(shè)計思想模塊是指整個系統(tǒng)中一些相對獨立的程序單元, 每個程序單元完成和實現(xiàn)一 個相對獨立的軟件功能。 Linux 的內(nèi)核是一個整體式內(nèi)核, 如果想添加一個硬件, 就需要重新編譯內(nèi)核; 如果去掉一個硬件, 那么這個硬件已經(jīng)編譯進內(nèi)核的驅(qū)動 程序就是浪費。Linux 內(nèi)核用模塊

10、來解決這個問題,模塊是內(nèi)核的一部分,而且都是設(shè)備驅(qū) 動程序,但他們并沒有被編譯到內(nèi)核中, 而是被分別編譯并鏈接成一組目標文件。 這些文件能被載入正在運行的內(nèi)核, 或從正在運行的內(nèi)核中卸載, 必要時內(nèi)核能 請求內(nèi)核守護進程 Kernel 對模塊進行加載或卸載。根據(jù)需要動態(tài)載入模塊可以 保證內(nèi)核達到最小, 并且具有很大的靈活性。 內(nèi)核模塊一部分保存在 Kernel 中, 另一部分在 Modules 包中。4.2 設(shè)備驅(qū)動程序開發(fā)的步驟 定義主、次設(shè)備號,也可以動態(tài)獲取; 實現(xiàn)驅(qū)動初始化和清除函數(shù), 如果驅(qū)動程序采用模塊方式, 則要實現(xiàn)模塊 初始化和清除函數(shù); 設(shè)計所要實現(xiàn)的文件操作,定義 file

11、_operatio ns 結(jié)構(gòu); 實現(xiàn)所需的文件操作調(diào)用,如 read,write等; 實現(xiàn)中斷服務(wù)函數(shù),并用request_irq向內(nèi)核注冊; 將驅(qū)動編譯到內(nèi)核或 編譯成模塊,用 insmod 命令加載; 生成設(shè)備節(jié)點文件。 與普通文件相比,設(shè)備文件的操作要復雜的多,不可能簡單地通過 read ,write等命令來實現(xiàn)。所有的其他類型的操作都可以通過 VFS的ioctl命令調(diào)用 來執(zhí)行,為此只需要在驅(qū)動程序中實現(xiàn) ioctl ,并在其中添加相應(yīng)的 case 選項 即可。5、結(jié)束語隨著個人數(shù)字助理(PDA、瘦客戶機的普及,嵌入式終端在我們的生活中 使用得越來越普遍。 文章總結(jié)了在 linux 下開發(fā)驅(qū)動程序的主要思想, 對嵌入式 系統(tǒng)具有典型意義。參考文獻:1 :楊偉,劉強,顧新丄inux下USB設(shè)備驅(qū)動研究與開發(fā)J.計算機工程, 2006, 32( 19):

溫馨提示

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

評論

0/150

提交評論