為多功能片上系統(tǒng)處理器編寫 Linux 設備驅動程序
——
引 言
編寫 Linux 設備驅動程序無疑是一項復雜的工作。本文將集中介紹非標準硬件的設備驅動程序編寫,探討硬件應用編程接口,并借用 Cirrus Logic EP9312 片上系統(tǒng)嵌入式平臺添加設備驅動程序這一案例來進行分析。
如果有些編程內容未能在本文中涉及,那么讀者亦可以查閱相似的設備驅動程序編碼,以做參考。還有一種方法,就是檢索歷史檔案或者向 Linux 內核問訊中心去函問訊。
Linux 概述
Linux 是 UNIX 操作系統(tǒng)的翻版,1991 年由 Linus Torvalds 最先開發(fā)出來,并通過開放源代碼開發(fā)模式不斷得到開放源代碼組織的改進。任何使用 Linux 的個人和團體都無需支付任何版權費用。
編寫 Linux 設備驅動程序無疑是一項復雜的工作。本文將集中介紹非標準硬件的設備驅動程序編寫,探討硬件應用編程接口,并借用 Cirrus Logic EP9312 片上系統(tǒng)嵌入式平臺添加設備驅動程序這一案例來進行分析。
如果有些編程內容未能在本文中涉及,那么讀者亦可以查閱相似的設備驅動程序編碼,以做參考。還有一種方法,就是檢索歷史檔案或者向 Linux 內核問訊中心去函問訊。
Linux 概述
Linux 是 UNIX 操作系統(tǒng)的翻版,1991 年由 Linus Torvalds 最先開發(fā)出來,并通過開放源代碼開發(fā)模式不斷得到開放源代碼組織的改進。任何使用 Linux 的個人和團體都無需支付任何版權費用。
只有內核還不夠,通常Linux 與一些在內核上運行的視窗環(huán)境、視窗管理器和應用捆綁在一起。然而,由于具備了嵌入式平臺,視窗環(huán)境并非必不可少。與微軟的視窗操作系統(tǒng)不同的是,Linux 并不需要一套固定的、必須采用的應用軟件或實用程序,因此能夠十分符合嵌入式市場終端解決方案的客制化要求。
操作系統(tǒng)最基本的組成部分包括 1個資源管理器、1個調度程序、1個介于硬件和應用軟件之間的接口、1個網絡管理器和 1 個文檔系統(tǒng)管理器。Linux操作系統(tǒng)也包括這些組成部分,當然還有其他部分。本文主要闡述介于硬件和應用軟件之間的接口--設備驅動程序。
圖1解釋了用戶應用軟件、操作系統(tǒng)內核和硬件平臺之間的區(qū)別。
設備驅動程序類型
設備驅動程序可分為2大類:硬件設備驅動程序和軟件設備驅動程序。硬件設備驅動程序和物理硬件設備相連接,如UART設備或IDE設備,而軟件設備驅動程序則作為低級數據結構間的接口,或硬件設備驅動程序和高級數據結構間的接口。圖形控制臺驅動程序就是一個軟件設備驅動程序。其中,1個LCD控制器驅動程序裝載并管理該顯示器,同時圖形控制臺對即將顯示的字符進行著色,并獲取從鍵盤輸入的信息。軟件設備驅動程序的另一個例子是文檔系統(tǒng)執(zhí)行--文檔系統(tǒng)驅動程序采用1個硬盤驅動程序存儲數據,而該硬盤驅動程序直接與物理硬盤相連接。
設備驅動程序的分類
Linux 設備驅動程序有幾類:字符、區(qū)塊、網絡和其他。通常,驅動程序根據設備的訪問方式分類。然而,也有些設備無法按照此類方式得到區(qū)分,因此被歸到"其他類型"。字符設備包括那些使數據成為數據流的設備,可通過1個文檔系統(tǒng)的特殊文件獲得(文檔系統(tǒng)的特殊文件將在后文中加以討論)。鑒于字符設備的特性,該設備只能根據順序訪問數據,即無法往前或往后搜索數據。串行端口和音頻設備都是這種類型。圖2是Cirrus Logic的EP9312 片上系統(tǒng)結構圖,其中Linux字符設備以綠色標出。
區(qū)塊設備能夠照管1個文檔系統(tǒng)。該類設備和字符設備一樣,也是通過文檔系統(tǒng)特殊文件訪問。但是,區(qū)塊設備與文檔設備的差異在于其可被隨機訪問。這意味著,應用軟件可查找在該設備中的隨機位置。硬盤驅動器和CD驅動器都是區(qū)塊設備,它們內部的文件指針可以指向設備內部的任何位置,惟一的限制來自設備本身。當區(qū)塊設備通過文檔系統(tǒng)特殊文件訪問時,該應用接口即同字符設備一樣,只是與內核的接口有所差別而已。圖2中的紅色部分即為Cirrus Logic EP9312 片上系統(tǒng)結構中Linux區(qū)塊設備。
網絡接口設備既可以是硬件設備,也可以是軟件設備。硬件設備如以太網卡,軟件設備如低端網絡協(xié)議堆棧(本文將此類接口視為軟件設備)。中間件和協(xié)議堆棧有時會被看作是軟件設備。網絡接口設備是信息包數據的通信設備,一般擁有惟一名稱,并且無法通過文檔系統(tǒng)特殊文件訪問。相反,它們只對內核網絡堆棧開放。通常,用戶級應用軟件可訪問內核網絡堆棧,而不能訪問網絡接口設備。圖2中的藍色部分即為Cirrus Logic EP9312 片上系統(tǒng)結構中的Linux網絡接口設備。
其他的設備驅動程序還包括數據總線驅動程序(USB, I2C, AMBA等)、 /proc 接口和視頻驅動程序。這些類型的設備無法被歸入以上的3個類型中,但仍然是與Linux內核接口的設備驅動程序。
文檔系統(tǒng)特殊文件
文檔系統(tǒng)特殊文件提供了從文檔系統(tǒng)訪問硬件設備的可行性。這些訪問點使用mknod 命令在文檔系統(tǒng)/dev 目錄中生成。命令如下:
mknod <device name> <device type> <major number> <minor number>
其中, <device name> 是給予硬件設備的名稱,如 /dev/hda1 是給予硬盤驅動器的通用名稱。<device type> 是設備驅動程序的類型--字符(char)、區(qū)塊等。<major number> 代表設備類別和與之相配的驅動程序。<minor number> 表示設備類別中的一個實例,并僅對設備驅動程序適用。例如,某個系統(tǒng)中同時采用2個硬盤驅動器,它們都具有同樣的主要編號,使用同樣的設備驅動軟件,但是該設備驅動程序軟件卻會在內部根據次要編號區(qū)分這2個硬盤驅動器。
值得注意的是,并非所有的設備都執(zhí)行特殊文件接口。如同本文前面已經提及的,網絡設備驅動程序就不采用這種接口訪問設備。
這種情況下,在設備文檔系統(tǒng)里,就會使用 devfs來獲得文檔設備特殊文件。devfs 目前廣受歡迎,但仍然還不是內核的默認功能。如果采用devfs 文檔系統(tǒng),那么就無需mknod 來生成特殊文件了。相反,設備驅動程序軟件會使用直接的devfs 文檔系統(tǒng)接口在空閑時刻或者設備剛被初始化時生成特殊文件。
編程實例概述
為便于示范非標準嵌入式平臺的Linux設備驅動程序,本文將說明EP9312的設備驅動程序實現情況。其中,EP9312 IDE設備驅動程序是區(qū)塊設備, EP9312觸摸屏為字符設備,代碼中的高級API/硬件接口、初始化序列和應用軟件編碼均將予以說明。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
其他的設備驅動程序還包括數據總線驅動程序(USB, I2C, AMBA等)、 /proc 接口和視頻驅動程序。這些類型的設備無法被歸入以上的3個類型中,但仍然是與Linux內核接口的設備驅動程序。
文檔系統(tǒng)特殊文件
文檔系統(tǒng)特殊文件提供了從文檔系統(tǒng)訪問硬件設備的可行性。這些訪問點使用mknod 命令在文檔系統(tǒng)/dev 目錄中生成。命令如下:
mknod <device name> <device type> <major number> <minor number>
其中, <device name> 是給予硬件設備的名稱,如 /dev/hda1 是給予硬盤驅動器的通用名稱。<device type> 是設備驅動程序的類型--字符(char)、區(qū)塊等。<major number> 代表設備類別和與之相配的驅動程序。<minor number> 表示設備類別中的一個實例,并僅對設備驅動程序適用。例如,某個系統(tǒng)中同時采用2個硬盤驅動器,它們都具有同樣的主要編號,使用同樣的設備驅動軟件,但是該設備驅動程序軟件卻會在內部根據次要編號區(qū)分這2個硬盤驅動器。
值得注意的是,并非所有的設備都執(zhí)行特殊文件接口。如同本文前面已經提及的,網絡設備驅動程序就不采用這種接口訪問設備。
這種情況下,在設備文檔系統(tǒng)里,就會使用 devfs來獲得文檔設備特殊文件。devfs 目前廣受歡迎,但仍然還不是內核的默認功能。如果采用devfs 文檔系統(tǒng),那么就無需mknod 來生成特殊文件了。相反,設備驅動程序軟件會使用直接的devfs 文檔系統(tǒng)接口在空閑時刻或者設備剛被初始化時生成特殊文件。
編程實例概述
為便于示范非標準嵌入式平臺的Linux設備驅動程序,本文將說明EP9312的設備驅動程序實現情況。其中,EP9312 IDE設備驅動程序是區(qū)塊設備, EP9312觸摸屏為字符設備,代碼中的高級API/硬件接口、初始化序列和應用軟件編碼均將予以說明。
評論