新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 為多功能片上系統(tǒng)處理器編寫 Linux 設(shè)備驅(qū)動(dòng)程序

為多功能片上系統(tǒng)處理器編寫 Linux 設(shè)備驅(qū)動(dòng)程序

——
作者:Tanya Ortega,Cirrus Logic公司系統(tǒng)軟件工程師 時(shí)間:2005-09-04 來源:EDN電子設(shè)計(jì)技術(shù) 收藏
為多功能片上系統(tǒng)處理器編寫
 引 言
  編寫 無疑是一項(xiàng)復(fù)雜的工作。本文將集中介紹非標(biāo)準(zhǔn)硬件的編寫,探討硬件應(yīng)用編程接口,并借用 Cirrus Logic EP9312 片上系統(tǒng)嵌入式平臺(tái)添加設(shè)備驅(qū)動(dòng)程序這一案例來進(jìn)行分析。
  如果有些編程內(nèi)容未能在本文中涉及,那么讀者亦可以查閱相似的設(shè)備驅(qū)動(dòng)程序編碼,以做參考。還有一種方法,就是檢索歷史檔案或者向 內(nèi)核問訊中心去函問訊。
  Linux 概述
  Linux 是 UNIX 操作系統(tǒng)的翻版,1991 年由 Linus Torvalds 最先開發(fā)出來,并通過開放源代碼開發(fā)模式不斷得到開放源代碼組織的改進(jìn)。任何使用 Linux 的個(gè)人和團(tuán)體都無需支付任何版權(quán)費(fèi)用。

