1.設(shè)備驅(qū)動的作用
對設(shè)備驅(qū)動最通俗的解釋就是“驅(qū)使硬件設(shè)備行動”。驅(qū)動與底層硬件直接打交道,按照硬件設(shè)備的具體工作方式,讀寫設(shè)備的寄存器,完成設(shè)備的輪詢、中斷處理、DMA通信,進行物理內(nèi)存向虛擬內(nèi)存的映射等,最終讓通信設(shè)備能收發(fā)數(shù)據(jù),讓顯示設(shè)備能顯示文字和畫面,讓存儲設(shè)備能記錄文件和數(shù)據(jù)。
由此可見,設(shè)備驅(qū)動充當了硬件和應(yīng)用軟件之間的紐帶,應(yīng)用軟件時只需要調(diào)用系統(tǒng)軟件的應(yīng)用編程 接口(API)就可讓硬件去完成要求的工作。在系統(tǒng)沒有操作系統(tǒng)的情況下,工程師可以根據(jù)硬件設(shè)備的特點自行定義接口,如對串口定義SerialSend()、SerialRecv(),對LED定義LightOn()、 LightOff(),對Flash定義FlashWr()、FlashRd()等。
而在有操作系統(tǒng)的情況下,驅(qū)動的架構(gòu)則由相應(yīng)的操作系統(tǒng)定義,驅(qū)動工程師必須按照相應(yīng)的架構(gòu)設(shè)計驅(qū)動,這樣,驅(qū)動才能良好地整合入操作系統(tǒng)的內(nèi)核中。 驅(qū)動程序負責(zé)硬件和應(yīng)用軟件之間的溝通,而驅(qū)動工程師則負責(zé)硬件工程師和應(yīng)用軟件工程師之間的溝通。目前,隨著通信、電子行業(yè)的迅速發(fā)展,全世界每天都會生產(chǎn)大量新芯片,設(shè)計大量新電路板,也因此,會有大量設(shè)備驅(qū)動需要開發(fā)。這些驅(qū)動或運行在簡單的單任務(wù)環(huán)境中,或運行在VxWorks、 Linux、Windows等多任務(wù)操作系統(tǒng)環(huán)境中,它們發(fā)揮著不可替代的作用。
2.Linux設(shè)備驅(qū)動
2.1設(shè)備的分類及特點
計算機系統(tǒng)的硬件主要由CPU、存儲器和外設(shè)組成。隨著IC制作工藝的發(fā)展,目前,芯片的集成度越來越高,往往在CPU內(nèi)部就集成了存儲器和外設(shè)適配器。譬如,相當多的ARM、PowerPC、MIPS等處理器都集成了UART、I2C控制器、SPI控制器、USB控制器、SDRAM控制器等,有的處理器還集成了GPU(圖形處理器)、視頻編解碼器等。
驅(qū)動針對的對象是存儲器和外設(shè)(包括CPU內(nèi)部集成的存儲器和外設(shè)),而不是針對CPU內(nèi)核。Linux將存儲器和外設(shè)分為3個基礎(chǔ)大類。
·字符設(shè)備。
·塊設(shè)備。
·網(wǎng)絡(luò)設(shè)備。
字符設(shè)備指那些必須以串行順序依次進行訪問的設(shè)備,如觸摸屏、磁帶驅(qū)動器、鼠標等。塊設(shè)備可以按任意順序進行訪問,以塊為單位進行操作,如硬盤、eMMC等。字符設(shè)備和塊設(shè)備的驅(qū)動設(shè)計有出很大的差異,但是對于用戶而言,它們都要使用文件系統(tǒng)的操作接口open()、close()、read()、write()等進行訪問。
在Linux系統(tǒng)中,網(wǎng)絡(luò)設(shè)備面向數(shù)據(jù)包的接收和發(fā)送而設(shè)計,它并不傾向于對應(yīng)于文件系統(tǒng)的節(jié)點。內(nèi)核與網(wǎng)絡(luò)設(shè)備的通信與內(nèi)核和字符設(shè)備、網(wǎng)絡(luò)設(shè)備的通信方式完全不同,前者主要還是使用套接字接口。
2.2Linux設(shè)備驅(qū)動與整個軟硬件系統(tǒng)的關(guān)系
如圖所示,除網(wǎng)絡(luò)設(shè)備外,字符設(shè)備與塊設(shè)備都被映射到Linux文件系統(tǒng)的文件和目錄,通過文件系統(tǒng)的系統(tǒng)調(diào)用接口open()、write()、read()、close()等即可訪問字符設(shè)備和塊設(shè)備。所有字符設(shè)備和塊設(shè)備都統(tǒng)一呈現(xiàn)給用戶。Linux的塊設(shè)備有兩種訪問方法:一種是類似dd命令對應(yīng)的原始塊設(shè)備,如“/dev/sdb1”等;另外一種方法是在塊設(shè)備上建立FAT、EXT4、BTRFS等文件系統(tǒng),然后以文件路徑如“/home/barry/hello.txt”的形式進行訪問。在Linux中,針對NOR、NAND等提供了獨立的內(nèi)存技術(shù)設(shè)備(Memory Technology Device,MTD)子系統(tǒng),其上運行YAFFS2、JFFS2、UBIFS等具備擦除和負載均衡能力的文件系統(tǒng)。針對磁盤或者Flash設(shè)備的FAT、EXT4、YAFFS2、JFFS2、UBIFS等文件系統(tǒng)定義了文件和目錄在存儲介質(zhì)上的組織。而Linux的虛擬文件系統(tǒng)則統(tǒng)一對它們進行了抽象。

應(yīng)用程序可以使用Linux的系統(tǒng)調(diào)用接口編程,但也可使用C庫函數(shù),出于代碼可移植性的目的,后者更值得推薦。C庫函數(shù)本身也通過系統(tǒng)調(diào)用接口而實現(xiàn),如C庫函數(shù)fopen()、fwrite()、fread()、fclose()分別會調(diào)用操作系統(tǒng)的API open()、write()、read()、close()。