資源描述:
《linux設(shè)備驅(qū)動(dòng)開發(fā)實(shí)例》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、·1基礎(chǔ)知識(shí)設(shè)備驅(qū)動(dòng)的作用:任何一個(gè)計(jì)算機(jī)系統(tǒng)的運(yùn)行都是系統(tǒng)中軟硬件協(xié)作的結(jié)果,沒(méi)有硬件的軟件是空中樓閣,沒(méi)有軟件的硬件則是一堆廢鐵。硬件是底層基礎(chǔ),是所有軟件得以運(yùn)行的平臺(tái),代碼最終會(huì)落實(shí)為硬件上的組合邏輯與時(shí)序邏輯;軟件則實(shí)現(xiàn)了具體應(yīng)用,它按照各種不同的業(yè)務(wù)需求而設(shè)計(jì),滿足了用戶的需求。軟件和硬件不應(yīng)該相互滲透到對(duì)方的領(lǐng)域。為了盡快的完成設(shè)計(jì),應(yīng)用軟件工程師不想也不必關(guān)心硬件,而硬件工程師也難掌握軟件編程語(yǔ)言。例如,應(yīng)用軟件工程師在使用printf函數(shù)輸出信息的時(shí)候,他不用知道具體底層是怎么實(shí)現(xiàn)將信息輸
2、出到顯示屏或者串口上的。也就是說(shuō),應(yīng)用軟件工程師需要看到的是一個(gè)沒(méi)有硬件的純粹的軟件世界,他不用知道底層的硬件原理,而是通過(guò)一些通用的接口函數(shù)就可以操作。那么這些接口函數(shù)是怎么提供給上層的軟件工程師的呢,那這個(gè)艱巨的任務(wù)就落在了驅(qū)動(dòng)工程師的頭上。驅(qū)動(dòng)程序在Linux內(nèi)核里扮演著特殊的角色.它們是截然不同的"黑盒子",使硬件的特殊的一部分響應(yīng)定義好的內(nèi)部編程接口.它們完全隱藏了設(shè)備工作的細(xì)節(jié).用戶的活動(dòng)通過(guò)一套標(biāo)準(zhǔn)化的調(diào)用來(lái)進(jìn)行,這些調(diào)用與特別的驅(qū)動(dòng)是獨(dú)立的;設(shè)備驅(qū)動(dòng)的角色就是將這些調(diào)用映射到作用于實(shí)際硬件的
3、和設(shè)備相關(guān)的操作上.這個(gè)編程接口是這樣,驅(qū)動(dòng)可以與內(nèi)核的其他部分分開建立,并在需要的時(shí)候在運(yùn)行時(shí)"插入".這種模塊化使得Linux驅(qū)動(dòng)易寫,以致于目前有幾百個(gè)驅(qū)動(dòng)可用.總而言之:驅(qū)動(dòng)就是linux給用戶操作硬件提供的一個(gè)接口,它是一個(gè)存在于應(yīng)用程序和實(shí)際設(shè)備間的軟件層。由此可見,設(shè)備驅(qū)動(dòng)充當(dāng)了硬件和應(yīng)用軟件之間的紐帶,它使得應(yīng)用軟件只需要調(diào)用系統(tǒng)的一些應(yīng)用編程接口(API)就可以讓硬件去完成相應(yīng)的操作。在沒(méi)有操作系統(tǒng)的情況下,我們可以根據(jù)硬件設(shè)備的特點(diǎn)利用匯編和C語(yǔ)言的混合編程來(lái)操作硬件。在有操作系統(tǒng)的情況
4、下,設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)則由相應(yīng)的操作系統(tǒng)定義,然后驅(qū)動(dòng)工程師必須按照相應(yīng)的架構(gòu)設(shè)計(jì)設(shè)備驅(qū)動(dòng),這樣,設(shè)備驅(qū)動(dòng)才能良好的整合到操作系統(tǒng)的內(nèi)核中。并不是所有的計(jì)算機(jī)系統(tǒng)都一定要運(yùn)行操作系統(tǒng),在許多情況下操作系統(tǒng)是不必要的。對(duì)于一些功能比較單一、控制并不復(fù)雜的系統(tǒng),如公交車刷卡機(jī)、電冰箱、微波爐、簡(jiǎn)單的手機(jī)和小靈通等,并不需要多任務(wù)調(diào)度、文件系統(tǒng)、內(nèi)存管理等復(fù)雜功能,用單任務(wù)架構(gòu)完全可以很好的支持它們的工作。一個(gè)無(wú)限循環(huán)中夾雜對(duì)設(shè)備中斷的檢測(cè)或者對(duì)設(shè)備的輪詢是這種系統(tǒng)中軟件的典型架構(gòu)。在這樣的系統(tǒng)中,雖然不存在操作系統(tǒng)
5、,但是設(shè)備驅(qū)動(dòng)往往是必須存在的。一般情況下,對(duì)每一種設(shè)備驅(qū)動(dòng)都會(huì)定義那么如果計(jì)算機(jī)系統(tǒng)中包含了操作系統(tǒng),那么設(shè)備驅(qū)動(dòng)會(huì)變得怎樣呢?首先我們要知道操作系統(tǒng)的功能。操作系統(tǒng)的主要功能:進(jìn)程管理、內(nèi)存管理、文件管理、設(shè)備控制和網(wǎng)絡(luò)管理等。操作系統(tǒng)的存在它要求設(shè)備驅(qū)動(dòng)附加更多的代碼和功能,把單一的“驅(qū)動(dòng)硬件設(shè)備行動(dòng)”變成了操作系統(tǒng)內(nèi)與硬件交互的模塊,它對(duì)外呈現(xiàn)為操作系統(tǒng)的API。此時(shí)我們需要將設(shè)備驅(qū)動(dòng)融入到內(nèi)核中。為了實(shí)現(xiàn)這個(gè)融合,必須在所有的設(shè)備驅(qū)動(dòng)中設(shè)計(jì)面向操作系統(tǒng)內(nèi)核的接口,這樣的接口由操作系統(tǒng)規(guī)定。我們的l
6、inux操作系統(tǒng)是一個(gè)開源的操作系統(tǒng),Linux的眾多優(yōu)良特性之一就是可以在運(yùn)行時(shí)擴(kuò)展由內(nèi)核提供的特性的能力.這意味著你可以在系統(tǒng)正在運(yùn)行著的時(shí)候增加內(nèi)核的功能(也可以去除).每塊可以在運(yùn)行時(shí)添加到內(nèi)核的代碼,被稱為一個(gè)模塊.Linux內(nèi)核提供了對(duì)許多模塊類型的支持,包括但不限于設(shè)備驅(qū)動(dòng).每個(gè)模塊由目標(biāo)代碼組成(沒(méi)有連接成一個(gè)完整可執(zhí)行文件),可以動(dòng)態(tài)連接到運(yùn)行中的內(nèi)核中,通過(guò)insmod安裝模塊程序,以及通過(guò)rmmod移除模塊.Linux內(nèi)核的劃分如圖所示:計(jì)算機(jī)系統(tǒng)的硬件主要由CPU、存儲(chǔ)器和外設(shè)組成。
7、隨著IC制造工藝的發(fā)展,目前,芯片的集成度越來(lái)越高,往往在CPU內(nèi)部就集成了存儲(chǔ)器和外設(shè)適配器。ARM、PowerPC、MIPS等處理器都集成了UART、IIC控制器、USB控制器、SDRAM控制器等,有的處理器還集成了片內(nèi)RAM和Flash。驅(qū)動(dòng)針對(duì)的對(duì)象是存儲(chǔ)器和外設(shè)(包括CPU內(nèi)部集成的存儲(chǔ)器和外設(shè)),而不是針對(duì)CPU核。Linux將存儲(chǔ)器和外設(shè)分為3種基本設(shè)備類型(字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備).每個(gè)模塊常常實(shí)現(xiàn)3種設(shè)備類型中的1種,因此可分類成字符模塊,塊模塊,網(wǎng)絡(luò)模塊.3類設(shè)備如下:字符設(shè)備:一個(gè)
8、字符(char)設(shè)備是一種可以當(dāng)作一個(gè)字節(jié)流來(lái)存取的設(shè)備(如同一個(gè)文件);它是必須以串行順序依次進(jìn)行訪問(wèn)的設(shè)備,如觸摸屏、磁帶驅(qū)動(dòng)器、鼠標(biāo)等。這樣的驅(qū)動(dòng)常常至少實(shí)現(xiàn)open,close,read,和write系統(tǒng)調(diào)用.它不經(jīng)過(guò)系統(tǒng)的快速緩沖。塊設(shè)備:如同字符設(shè)備,它可以用任意順序進(jìn)行訪問(wèn),以塊為單位進(jìn)行操作,它會(huì)經(jīng)過(guò)系統(tǒng)的快速緩沖。塊設(shè)備通過(guò)位于/dev目錄的文件系統(tǒng)結(jié)點(diǎn)來(lái)存取.一個(gè)塊設(shè)備(例如一個(gè)磁盤)應(yīng)該是可