本文引用地址:http://butianyuan.cn/article/8240.htm


  只有內(nèi)核還不夠,通常Linux 與一些在內(nèi)核上運(yùn)行的視窗環(huán)境、視窗管理器和應(yīng)用捆綁在一起。然而,由于具備了嵌入式平臺(tái),視窗環(huán)境并非必不可少。與微軟的視窗操作系統(tǒng)不同的是,Linux 并不需要一套固定的、必須采用的應(yīng)用軟件或?qū)嵱贸绦?,因此能夠十分符合嵌入式市場終端解決方案的客制化要求。
  操作系統(tǒng)最基本的組成部分包括 1個(gè)資源管理器、1個(gè)調(diào)度程序、1個(gè)介于硬件和應(yīng)用軟件之間的接口、1個(gè)網(wǎng)絡(luò)管理器和 1 個(gè)文檔系統(tǒng)管理器。Linux操作系統(tǒng)也包括這些組成部分,當(dāng)然還有其他部分。本文主要闡述介于硬件和應(yīng)用軟件之間的接口--設(shè)備驅(qū)動(dòng)程序。
  圖1解釋了用戶應(yīng)用軟件、操作系統(tǒng)內(nèi)核和硬件平臺(tái)之間的區(qū)別。
  設(shè)備驅(qū)動(dòng)程序類型
  設(shè)備驅(qū)動(dòng)程序可分為2大類:硬件設(shè)備驅(qū)動(dòng)程序和軟件設(shè)備驅(qū)動(dòng)程序。硬件設(shè)備驅(qū)動(dòng)程序和物理硬件設(shè)備相連接,如UART設(shè)備或IDE設(shè)備,而軟件設(shè)備驅(qū)動(dòng)程序則作為低級(jí)數(shù)據(jù)結(jié)構(gòu)間的接口,或硬件設(shè)備驅(qū)動(dòng)程序和高級(jí)數(shù)據(jù)結(jié)構(gòu)間的接口。圖形控制臺(tái)驅(qū)動(dòng)程序就是一個(gè)軟件設(shè)備驅(qū)動(dòng)程序。其中,1個(gè)LCD控制器驅(qū)動(dòng)程序裝載并管理該顯示器,同時(shí)圖形控制臺(tái)對(duì)即將顯示的字符進(jìn)行著色,并獲取從鍵盤輸入的信息。軟件設(shè)備驅(qū)動(dòng)程序的另一個(gè)例子是文檔系統(tǒng)執(zhí)行--文檔系統(tǒng)驅(qū)動(dòng)程序采用1個(gè)硬盤驅(qū)動(dòng)程序存儲(chǔ)數(shù)據(jù),而該硬盤驅(qū)動(dòng)程序直接與物理硬盤相連接。
  設(shè)備驅(qū)動(dòng)程序的分類
  Linux 設(shè)備驅(qū)動(dòng)程序有幾類:字符、區(qū)塊、網(wǎng)絡(luò)和其他。通常,驅(qū)動(dòng)程序根據(jù)設(shè)備的訪問方式分類。然而,也有些設(shè)備無法按照此類方式得到區(qū)分,因此被歸到"其他類型"。字符設(shè)備包括那些使數(shù)據(jù)成為數(shù)據(jù)流的設(shè)備,可通過1個(gè)文檔系統(tǒng)的特殊文件獲得(文檔系統(tǒng)的特殊文件將在后文中加以討論)。鑒于字符設(shè)備的特性,該設(shè)備只能根據(jù)順序訪問數(shù)據(jù),即無法往前或往后搜索數(shù)據(jù)。串行端口和音頻設(shè)備都是這種類型。圖2是Cirrus Logic的EP9312 片上系統(tǒng)結(jié)構(gòu)圖,其中Linux字符設(shè)備以綠色標(biāo)出。
  區(qū)塊設(shè)備能夠照管1個(gè)文檔系統(tǒng)。該類設(shè)備和字符設(shè)備一樣,也是通過文檔系統(tǒng)特殊文件訪問。但是,區(qū)塊設(shè)備與文檔設(shè)備的差異在于其可被隨機(jī)訪問。這意味著,應(yīng)用軟件可查找在該設(shè)備中的隨機(jī)位置。硬盤驅(qū)動(dòng)器和CD驅(qū)動(dòng)器都是區(qū)塊設(shè)備,它們內(nèi)部的文件指針可以指向設(shè)備內(nèi)部的任何位置,惟一的限制來自設(shè)備本身。當(dāng)區(qū)塊設(shè)備通過文檔系統(tǒng)特殊文件訪問時(shí),該應(yīng)用接口即同字符設(shè)備一樣,只是與內(nèi)核的接口有所差別而已。圖2中的紅色部分即為Cirrus Logic EP9312 片上系統(tǒng)結(jié)構(gòu)中Linux區(qū)塊設(shè)備。

  網(wǎng)絡(luò)接口設(shè)備既可以是硬件設(shè)備,也可以是軟件設(shè)備。硬件設(shè)備如以太網(wǎng)卡,軟件設(shè)備如低端網(wǎng)絡(luò)協(xié)議堆棧(本文將此類接口視為軟件設(shè)備)。中間件和協(xié)議堆棧有時(shí)會(huì)被看作是軟件設(shè)備。網(wǎng)絡(luò)接口設(shè)備是信息包數(shù)據(jù)的通信設(shè)備,一般擁有惟一名稱,并且無法通過文檔系統(tǒng)特殊文件訪問。相反,它們只對(duì)內(nèi)核網(wǎng)絡(luò)堆棧開放。通常,用戶級(jí)應(yīng)用軟件可訪問內(nèi)核網(wǎng)絡(luò)堆棧,而不能訪問網(wǎng)絡(luò)接口設(shè)備。圖2中的藍(lán)色部分即為Cirrus Logic EP9312 片上系統(tǒng)結(jié)構(gòu)中的Linux網(wǎng)絡(luò)接口設(shè)備。
  其他的設(shè)備驅(qū)動(dòng)程序還包括數(shù)據(jù)總線驅(qū)動(dòng)程序(USB, I2C, AMBA等)、 /proc 接口和視頻驅(qū)動(dòng)程序。這些類型的設(shè)備無法被歸入以上的3個(gè)類型中,但仍然是與Linux內(nèi)核接口的設(shè)備驅(qū)動(dòng)程序。
  文檔系統(tǒng)特殊文件
  文檔系統(tǒng)特殊文件提供了從文檔系統(tǒng)訪問硬件設(shè)備的可行性。這些訪問點(diǎn)使用mknod 命令在文檔系統(tǒng)/dev 目錄中生成。命令如下:
  mknod <device name> <device type> <major number> <minor number>
  其中, <device name> 是給予硬件設(shè)備的名稱,如 /dev/hda1 是給予硬盤驅(qū)動(dòng)器的通用名稱。<device type> 是設(shè)備驅(qū)動(dòng)程序的類型--字符(char)、區(qū)塊等。<major number> 代表設(shè)備類別和與之相配的驅(qū)動(dòng)程序。<minor number> 表示設(shè)備類別中的一個(gè)實(shí)例,并僅對(duì)設(shè)備驅(qū)動(dòng)程序適用。例如,某個(gè)系統(tǒng)中同時(shí)采用2個(gè)硬盤驅(qū)動(dòng)器,它們都具有同樣的主要編號(hào),使用同樣的設(shè)備驅(qū)動(dòng)軟件,但是該設(shè)備驅(qū)動(dòng)程序軟件卻會(huì)在內(nèi)部根據(jù)次要編號(hào)區(qū)分這2個(gè)硬盤驅(qū)動(dòng)器。
  值得注意的是,并非所有的設(shè)備都執(zhí)行特殊文件接口。如同本文前面已經(jīng)提及的,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序就不采用這種接口訪問設(shè)備。
        這種情況下,在設(shè)備文檔系統(tǒng)里,就會(huì)使用 devfs來獲得文檔設(shè)備特殊文件。devfs 目前廣受歡迎,但仍然還不是內(nèi)核的默認(rèn)功能。如果采用devfs 文檔系統(tǒng),那么就無需mknod 來生成特殊文件了。相反,設(shè)備驅(qū)動(dòng)程序軟件會(huì)使用直接的devfs 文檔系統(tǒng)接口在空閑時(shí)刻或者設(shè)備剛被初始化時(shí)生成特殊文件。
  編程實(shí)例概述
  為便于示范非標(biāo)準(zhǔn)嵌入式平臺(tái)的Linux設(shè)備驅(qū)動(dòng)程序,本文將說明EP9312的設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)情況。其中,EP9312 IDE設(shè)備驅(qū)動(dòng)程序是區(qū)塊設(shè)備, EP9312觸摸屏為字符設(shè)備,代碼中的高級(jí)API/硬件接口、初始化序列和應(yīng)用軟件編碼均將予以說明。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