時間:2021年07月13日 分類:電子論文 次數:
摘要:本文詳細介紹了基于Linux操作系統中字符設備驅動開發。首先介紹了字符設備驅動開發的相關概念,簡述了驅動程序開發的基本知識和字符設備驅動程序開發的基本流程,重點闡述了Linux內核相關程序結構。為字符設備驅動開發的完整性,舉例說明了字符設備驅動開發的編譯下載和測試等實踐知識。通過本論文能達到掌握字符設備驅動開發的基本能力,進而為復雜設備驅動開發打下基礎。
關鍵詞:Linux;字符設備;驅動程序
任何一個計算機系統的運轉都是系統中軟硬件共同努力的結果,沒有硬件的軟件是空中樓閣,而沒有軟件的硬件則只是一堆廢鐵。計算機系統發現外部設備并與外部設備通信,依靠驅動程序。設備驅動程序運行在內核空間,作為外部設備與應用軟件橋梁。在所有嵌入式操作系統里,嵌入式Linux系統相比于其他的系統,在嵌入式領域有著獨特的優勢。首先是Linux開源免費;然后是Linux的內核體積小且易于模塊化,適應性和可配置性好適合各種平臺,它同時還支持多任務、多用戶;最后是Linux有很多開發論壇,提供豐富開發資料,對開發者而言是強大的技術外援。所以本論文是基于Linux操作系統上開發字符設備驅動程序。
程序設計論文:以OJ系統和學科競賽為核心的程序設計實踐教學
1字符設備驅動程序設計基礎
1.1基本原理
1.1.1創建設備節點。
在Linux操作系統中所有設備都當作文件來處理,每個設備在/dev目錄下都有一個設備文件與之相對應,對設備的打開、讀寫、控制和關閉等所有操作都是通過/dev/目錄下對應的文件進行操作。設備節點有時會自動創建,可是字符設備驅動并不直接負責這一項操作。因此我們在設計字符設備驅動時會需要手動創建節點,使用mknod命令在文件系統上人工創建。除此之外Linux中有一組函數可以用來在/dev目錄下創建設備節點,即class_create()和device_create()。
1.1.2主次設備號。Linux管理的所有設備都有與之對應的目錄,內核通過驅動程序來識別設備。一般來說驅動程序通過主設備號快速匹配外部設備,但同一類設備數量不只一個(或者說一個驅動程序可以同時匹配多個設備),所以必須增加次設備號,它給驅動程序提供了一種能從同一驅動管理下的同類型設備分辨出目標設備的方法。
1.1.3用戶空間和內核空間。嵌入式系統屬于多用戶、多任務操作系統,不能因為某個用戶或某個任務的非法操作造成死機現象,所以用程序運行在用戶空間,而驅動程序則運行在內核空間,內核空間維護計算機系統全局穩定性,驅動程序運行時受到內核程序較多約束,因為在內核中運行任一程序出現問題都會造成計算機系統死機。而應用程序運行較“寬松”。
1.1.4應用程序與硬件設備的訪問。
計算機系統中的應用程序通過運行在內核空間的驅動程序來訪問計算機外部設備。應用程序按照其中的流程對硬件設備進行訪問。首先是應用程序調用操作系統提供的系統函數,從而訪問內核空間,然后內核空間的結構file_operations來實現驅動程序中的相關 函數,從而實現對設備的訪問。
1.2重要結構
file_operations要實現用戶空間對內核空間的調用,必須依賴Linux操作系統內核中一個非常重要的數據結構:file_operations。此結構存放在內核include/linux/fs.h文件中,所以用到此結構的代碼都應包含此頭文件#include 。file_operations結構如下:Linux使用file_operations訪問驅動中的函數時,file_operations中存儲著對設備進行各種操作的函數指針f_ops,file_operations中每一個成員名都對應一個調用函數,如:file_open()、file_allocate()、file_read()、file_write()、file_ioctl()、file_close()等。比如在對系統進行數據存取的時候,系統通過設備的設備號來找到驅動,然后讀取驅動,開始執行函數。例如:應用程序要對某個外部設備進行如open操作時,這時匹配該外部設備的驅動程序就會執行對應的fopen函數。
2字符設備驅動程序開發
字符設備驅動程序開發涉及到知識點較多,開發起來顯得有點復雜。但規律可循,總結如下流程:第一步:編寫驅動程序文件準備工作(定義設備名稱、定義主次設備號)、設備注冊、定義結構體file_operations、實現結構體內的功能函數、設備注銷等。具體下來有以下工作:a.初始化外部設備的相關寄存器。包括定時寄存器、中斷寄存器、串口寄存器;b.初始化硬件設備參數;c.注冊設備。通過主次設備號與次設備號將驅動程序與設備關聯起來,內核會調用函數register_chrdev來注冊匹配的外部設備;d.注冊外部設備中斷函數。內核會調用函數request_irq()來注冊匹配的外部設備的中斷函數。
第二步:驅動程序放進Linux內核將編輯好驅動程序源文件和頭文件放置內核相對應的文件下./kernel/drivers/char,同時修改Linux內核配置文件***.config,在使用makemenuconfig命令時在配置頁面里出現相應的配置選項,使用空格鍵選中,保存后退出,再使用預安裝好的交叉編譯工具鏈進行交叉編譯。需要說明的,設備驅動程序編譯有兩種方法,一種是編譯進內核,另一種是編譯成模塊。一般來說,調試階段編譯成模塊形式,驅動程序穩定后,編譯進內核。
3字符設備驅動程序舉例
在Linux環境下,以鍵盤驅動程序為例進行說明。硬件基本情況是:S3C2410+HD7279(鍵盤數碼管模塊)。
3.1編寫鍵盤驅動程序
a.編寫file_operations結構。structfile_operationsKey_Board_7279={open:Key_Board_7279_Open,//打開設備文件ioctl:Key_Board_7279_Ioctl,//設備文件其他操作release:Key_Board_7279_Close,//關閉設備文件};b.編寫Key_Board_7279_Open/。Key_Board_7279_Close/Key_Board_7279_Ioctl函數。打開/關閉函數為NULL,Key_Board_7279_Ioctl函數實現獲取鍵值c.鍵盤服務子程序。staticvoidKey_Board_7279_ISR(intirq,void*dev_id,structpt_regs*regs){disable_irq(33);//使用33號中斷key_number=Read_Key_Board_7279(cmd_read);//中斷方式讀取鍵值...}d.初始化鍵盤硬件函數。
voidSetup_Key_Board_7279(void)e.注冊鍵盤設備,調用初始化函數。int__initKey_Board_7279_Init(void){register_chrdev(...)//注冊設備Setup_Key_Board_7279(...)//調用硬件初始化函數request_irq(...)//注冊中斷}f.卸載鍵盤設備。void__exitKey_Board_7279_Exit(void)3.2測試鍵盤驅動程序設備驅動編譯后,接著編寫測試程序kbd.c用來檢測驅動程序的效果。fd=open("/dev/Kbd7279",0)
結束語
本論文講述了字符設備驅動的基本原理及編寫字符設備驅動程序的方法。基于S3C2410+HD7279平臺上,演示了鍵盤字符設備驅動程序開發并進行了驗證。本文可認為是字符設備驅動開發范例,為初學字符設備驅動開發提供參考。
參考文獻
[1]周立功.單片機實驗與實踐[M].北京:北京航空航天大學出版社.
[2]陸亞民.單片機原理及應用[M].北京:輕工業出版社.
[3]Corbet,Rubini&Kroah-Hartman著,魏永明等譯.《LinuxDevice設備驅動程序第三版》[M].北京:中國電力出版社,2006.
[4]RobertLove著,陳莉君譯.Linux內核設計與實現第二版[M].北京:機械工業出版社,2006.
[5]JeanJ.Labrosse著,邵貝貝譯《嵌入.式實時操作系統μC/OS-Ⅱ(第2版)》[M].北京:北京航空航天大學出版社,2005.
[6]倪繼利.Linux內核分析及編程[M].北京:電子工業出版社,2005.
[7]EL-arm-830+型教學實驗系統[M].北京:北京精儀達盛科技有限公司.
作者:占華林徐濤濤陳亮亮于子正李明鑫