




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第七章嵌入式第七章嵌入式Linux設(shè)備驅(qū)動程序開發(fā)設(shè)備驅(qū)動程序開發(fā)目錄目錄GPIO字符設(shè)備驅(qū)動程序設(shè)計字符設(shè)備驅(qū)動程序設(shè)計本章導(dǎo)讀本章導(dǎo)讀A/D轉(zhuǎn)換器驅(qū)動程序設(shè)計轉(zhuǎn)換器驅(qū)動程序設(shè)計IC卡驅(qū)動程序設(shè)計卡驅(qū)動程序設(shè)計內(nèi)核驅(qū)動程序設(shè)計內(nèi)核驅(qū)動程序設(shè)計觸摸屏驅(qū)動程序觸摸屏驅(qū)動程序嵌入式嵌入式Linux的設(shè)備管理的設(shè)備管理音頻驅(qū)動程序設(shè)計音頻驅(qū)動程序設(shè)計設(shè)備驅(qū)動模塊化編程設(shè)備驅(qū)動模塊化編程目錄目錄本章導(dǎo)讀本章導(dǎo)讀能力目標(biāo):能力目標(biāo):了解嵌入式了解嵌入式Linux的設(shè)備驅(qū)動開發(fā)的一般流程;的設(shè)備驅(qū)動開發(fā)的一般流程;掌握設(shè)備驅(qū)動模塊化編程;掌握設(shè)備驅(qū)動模塊化編程;了解了解GPIO字符設(shè)備驅(qū)動程序設(shè)計過程;字
2、符設(shè)備驅(qū)動程序設(shè)計過程;掌握掌握A/D轉(zhuǎn)換器驅(qū)動程序設(shè)計方法;轉(zhuǎn)換器驅(qū)動程序設(shè)計方法; 掌握掌握IC卡驅(qū)動程序設(shè)計方法;卡驅(qū)動程序設(shè)計方法;熟悉內(nèi)核驅(qū)動熟悉內(nèi)核驅(qū)動-觸摸屏驅(qū)動程序設(shè)計;觸摸屏驅(qū)動程序設(shè)計;熟悉音頻驅(qū)動程序設(shè)計方法熟悉音頻驅(qū)動程序設(shè)計方法-1-學(xué)習(xí)導(dǎo)航:學(xué)習(xí)導(dǎo)航:本章是對基于本章是對基于ARM9硬件平臺的硬件平臺的Linux嵌入式系統(tǒng)的設(shè)備驅(qū)動開發(fā)的整個流嵌入式系統(tǒng)的設(shè)備驅(qū)動開發(fā)的整個流程的相關(guān)概念、基礎(chǔ)知識和一般應(yīng)用的綜述。在章節(jié)中簡單介紹了程的相關(guān)概念、基礎(chǔ)知識和一般應(yīng)用的綜述。在章節(jié)中簡單介紹了Linux嵌入式系統(tǒng)的設(shè)備驅(qū)動開發(fā)中的常用數(shù)據(jù)結(jié)構(gòu)、設(shè)備號、設(shè)備驅(qū)嵌入式系統(tǒng)的
3、設(shè)備驅(qū)動開發(fā)中的常用數(shù)據(jù)結(jié)構(gòu)、設(shè)備號、設(shè)備驅(qū)動模塊加載函數(shù)和系統(tǒng)調(diào)用的實現(xiàn)方法動模塊加載函數(shù)和系統(tǒng)調(diào)用的實現(xiàn)方法open、read等的視線。等的視線?;贏RM9的Linux嵌入式系統(tǒng)驅(qū)動程序的開發(fā)Linux設(shè)備驅(qū)動程序的加載和卸載Linux設(shè)備驅(qū)動程序的數(shù)據(jù)結(jié)構(gòu)定義File_operations 中的函數(shù)實現(xiàn),如:open、write等測試程序的開發(fā)-2-知識框架:知識框架:本章知識內(nèi)容為基于本章知識內(nèi)容為基于ARM9的的Linux嵌入式系統(tǒng)的設(shè)備驅(qū)動的開發(fā)的嵌入式系統(tǒng)的設(shè)備驅(qū)動的開發(fā)的概念、流程、常見函數(shù)、開發(fā)過程中涉及的硬件設(shè)備等。概念、流程、常見函數(shù)、開發(fā)過程中涉及的硬件設(shè)備等。Lin
4、ux嵌入式系統(tǒng)的設(shè)備管理Linux設(shè)備驅(qū)動的模塊化編程Linux設(shè)備驅(qū)動的中斷Linux設(shè)備驅(qū)動的方法實現(xiàn)Linux嵌入式系統(tǒng)的模塊下載-3-嵌入式嵌入式Linux的設(shè)備管理的設(shè)備管理嵌入式系統(tǒng)的應(yīng)用范圍很廣,它的處理過程可以簡單的概括為:獲嵌入式系統(tǒng)的應(yīng)用范圍很廣,它的處理過程可以簡單的概括為:獲取信息、處理信息、輸出結(jié)果。取信息、處理信息、輸出結(jié)果。此處的輸入信號可以使模擬量,也可以是數(shù)字量,具體的處理操作此處的輸入信號可以使模擬量,也可以是數(shù)字量,具體的處理操作根據(jù)應(yīng)用的不同而不同,而輸出結(jié)果也各不相同。與輸入輸出信號對應(yīng)根據(jù)應(yīng)用的不同而不同,而輸出結(jié)果也各不相同。與輸入輸出信號對應(yīng)的設(shè)
5、備,稱為輸入輸出設(shè)備。的設(shè)備,稱為輸入輸出設(shè)備。因為嵌入式系統(tǒng)的這些外部設(shè)備隨其具體應(yīng)用而不同,所以在操作因為嵌入式系統(tǒng)的這些外部設(shè)備隨其具體應(yīng)用而不同,所以在操作系統(tǒng)內(nèi)部,不提供相關(guān)設(shè)備的具體操作。系統(tǒng)內(nèi)部,不提供相關(guān)設(shè)備的具體操作。-4-7.1.1 設(shè)備驅(qū)動和文件系統(tǒng)的關(guān)系設(shè)備驅(qū)動和文件系統(tǒng)的關(guān)系在在Linux中一個設(shè)備可以看做是一個文件系統(tǒng),中一個設(shè)備可以看做是一個文件系統(tǒng),Linux對設(shè)備的訪問,對設(shè)備的訪問,就是通過文件系統(tǒng)來實現(xiàn)的。就是通過文件系統(tǒng)來實現(xiàn)的。文件系統(tǒng)層是文件系統(tǒng)層是Linux從從Unix中繼承而來的。文件系統(tǒng)是中繼承而來的。文件系統(tǒng)是Linux操作系統(tǒng)操作系統(tǒng)的重要
6、組成部分,系統(tǒng)內(nèi)核通過文件系統(tǒng),在硬件上構(gòu)造出結(jié)構(gòu)化的層次。的重要組成部分,系統(tǒng)內(nèi)核通過文件系統(tǒng),在硬件上構(gòu)造出結(jié)構(gòu)化的層次。Linux支持多種的文件類型,從最早的支持多種的文件類型,從最早的Linux文件系統(tǒng)文件系統(tǒng)Minix,專門為,專門為Linux 設(shè)計的文件系統(tǒng)設(shè)計的文件系統(tǒng)ext2,又稱擴展文件系統(tǒng),到后來,又稱擴展文件系統(tǒng),到后來FAT、JFFS2、ext3和和ext4等。在等。在Linux中不同的文件類型,有不同的數(shù)據(jù)組織和集合方式。中不同的文件類型,有不同的數(shù)據(jù)組織和集合方式。-5-在在Linux中的每個介質(zhì)上都可定義一個或者多個文件系統(tǒng),每個文件系中的每個介質(zhì)上都可定義一個或
7、者多個文件系統(tǒng),每個文件系統(tǒng)由邏輯塊序列組成,一個邏輯空間一般可劃分為幾個用途各不相同的部分,統(tǒng)由邏輯塊序列組成,一個邏輯空間一般可劃分為幾個用途各不相同的部分,引導(dǎo)塊、超級塊、索引節(jié)點和數(shù)據(jù)區(qū)等。引導(dǎo)塊、超級塊、索引節(jié)點和數(shù)據(jù)區(qū)等。l引導(dǎo)塊是文件系統(tǒng)的頭,用以存放引導(dǎo)程序,通常為一個扇區(qū);引導(dǎo)塊是文件系統(tǒng)的頭,用以存放引導(dǎo)程序,通常為一個扇區(qū);l超級塊是文件系統(tǒng)中,用于記錄文件系統(tǒng)的管理信息;超級塊是文件系統(tǒng)中,用于記錄文件系統(tǒng)的管理信息;l索引節(jié)點是一個文件或目錄的根節(jié)點;索引節(jié)點是一個文件或目錄的根節(jié)點;l數(shù)據(jù)區(qū)主要用于存放文件數(shù)據(jù)或者管理數(shù)據(jù)。數(shù)據(jù)區(qū)主要用于存放文件數(shù)據(jù)或者管理數(shù)據(jù)。
8、設(shè)備驅(qū)動程序以文件的形式嵌入到內(nèi)核的文件系統(tǒng)中,它的主要功能包設(shè)備驅(qū)動程序以文件的形式嵌入到內(nèi)核的文件系統(tǒng)中,它的主要功能包括自動配置并初始化程序,執(zhí)行功能請求的子程序等。括自動配置并初始化程序,執(zhí)行功能請求的子程序等。-6-7.1.2 設(shè)備類型設(shè)備類型在在Linux系統(tǒng)中將設(shè)備分成三種基本類型,分別是:字符設(shè)備、塊設(shè)備和系統(tǒng)中將設(shè)備分成三種基本類型,分別是:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。網(wǎng)絡(luò)設(shè)備。字符設(shè)備:是通過數(shù)據(jù)字節(jié)流來進行訪問的,類似文件的訪問。在字符設(shè)備:是通過數(shù)據(jù)字節(jié)流來進行訪問的,類似文件的訪問。在Linux系統(tǒng)中所有能夠象字節(jié)流一樣訪問的設(shè)備都可以通過字符設(shè)備來實現(xiàn),它們系統(tǒng)中所
9、有能夠象字節(jié)流一樣訪問的設(shè)備都可以通過字符設(shè)備來實現(xiàn),它們被映射為文件系統(tǒng)中的節(jié)點,通常保存在目錄被映射為文件系統(tǒng)中的節(jié)點,通常保存在目錄/dev/下,使用下,使用chrdevs來維護。來維護。字符設(shè)備是字符設(shè)備是Linux中最簡單的功能設(shè)備,一個字符設(shè)備的驅(qū)動程序必須具備中最簡單的功能設(shè)備,一個字符設(shè)備的驅(qū)動程序必須具備open、 read 、write 、和、和close等系統(tǒng)基本調(diào)用。等系統(tǒng)基本調(diào)用。-7-塊設(shè)備:與字符設(shè)備類似,也可以通過文件系統(tǒng)來訪問。同時塊設(shè)塊設(shè)備:與字符設(shè)備類似,也可以通過文件系統(tǒng)來訪問。同時塊設(shè)備還是文件系統(tǒng)的物質(zhì)基礎(chǔ)。塊設(shè)備與字符設(shè)備的區(qū)別在于,內(nèi)核管理備還是
10、文件系統(tǒng)的物質(zhì)基礎(chǔ)。塊設(shè)備與字符設(shè)備的區(qū)別在于,內(nèi)核管理數(shù)據(jù)的方式不同。塊設(shè)備可以向字符設(shè)備一樣以字節(jié)流的方式來訪問,數(shù)據(jù)的方式不同。塊設(shè)備可以向字符設(shè)備一樣以字節(jié)流的方式來訪問,也可以一次傳遞任意多的字節(jié)。在也可以一次傳遞任意多的字節(jié)。在Linux中塊設(shè)備是使用中塊設(shè)備是使用blkdevs向量向量表來維護的。表來維護的。-8-網(wǎng)絡(luò)接口設(shè)備:是指通過網(wǎng)絡(luò)接口來進行數(shù)據(jù)交換的設(shè)備,它可以網(wǎng)絡(luò)接口設(shè)備:是指通過網(wǎng)絡(luò)接口來進行數(shù)據(jù)交換的設(shè)備,它可以是硬件設(shè)備,也可能是軟件設(shè)備。它的數(shù)據(jù)訪問是以數(shù)據(jù)包的形式來進是硬件設(shè)備,也可能是軟件設(shè)備。它的數(shù)據(jù)訪問是以數(shù)據(jù)包的形式來進行的,它由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)
11、動,主要負(fù)責(zé)發(fā)送和接收數(shù)據(jù)包。網(wǎng)行的,它由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)動,主要負(fù)責(zé)發(fā)送和接收數(shù)據(jù)包。網(wǎng)絡(luò)接口設(shè)備只進行數(shù)據(jù)包的通信,而不必了解數(shù)據(jù)包中的具體內(nèi)容。因絡(luò)接口設(shè)備只進行數(shù)據(jù)包的通信,而不必了解數(shù)據(jù)包中的具體內(nèi)容。因為數(shù)據(jù)傳送往往不是面向流的,因此很難將它們映射到一個文件系統(tǒng)的為數(shù)據(jù)傳送往往不是面向流的,因此很難將它們映射到一個文件系統(tǒng)的節(jié)點上。節(jié)點上。-9-7.1.3 設(shè)備號設(shè)備號Linux的設(shè)備號由兩部分組成,分別是:主設(shè)備號和次設(shè)備號。的設(shè)備號由兩部分組成,分別是:主設(shè)備號和次設(shè)備號。在在linux中設(shè)備號是保存在一個無符號的中設(shè)備號是保存在一個無符號的32位的整型中的,其中主設(shè)位的整
12、型中的,其中主設(shè)備號占據(jù)備號占據(jù)12個位,次設(shè)備號占據(jù)了個位,次設(shè)備號占據(jù)了20位。位。dev_t是在文件是在文件include/linux/type.h中定義的一個無符號的中定義的一個無符號的32位的位的整型整型, 其中高其中高12位表示主設(shè)備號,低位表示主設(shè)備號,低20位表示次設(shè)備號。位表示次設(shè)備號。 其具體定義如其具體定義如下:下:-10-Linux設(shè)備號是在驅(qū)動模塊中分配并注冊的,它是與驅(qū)動程序相對應(yīng)設(shè)備號是在驅(qū)動模塊中分配并注冊的,它是與驅(qū)動程序相對應(yīng)的。的。Linux的設(shè)備號的分配有兩種方式:靜態(tài)分配和動態(tài)分配。的設(shè)備號的分配有兩種方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配設(shè)備號是一種手動
13、分配方式,在靜態(tài)分配前需要先通過讀取靜態(tài)分配設(shè)備號是一種手動分配方式,在靜態(tài)分配前需要先通過讀取文件文件/proc/devices查看系統(tǒng)中已經(jīng)存在的設(shè)備號,常用的手動分配設(shè)備號查看系統(tǒng)中已經(jīng)存在的設(shè)備號,常用的手動分配設(shè)備號的函數(shù)如下:的函數(shù)如下:typedef _u32 _kernel_dev_t;typedef _kernel_dev_t dev_t;-11-在函數(shù)的形參中在函數(shù)的形參中first是手動給定的設(shè)備號,是手動給定的設(shè)備號,count是所請求的連續(xù)是所請求的連續(xù)設(shè)備號的個數(shù),而設(shè)備號的個數(shù),而name是和該設(shè)備號范圍關(guān)聯(lián)的設(shè)備名稱,它將出現(xiàn)是和該設(shè)備號范圍關(guān)聯(lián)的設(shè)備名稱,它將
14、出現(xiàn)在文件在文件/proc/devices和和sysfs中。中。int register_chrdev_region(dev_t first, unsigned int count, char *name)-12-舉例說明當(dāng)舉例說明當(dāng)first為為0 x3FFFF0,count為為0 x5,該區(qū)驅(qū)動函數(shù)可以,該區(qū)驅(qū)動函數(shù)可以為為5個設(shè)備注冊設(shè)備號,分別是:個設(shè)備注冊設(shè)備號,分別是:0 x3FFFF0、 0 x3FFFF1、 0 x3FFFF2、 0 x3FFFF3、 0 x3FFFF4。其中。其中0 x3為主設(shè)備號,而為主設(shè)備號,而0 xFFFF0、 0 xFFFF1、 0 xFFFF2、 0
15、 xFFFF3、 0 xFFFF4是次設(shè)備是次設(shè)備號。在指定時應(yīng)注意號。在指定時應(yīng)注意count值不能太大,避免設(shè)備號范圍和下一個主值不能太大,避免設(shè)備號范圍和下一個主設(shè)備號重疊。設(shè)備號重疊。-13-動態(tài)分配是調(diào)用系統(tǒng)函數(shù)來給設(shè)備動態(tài)分配一個設(shè)備號的方法,動態(tài)分配是調(diào)用系統(tǒng)函數(shù)來給設(shè)備動態(tài)分配一個設(shè)備號的方法,在在Linux中人為的分配設(shè)備號很可能發(fā)生沖突,因此在中人為的分配設(shè)備號很可能發(fā)生沖突,因此在Linux內(nèi)核中支內(nèi)核中支持動態(tài)的設(shè)備號分配。使用函數(shù)持動態(tài)的設(shè)備號分配。使用函數(shù)alloc_chrdev_region()就可以達到動就可以達到動態(tài)分配設(shè)備號的目的。下面是動態(tài)分配的函數(shù)原形:
16、態(tài)分配設(shè)備號的目的。下面是動態(tài)分配的函數(shù)原形:int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)-14-7.1.4 設(shè)備驅(qū)動中關(guān)鍵數(shù)據(jù)結(jié)構(gòu)設(shè)備驅(qū)動中關(guān)鍵數(shù)據(jù)結(jié)構(gòu)在在Linux的設(shè)備驅(qū)動程序中有三個非常重要的數(shù)據(jù)結(jié)構(gòu),分別是的設(shè)備驅(qū)動程序中有三個非常重要的數(shù)據(jù)結(jié)構(gòu),分別是file_operations、inode和和file。file_operations是把字符設(shè)備驅(qū)動的操作和設(shè)備號聯(lián)系在一起的紐是把字符設(shè)備驅(qū)動的操作和設(shè)備號聯(lián)系在一起的紐帶;帶;inode 用
17、來代表一個文件;用來代表一個文件;File指代一個打開的文。指代一個打開的文。-15-file_operations數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)file_operations數(shù)據(jù)結(jié)構(gòu)用于為設(shè)備驅(qū)動提供入口函數(shù),它是在文數(shù)據(jù)結(jié)構(gòu)用于為設(shè)備驅(qū)動提供入口函數(shù),它是在文件件中的函數(shù)指針表,下面來介紹該數(shù)據(jù)結(jié)構(gòu)。中的函數(shù)指針表,下面來介紹該數(shù)據(jù)結(jié)構(gòu)。struct module *owne;loff_t (*llseek) (struct file*, loff_t,int);ssize_t (*read)(struct file *,char *,size_t,loff_t *);ssize_t (*write)(
18、struct file *,const char *,size_t,loff_t *);int (*readdir) (struct file *,void *,filldir_t);unsigned int (*poll)(struct file *,struct poll_table_struct *);int (*ioctl) (struct inode *,struct file *,unsigned int,unsigned long);int (*mmap) (sturct file *, struct vm_area_struct*);-16-int (*open) (struc
19、t inode *,struct file *);int (*flush)(struct file *);int (*release)(struct inode *,struct file *); int (*synch)(struct file *,struct dentry *,int datasync); int (*fasync)(int, struct file *, int); int (*lock)(struct file *, int,struct file_lock);ssize_t (*readv) (struct file *,const struct iovec *,u
20、nsigned long*,loff_t * );sszie_t(*writev)(struct file *,const struct iovec *,unsigned long *,loff_t *);ssize_t (*sengpage)(struct file *,struct page *,int,size_t,loff_t *,int);unsigned long (*get_unmaapped_area)(struct file *,unsigned long,unsigned long,unsigned long,unsigned long );long (*fcntl)(in
21、t fd,unsigned int cmd,unsigned arg, struct file *filp);-17-inode數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)inode是索引節(jié)點數(shù)據(jù)結(jié)構(gòu),它包含了與文件系統(tǒng)中各個文件相關(guān)是索引節(jié)點數(shù)據(jù)結(jié)構(gòu),它包含了與文件系統(tǒng)中各個文件相關(guān)的一些重要信息。的一些重要信息。在在 Linux中創(chuàng)建文件系統(tǒng)時,將同時創(chuàng)建大量的中創(chuàng)建文件系統(tǒng)時,將同時創(chuàng)建大量的inode索引節(jié)點。索引節(jié)點。通常情況下,文件系統(tǒng)的磁盤空間中大約百分之一的空間被分配給了通常情況下,文件系統(tǒng)的磁盤空間中大約百分之一的空間被分配給了 inode 表,用來存放文件及目錄的基本信息。表,用來存放文件及目錄的基本
22、信息。 -18-在在Linux中,中,struct inode結(jié)構(gòu)包含了兩個很重要成員:結(jié)構(gòu)包含了兩個很重要成員:dev_t i_rdev 和和struct cdev *i_cdev。dev_t i_rdev :是設(shè)備文件的設(shè)備編號。:是設(shè)備文件的設(shè)備編號。struct cdev *i_cdev:是字符設(shè)備的內(nèi)核數(shù)據(jù)結(jié)構(gòu),指向:是字符設(shè)備的內(nèi)核數(shù)據(jù)結(jié)構(gòu),指向struct cdev結(jié)構(gòu)。結(jié)構(gòu)。-19-file數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)struct file是是Linux內(nèi)核中的一個重要的數(shù)據(jù)結(jié)構(gòu),用于表示被打內(nèi)核中的一個重要的數(shù)據(jù)結(jié)構(gòu),用于表示被打開的文件的信息。與開的文件的信息。與struct inod
23、e結(jié)構(gòu)不同,結(jié)構(gòu)不同,file結(jié)構(gòu)只有在文件被打結(jié)構(gòu)只有在文件被打開時才創(chuàng)建,對于某一文件它可以有多個開時才創(chuàng)建,對于某一文件它可以有多個file結(jié)構(gòu),但是只能有一個結(jié)構(gòu),但是只能有一個inode結(jié)構(gòu)。結(jié)構(gòu)。struct file結(jié)構(gòu)主要是供設(shè)備驅(qū)動程序使用的,其結(jié)構(gòu)如下:結(jié)構(gòu)主要是供設(shè)備驅(qū)動程序使用的,其結(jié)構(gòu)如下:-20-lmode_t f_mode:通過:通過FMODE_READ或或FMODE_WRITE,來表示文,來表示文件是否可讀或可寫;件是否可讀或可寫;ldev_ t f_rdev :用于:用于/dev/tty;loff_t f_ops:當(dāng)前文件位移;:當(dāng)前文件位移;lunsigne
24、d short f_flags:文件標(biāo)志,:文件標(biāo)志,O_RDONLY、O_NONBLOCK和和O_SYNC;lunsigned short f_count:打開的文件數(shù)目;:打開的文件數(shù)目;lunsigned short f_reada:lstruct inode *f_inode:指向:指向inode的結(jié)構(gòu)指針;的結(jié)構(gòu)指針;lstruct file_operations *f_op:文件索引指針。:文件索引指針。 -21-7.1.5 設(shè)備驅(qū)動開發(fā)中基本函數(shù)設(shè)備驅(qū)動開發(fā)中基本函數(shù)open( )函數(shù)函數(shù)在在Linux中中open( )函數(shù)主要是為驅(qū)動程序提供初始化,從字面上理函數(shù)主要是為驅(qū)動程
25、序提供初始化,從字面上理解解open的含義是打開和創(chuàng)建文件。的含義是打開和創(chuàng)建文件。file_operations結(jié)構(gòu)中結(jié)構(gòu)中open的原型如下:的原型如下:int (*open) (struct inode * inode,struct file * file);-22-第一個形參是一個指向第一個形參是一個指向struct inode結(jié)構(gòu)的指針,它包含了驅(qū)動結(jié)構(gòu)的指針,它包含了驅(qū)動程序設(shè)備編號等信息;程序設(shè)備編號等信息;第二個形參是一個指向第二個形參是一個指向struct file結(jié)構(gòu)的指針。結(jié)構(gòu)的指針。在大多數(shù)的設(shè)備驅(qū)動程序中在大多數(shù)的設(shè)備驅(qū)動程序中open函數(shù)必須具備如下功能:函數(shù)必須具
26、備如下功能:檢查設(shè)備是否就緒,硬件是否可用;檢查設(shè)備是否就緒,硬件是否可用;對于首次打開的設(shè)備進行初始化;對于首次打開的設(shè)備進行初始化;判斷是否有必要對判斷是否有必要對f-op進行更新;進行更新;-23-release( )函數(shù)函數(shù)release ( )函數(shù)是釋放在函數(shù)是釋放在open函數(shù)中分配的內(nèi)存存儲空間。函數(shù)中分配的內(nèi)存存儲空間。file_operations結(jié)構(gòu)中結(jié)構(gòu)中release的原型如下:的原型如下:int (*release) (struct inode * inode,struct file * file);第一個形參是一個指向第一個形參是一個指向struct inode結(jié)構(gòu)
27、的指針,它包含了驅(qū)動程結(jié)構(gòu)的指針,它包含了驅(qū)動程序設(shè)備編號等信息;序設(shè)備編號等信息;第二個形參是一個指向第二個形參是一個指向struct file結(jié)構(gòu)的指針。結(jié)構(gòu)的指針。-24-read( )函數(shù)函數(shù)將設(shè)備中的數(shù)據(jù)拷貝到應(yīng)用程序的空間中。將設(shè)備中的數(shù)據(jù)拷貝到應(yīng)用程序的空間中。函數(shù)原型如下:函數(shù)原型如下: ssize_t (*read)(struct file * filp,char * buff,size_t count,loff_t * offp);第一個形參是一個指向第一個形參是一個指向struct file結(jié)構(gòu)的指針結(jié)構(gòu)的指針第二個形參第二個形參buff是指向用戶空間的緩沖區(qū)的指針變量是
28、指向用戶空間的緩沖區(qū)的指針變量第三個形參第三個形參count是請求傳送的數(shù)據(jù)長度是請求傳送的數(shù)據(jù)長度最后一個形參最后一個形參offp是一個長偏移量的指針。是一個長偏移量的指針。-25-write( )函數(shù)函數(shù)將數(shù)據(jù)發(fā)送到設(shè)備中。它的函數(shù)原型如下:將數(shù)據(jù)發(fā)送到設(shè)備中。它的函數(shù)原型如下: ssize_t (*write)(struct file * filp,const char * buff,size_t count,loff_t * offp);第一個形參是一個指向第一個形參是一個指向struct file結(jié)構(gòu)的指針結(jié)構(gòu)的指針第二個形參第二個形參buff是指向用戶空間的緩沖區(qū)的指針變量是指向用
29、戶空間的緩沖區(qū)的指針變量第三個形參第三個形參count是請求傳送的數(shù)據(jù)長是請求傳送的數(shù)據(jù)長最后一個形參最后一個形參offp是一個長偏移量的指針。是一個長偏移量的指針。-26-Linux中設(shè)備被分為字符型、塊型和網(wǎng)絡(luò)型三大類,每一類的中設(shè)備被分為字符型、塊型和網(wǎng)絡(luò)型三大類,每一類的Linux設(shè)備都有其標(biāo)準(zhǔn)的接口,按照這些固化的流程進行編寫,就可以在設(shè)備都有其標(biāo)準(zhǔn)的接口,按照這些固化的流程進行編寫,就可以在Linux內(nèi)部實現(xiàn)不同功能設(shè)備的擴展。內(nèi)部實現(xiàn)不同功能設(shè)備的擴展。設(shè)備驅(qū)動程序內(nèi)核接口功能函數(shù)實現(xiàn)設(shè)備驅(qū)動模塊化編程設(shè)備驅(qū)動模塊化編程-27-7.2.1 設(shè)備驅(qū)動程序的開發(fā)流程設(shè)備驅(qū)動程序的開發(fā)
30、流程1. 理解設(shè)備的工作原理理解設(shè)備的工作原理2. 設(shè)備初始化設(shè)備初始化對設(shè)備進行初始化,并在初始化函數(shù)中實現(xiàn)對驅(qū)動程序的注冊和加對設(shè)備進行初始化,并在初始化函數(shù)中實現(xiàn)對驅(qū)動程序的注冊和加載。載。3. 建立接口建立接口定義定義file-operations結(jié)構(gòu),實現(xiàn)文件系統(tǒng)與設(shè)備驅(qū)動程序間的接口。結(jié)構(gòu),實現(xiàn)文件系統(tǒng)與設(shè)備驅(qū)動程序間的接口。-28-4. 文件操作實現(xiàn)文件操作實現(xiàn)編寫具體的文件操作函數(shù),編寫具體的文件操作函數(shù),open、read、write等。等。5. 中斷實現(xiàn)中斷實現(xiàn)設(shè)備中有中斷服務(wù)實現(xiàn)該功能,并用設(shè)備中有中斷服務(wù)實現(xiàn)該功能,并用request-irq向內(nèi)核申請中斷向內(nèi)核申請中斷
31、接口。接口。6. 編譯驅(qū)動程序編譯驅(qū)動程序?qū)Ⅱ?qū)動程序直接編譯到內(nèi)核中,或使用將驅(qū)動程序直接編譯到內(nèi)核中,或使用insmod命令加載模塊。命令加載模塊。-29-7. 測試設(shè)備測試設(shè)備對驅(qū)動程序進行測試驗證成果。通過系統(tǒng)調(diào)用函數(shù)訪問設(shè)備驅(qū)動來控制對驅(qū)動程序進行測試驗證成果。通過系統(tǒng)調(diào)用函數(shù)訪問設(shè)備驅(qū)動來控制硬件,觀察實驗結(jié)果對測試過程中出現(xiàn)的問題進行分析,并修改程序中的相硬件,觀察實驗結(jié)果對測試過程中出現(xiàn)的問題進行分析,并修改程序中的相關(guān)部分。關(guān)部分。7.2.2 內(nèi)核空間和用戶空間內(nèi)核空間和用戶空間內(nèi)核空間和用戶空間具有不同的地址空間,引用不同的內(nèi)存映射,它們內(nèi)核空間和用戶空間具有不同的地址空間,
32、引用不同的內(nèi)存映射,它們都屬于虛擬地址空間。都屬于虛擬地址空間。-30-設(shè)備驅(qū)動程序和內(nèi)核代碼運行在內(nèi)核空間,應(yīng)用程序運行在用戶空設(shè)備驅(qū)動程序和內(nèi)核代碼運行在內(nèi)核空間,應(yīng)用程序運行在用戶空間。間。內(nèi)核空間下運行的程序,對應(yīng)處理器的用戶態(tài),具有較高的權(quán)限,內(nèi)核空間下運行的程序,對應(yīng)處理器的用戶態(tài),具有較高的權(quán)限,可以直接對硬件等資源進行訪問??梢灾苯訉τ布荣Y源進行訪問。工作在用戶空間的程序,因用戶空間對應(yīng)的是處理器的用戶態(tài),其工作在用戶空間的程序,因用戶空間對應(yīng)的是處理器的用戶態(tài),其權(quán)限較低,內(nèi)核中的很多資源比如硬件設(shè)備等,在該空間中是無權(quán)訪問權(quán)限較低,內(nèi)核中的很多資源比如硬件設(shè)備等,在該空間
33、中是無權(quán)訪問的。的。-31-7.2.3 設(shè)備注冊和初始化設(shè)備注冊和初始化在在2.6的的Linux內(nèi)核中使用的設(shè)備注冊函數(shù)有:內(nèi)核中使用的設(shè)備注冊函數(shù)有:int register_chrdev_region(dev_t first, unsigned int count, char *name)、int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)void unregister_ chrdev_ region(dev_t first, unsigned int co
34、unt)-32-7.2.4 中斷管理中斷管理中斷是處理器具有的一種快速響應(yīng)的機制,在處理器的運行過程中,中斷是處理器具有的一種快速響應(yīng)的機制,在處理器的運行過程中,按程序執(zhí)行的運行順序可能會使某些關(guān)鍵部位的響應(yīng)變慢,為了處理器能按程序執(zhí)行的運行順序可能會使某些關(guān)鍵部位的響應(yīng)變慢,為了處理器能更快的響應(yīng)一些高優(yōu)先級操作進程,引入了中斷的概念。更快的響應(yīng)一些高優(yōu)先級操作進程,引入了中斷的概念。中斷使運行中的程序可以被內(nèi)部或外部的突發(fā)事件所暫停,轉(zhuǎn)去執(zhí)行中斷使運行中的程序可以被內(nèi)部或外部的突發(fā)事件所暫停,轉(zhuǎn)去執(zhí)行一段預(yù)先設(shè)置好的程序代碼,即中斷服務(wù)程序,當(dāng)執(zhí)行完成后,再返回源一段預(yù)先設(shè)置好的程序代碼
35、,即中斷服務(wù)程序,當(dāng)執(zhí)行完成后,再返回源程序的斷點處繼續(xù)執(zhí)行。程序的斷點處繼續(xù)執(zhí)行。-33-申請中斷申請中斷request_irq()和釋放中斷和釋放中斷free_irq()的函數(shù)原型。的函數(shù)原型。int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long flags, const char * dev_name, void *dev_id);void free_irq(unsigned int irq,void *dev_id);-3
36、4-申請中斷函數(shù)申請中斷函數(shù)request_irq()中的參數(shù)中的參數(shù)irq表示要申請的中斷號;表示要申請的中斷號;Handler是要安裝的中斷處理函數(shù)的指針,是一個回調(diào)函數(shù),中斷發(fā)生時,是要安裝的中斷處理函數(shù)的指針,是一個回調(diào)函數(shù),中斷發(fā)生時,系統(tǒng)調(diào)用這個函數(shù);系統(tǒng)調(diào)用這個函數(shù);flags是中斷處理的屬性,若設(shè)置是中斷處理的屬性,若設(shè)置SA_INTERRUPT,標(biāo),標(biāo)明中斷處理程序是快速處理程序,快速處理程序被調(diào)用時屏蔽所有中斷,慢明中斷處理程序是快速處理程序,快速處理程序被調(diào)用時屏蔽所有中斷,慢速處理程序不屏蔽;若設(shè)置速處理程序不屏蔽;若設(shè)置SA_SHIRQ,則多個設(shè)備共享中斷;,則多個設(shè)
37、備共享中斷;dev_name是設(shè)備名稱字符串,申請完成后,將在是設(shè)備名稱字符串,申請完成后,將在/proc/interrupts文件中顯示;文件中顯示;dev_id是設(shè)備的標(biāo)識,在中斷共享時會用到,一般設(shè)置為這個設(shè)備的是設(shè)備的標(biāo)識,在中斷共享時會用到,一般設(shè)置為這個設(shè)備的device結(jié)構(gòu)本身或者結(jié)構(gòu)本身或者NULL。 -35-7.3.1 GPIO接口設(shè)計接口設(shè)計S3C2440共有共有117個多功能的個多功能的I/O口,這些口,這些I/O口共分為八組,分別是:口共分為八組,分別是:lGPA:端口:端口A,23 個輸出端口;個輸出端口;lGPB:端口:端口B,11 個輸入個輸入/輸出端口;輸出端口
38、;lGPC:端口:端口C,16 個輸入個輸入/輸出端口;輸出端口;lGPD:端口:端口D,16 個輸入個輸入/輸出端口;輸出端口;lGPE:端口:端口E,16 個輸入個輸入/輸出端口;輸出端口;lGPF:端口:端口F,8 個輸入個輸入/輸出端口;輸出端口;lGPG:端口:端口G,16 個輸入個輸入/輸出端口輸出端口lGPH:端口:端口H,11 個輸入個輸入/輸出端口;輸出端口;GPIO字符設(shè)備驅(qū)動程序設(shè)計字符設(shè)備驅(qū)動程序設(shè)計-36-GPxCON:是引腳功能選擇寄存器,在芯片:是引腳功能選擇寄存器,在芯片S3C2410中的大多數(shù)引腳中的大多數(shù)引腳都是多功能的。因此,在使用引腳前應(yīng)通過寄存器都是多
39、功能的。因此,在使用引腳前應(yīng)通過寄存器GPxCON設(shè)置好每個引設(shè)置好每個引腳的功能。腳的功能。GPxDAT:是引腳數(shù)據(jù)寄存器,用于讀:是引腳數(shù)據(jù)寄存器,用于讀/寫引腳數(shù)據(jù)。當(dāng)對應(yīng)的引腳被寫引腳數(shù)據(jù)。當(dāng)對應(yīng)的引腳被設(shè)置為輸出時,寫該寄存器中的相應(yīng)位可輸出高電平或低電平;當(dāng)此引腳被設(shè)置為輸出時,寫該寄存器中的相應(yīng)位可輸出高電平或低電平;當(dāng)此引腳被設(shè)置為輸入時,讀該寄存器可以獲取相應(yīng)引腳的電平狀態(tài)。設(shè)置為輸入時,讀該寄存器可以獲取相應(yīng)引腳的電平狀態(tài)。GPxUP:是上拉電阻設(shè)置寄存器,通過該寄存器可以設(shè)置相應(yīng)引腳是:是上拉電阻設(shè)置寄存器,通過該寄存器可以設(shè)置相應(yīng)引腳是否使用上拉電阻。當(dāng)寄存器中的某位為
40、否使用上拉電阻。當(dāng)寄存器中的某位為0時,則對應(yīng)的引腳將不使用上拉電時,則對應(yīng)的引腳將不使用上拉電阻;若寄存器阻;若寄存器GPxUP鐘的某位為鐘的某位為1,則對應(yīng)的端口引腳使用上拉電阻。,則對應(yīng)的端口引腳使用上拉電阻。-37-端口端口A寄存器及引腳配置寄存器及引腳配置端口端口A中有中有23個輸出引腳無上拉選擇,控制寄存器個輸出引腳無上拉選擇,控制寄存器GPACON中的每一中的每一位對應(yīng)一根引腳。當(dāng)對應(yīng)為設(shè)置為位對應(yīng)一根引腳。當(dāng)對應(yīng)為設(shè)置為0時,相應(yīng)引腳為輸出引腳。反之,則相時,相應(yīng)引腳為輸出引腳。反之,則相應(yīng)引腳為地址線或用于地址控制,此時應(yīng)引腳為地址線或用于地址控制,此時GPADAT無用。無用
41、。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPACON0 x5600 0000讀/寫端口A引腳配置寄存器0 x7FFFFFGPADAT0 x5600 0004讀/寫端口A數(shù)據(jù)寄存器-保留0 x5600 0008-保留-保留0 x5600 000C-保留-38-端口端口B寄存器及引腳配置寄存器及引腳配置端口端口B有有11個輸入個輸入/輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPBCON中的每兩位對應(yīng)中的每兩位對應(yīng)一根引腳。一根引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口B的數(shù)據(jù)寄存器的數(shù)據(jù)寄存器GPBDAT為為11位
42、有效值。上拉寄存器位有效值。上拉寄存器GPBUP也是也是11位有效,位有效,0表示對應(yīng)引腳設(shè)置上拉,表示對應(yīng)引腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPBCON0 x5600 0010讀/寫端口B引腳配置寄存器0 x0GPBDAT0 x5600 0014讀/寫端口B數(shù)據(jù)寄存器-GPBUP0 x5600 0018讀/寫端口B上拉寄存器0 x0保留0 x5600 001C-保留-39-端口端口C寄存器及引腳配置寄存器及引腳配置端口端口C有有16個輸入個輸入/輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPCCON中的每兩位對應(yīng)中的每兩位對應(yīng)一根引腳
43、。一根引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口C的數(shù)據(jù)寄存器的數(shù)據(jù)寄存器GPCDAT為為16位有效值。上拉寄存器位有效值。上拉寄存器GPBUP也是也是16位有效,位有效,0表示對應(yīng)引腳設(shè)置上拉,表示對應(yīng)引腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPCCON0 x5600 0020讀/寫端口C引腳配置寄存器0 x0GPCDAT0 x5600 0024讀/寫端口C數(shù)據(jù)寄存器-GPCUP0 x5600 0028讀/寫端口C上拉寄存器0 x0保留0 x5600 002C-保留-40-端
44、口端口D寄存器及引腳配置寄存器及引腳配置端口端口D有有16個輸入個輸入/輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPDCON中的每兩位對應(yīng)一中的每兩位對應(yīng)一根引腳。根引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口D的數(shù)據(jù)的數(shù)據(jù)寄存器寄存器GPDDAT為為16位有效值。上拉寄存器位有效值。上拉寄存器GPDUP也是也是16位有效,在上電時位有效,在上電時引腳引腳15:12無上拉功能,而無上拉功能,而11:0有上拉。該寄存器位設(shè)置為有上拉。該寄存器位設(shè)置為0表示對應(yīng)引表示對應(yīng)引腳設(shè)置上拉,腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器
45、寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPDCON0 x5600 0030讀/寫端口D引腳配置寄存器0 x0GPDDAT0 x5600 0034讀/寫端口D數(shù)據(jù)寄存器-GPDUP0 x5600 0038讀/寫端口D上拉寄存器0 x0保留0 x5600 003C-保留-41-端口端口E寄存器及引腳配置寄存器及引腳配置端口端口E有有16個輸入個輸入/輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPECON中的每兩位對應(yīng)一根中的每兩位對應(yīng)一根引腳。引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口E的數(shù)據(jù)寄的數(shù)據(jù)寄存器存器GPEDAT
46、為為16位有效值。上拉寄存器位有效值。上拉寄存器GPEUP也是也是16位有效,在上電時各位有效,在上電時各引腳均有上拉。該寄存器的位設(shè)置為引腳均有上拉。該寄存器的位設(shè)置為0表示對應(yīng)引腳設(shè)置上拉,表示對應(yīng)引腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPECON0 x5600 0040讀/寫端口E引腳配置寄存器0 x0GPEDAT0 x5600 0044讀/寫端口E數(shù)據(jù)寄存器-GPEUP0 x5600 0048讀/寫端口E上拉寄存器0 x0保留0 x5600 004C-保留-42-端口端口F寄存器及引腳配置寄存器及引腳配置端口端口F有有8個輸入個輸入/
47、輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPFCON中的每兩位對應(yīng)一根中的每兩位對應(yīng)一根引腳。引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口F的數(shù)據(jù)寄的數(shù)據(jù)寄存器存器GPFDAT為為8位有效值。上拉寄存器位有效值。上拉寄存器GPFUP也是也是8位有效,在上電時各引位有效,在上電時各引腳均有上拉。該寄存器的位設(shè)置為腳均有上拉。該寄存器的位設(shè)置為0表示對應(yīng)引腳設(shè)置上拉,表示對應(yīng)引腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPFCON0 x5600 0050讀/寫端口F引腳配置寄存器0
48、x0GPFDAT0 x5600 0054讀/寫端口F數(shù)據(jù)寄存器-GPFUP0 x5600 0058讀/寫端口F上拉寄存器0 x0保留0 x5600 005C-保留-43-端口端口G寄存器及引腳配置寄存器及引腳配置端口端口G有有16個輸入個輸入/輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPGCON中的每兩位對應(yīng)一中的每兩位對應(yīng)一根引腳。根引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口G的數(shù)據(jù)的數(shù)據(jù)寄存器寄存器GPGDAT為為16位有效值。上拉寄存器位有效值。上拉寄存器GPGUP也是也是16位有效,在上電時位有效,在上電時15:1
49、1引腳無上拉功能,其它引腳有上拉。該寄存器的位設(shè)置為引腳無上拉功能,其它引腳有上拉。該寄存器的位設(shè)置為0表示對應(yīng)引表示對應(yīng)引腳設(shè)置上拉,腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPGCON0 x5600 0060讀/寫端口G引腳配置寄存器0 x0GPGDAT0 x5600 0064讀/寫端口G數(shù)據(jù)寄存器-GPGUP0 x5600 0068讀/寫端口G上拉寄存器0 x0保留0 x5600 006C-保留-44-端口端口H寄存器及引腳配置寄存器及引腳配置端口端口H有有16個輸入個輸入/輸出引腳,其控制寄存器輸出引腳,其控制寄存器GPHCON中的每兩位
50、對應(yīng)一中的每兩位對應(yīng)一根引腳。根引腳。00表示輸入、表示輸入、01表示輸出、表示輸出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口H的數(shù)據(jù)的數(shù)據(jù)寄存器寄存器GPHDAT為為16位有效值。上拉寄存器位有效值。上拉寄存器GPHUP也是也是16位有效,在上電時位有效,在上電時15:11引腳無上拉功能,其它引腳有上拉。該寄存器的位設(shè)置為引腳無上拉功能,其它引腳有上拉。該寄存器的位設(shè)置為0表示對應(yīng)引表示對應(yīng)引腳設(shè)置上拉,腳設(shè)置上拉,1表示無上拉。表示無上拉。寄存器寄存器地址地址讀讀/寫寫說明說明復(fù)位值復(fù)位值GPHCON0 x5600 0060讀/寫端口H引腳配置寄存器0 x0GPHDAT0
51、x5600 0064讀/寫端口H數(shù)據(jù)寄存器-GPHUP0 x5600 0068讀/寫端口H上拉寄存器0 x0保留0 x5600 006C-保留-45-7.3.2 LED驅(qū)動程序代碼分析驅(qū)動程序代碼分析/*LED設(shè)備驅(qū)動的引腳定義*/static unsigned long led_tab = S3C2410_GPE3,S3C2410_GPE4,S3C2410_GPE5,;/*LED設(shè)備驅(qū)動文件操作結(jié)構(gòu)*/static struct file_operations led_fops = .ioctl = led_ioctl,;/*LED設(shè)備驅(qū)動自定義設(shè)備結(jié)構(gòu)*/static struct mis
52、cdevice led_dev = MISC_DYNAMIC_MINOR,led_dri,&led_fops;/* LED燈的狀態(tài) 1開,0閉*/#define LED_ON 1 #define LED_OFF 0 -46-led_tab程序與程序與LED直接相連的引腳,在電路中根據(jù)實際的連接直接相連的引腳,在電路中根據(jù)實際的連接情況可修改該部分的代碼,確定驅(qū)動的實際引腳。情況可修改該部分的代碼,確定驅(qū)動的實際引腳。在驅(qū)動程序中只給出在驅(qū)動程序中只給出ioctl函數(shù),該函數(shù)是函數(shù),該函數(shù)是file_operation中提供的中提供的一種硬件的操作方法。一種硬件的操作方法。在驅(qū)動程序中凡是與硬件
53、有關(guān)的除讀寫設(shè)備外的,其他的硬件操作在驅(qū)動程序中凡是與硬件有關(guān)的除讀寫設(shè)備外的,其他的硬件操作如:設(shè)備彈出、修改波特率等操作,都可以通過如:設(shè)備彈出、修改波特率等操作,都可以通過ioctl方法來實現(xiàn)。方法來實現(xiàn)。-47-7.3.3 LED驅(qū)動程序加載及測試驅(qū)動程序加載及測試測試程序是在開發(fā)完成后為檢測軟件系統(tǒng)的性能是否正常,內(nèi)部數(shù)測試程序是在開發(fā)完成后為檢測軟件系統(tǒng)的性能是否正常,內(nèi)部數(shù)據(jù)結(jié)構(gòu)是否有效的一種程序。據(jù)結(jié)構(gòu)是否有效的一種程序。通過檢測,可以對設(shè)備或系統(tǒng)的功能的正確性進行測定,并在顯示通過檢測,可以對設(shè)備或系統(tǒng)的功能的正確性進行測定,并在顯示器上給出相應(yīng)的信息。器上給出相應(yīng)的信息。測
54、試程序是進行軟件測試的一種常用的測試手段,對于不同的人群,測試程序是進行軟件測試的一種常用的測試手段,對于不同的人群,測試方法也各不相同。測試方法也各不相同。-48-在測試程序中包含了標(biāo)準(zhǔn)的輸入輸出庫,文件操作庫等。在驅(qū)動的在測試程序中包含了標(biāo)準(zhǔn)的輸入輸出庫,文件操作庫等。在驅(qū)動的編寫過程中,沒有編寫過程中,沒有main函數(shù)可能會讓很多從事函數(shù)可能會讓很多從事C語言開發(fā)的程序員感語言開發(fā)的程序員感到茫然。在測試程序中到茫然。在測試程序中main函數(shù)是必不可少的,在下面的測試代碼中函數(shù)是必不可少的,在下面的測試代碼中主要的功能代碼都被放到了主要的功能代碼都被放到了main函數(shù)中來實現(xiàn)。在函數(shù)中來
55、實現(xiàn)。在main函數(shù)中給出了函數(shù)中給出了兩個參數(shù),分別是兩個參數(shù),分別是argc和和argv。其中。其中argc表示了存放在地址指針參數(shù)表示了存放在地址指針參數(shù)argv中的參數(shù)的個數(shù)。中的參數(shù)的個數(shù)。-49-在在AD轉(zhuǎn)換器進行模數(shù)轉(zhuǎn)換的過程中,其主要的技術(shù)指標(biāo)如下:轉(zhuǎn)換器進行模數(shù)轉(zhuǎn)換的過程中,其主要的技術(shù)指標(biāo)如下:l分辯率:又稱精,是指數(shù)字量變化一個最小量時模擬信號的變化量,分辯率:又稱精,是指數(shù)字量變化一個最小量時模擬信號的變化量,定義為滿刻度與定義為滿刻度與2n的比值,通常以數(shù)字信號的位數(shù)來表示。的比值,通常以數(shù)字信號的位數(shù)來表示。 l轉(zhuǎn)換速率:是指完成一次從模擬信號轉(zhuǎn)換到數(shù)字信號的轉(zhuǎn)換所
56、需的時轉(zhuǎn)換速率:是指完成一次從模擬信號轉(zhuǎn)換到數(shù)字信號的轉(zhuǎn)換所需的時間的倒數(shù)。積分型間的倒數(shù)。積分型AD轉(zhuǎn)換器的轉(zhuǎn)換時間是毫秒級屬于低速轉(zhuǎn)換器的轉(zhuǎn)換時間是毫秒級屬于低速AD轉(zhuǎn)換器;逐轉(zhuǎn)換器;逐次比較型次比較型AD轉(zhuǎn)換器的轉(zhuǎn)換時間是微秒級屬于中速轉(zhuǎn)換器的轉(zhuǎn)換時間是微秒級屬于中速AD轉(zhuǎn)換器;全并行和串轉(zhuǎn)換器;全并行和串并行型的并行型的AD轉(zhuǎn)換器的轉(zhuǎn)換速度可達到納秒級。轉(zhuǎn)換器的轉(zhuǎn)換速度可達到納秒級。A/D轉(zhuǎn)換器驅(qū)動程序設(shè)計轉(zhuǎn)換器驅(qū)動程序設(shè)計-50-l采樣時間:是指兩次采樣時間:是指兩次AD轉(zhuǎn)換的時間間隔。在轉(zhuǎn)換過程中為了確保每一次轉(zhuǎn)換的時間間隔。在轉(zhuǎn)換過程中為了確保每一次轉(zhuǎn)化都能被正常的完成,要求轉(zhuǎn)換
57、的采樣速率必須小于或等于轉(zhuǎn)換速率。轉(zhuǎn)化都能被正常的完成,要求轉(zhuǎn)換的采樣速率必須小于或等于轉(zhuǎn)換速率。 l量化誤差:是由于量化誤差:是由于AD轉(zhuǎn)換中的有限的分辯率引起的誤差,即有限分辯率轉(zhuǎn)換中的有限的分辯率引起的誤差,即有限分辯率AD的階梯狀轉(zhuǎn)移特性曲線與無限分辯率的階梯狀轉(zhuǎn)移特性曲線與無限分辯率AD的轉(zhuǎn)移特性曲線之間的最大偏的轉(zhuǎn)移特性曲線之間的最大偏差。通常情況下是差。通常情況下是1個或半個最小數(shù)字量的模擬變化量,表示為個或半個最小數(shù)字量的模擬變化量,表示為1LSB或或1/2LSB。 l偏移誤差:是輸入信號為零時輸出的不為零的值,該值的到小與電路、偏移誤差:是輸入信號為零時輸出的不為零的值,該值
58、的到小與電路、溫度等條件有關(guān),通過外接電位器可將偏移誤差調(diào)至最小。溫度等條件有關(guān),通過外接電位器可將偏移誤差調(diào)至最小。 -51-l滿刻度誤差:是指滿度輸出時對應(yīng)的輸入信號與理想輸入信號值之差。滿刻度誤差:是指滿度輸出時對應(yīng)的輸入信號與理想輸入信號值之差。 l線性度:是實際的線性度:是實際的AD轉(zhuǎn)換器的轉(zhuǎn)移曲線與理想的轉(zhuǎn)換直線的最大偏移。轉(zhuǎn)換器的轉(zhuǎn)移曲線與理想的轉(zhuǎn)換直線的最大偏移。7.4.1 S3C2410X中斷控制器中斷控制器中斷是處理器提供的快速反應(yīng)的通道,在正常的執(zhí)行流程中,中斷的到來中斷是處理器提供的快速反應(yīng)的通道,在正常的執(zhí)行流程中,中斷的到來可以使得程序的執(zhí)行被中止,處理器根據(jù)中斷源
59、等信息,跳轉(zhuǎn)到相應(yīng)的中可以使得程序的執(zhí)行被中止,處理器根據(jù)中斷源等信息,跳轉(zhuǎn)到相應(yīng)的中斷程序入口處開始執(zhí)行中斷處理程序,處理完畢之后返回被暫停的斷點,斷程序入口處開始執(zhí)行中斷處理程序,處理完畢之后返回被暫停的斷點,或者是通過進程調(diào)度執(zhí)行當(dāng)前就緒的最高優(yōu)先執(zhí)行進程?;蛘呤峭ㄟ^進程調(diào)度執(zhí)行當(dāng)前就緒的最高優(yōu)先執(zhí)行進程。S3C2410X有有56個中斷源。個中斷源。-52-中斷源中斷源描述描述優(yōu)先權(quán)仲裁組優(yōu)先權(quán)仲裁組INT_ADCADC EOC和觸摸中斷(INT_ADC/INT_TC)ARB5INT_RTCRTC告警中斷ARB5INT_SPI1SPI1中斷ARB5INT_UART0UART0中斷(ERR
60、,RXD,TXD)ARB5INT_IICIIC中斷ARB4INT_USBHUSB主機中斷ARB4INT_USBDUSB從設(shè)備中斷ARB4保留保留ARB4INT_UART1UART1中斷(ERR,RXD,TXD)ARB4INT_SPI0SPI0中斷ARB4INT_SDISI中斷ARB3INT_DMA3DMA通道3中斷ARB3INT_DMA2DMA通道2中斷ARB3INT_DMA1DMA通道1中斷ARB3INT_DMA0DMA通道0中斷ARB3INT_LCDLCD 中斷(INT_FrSyn 和INT_FiCnt)ARB3-53-中斷源中斷源描述描述優(yōu)先權(quán)仲裁組優(yōu)先權(quán)仲裁組INT_UART2UART
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年護士職業(yè)資格考試試題及答案
- 七下語文測試題及答案
- 水電材料合同協(xié)議書范本
- 文檔氫氣質(zhì)量測量和化學(xué)監(jiān)督課件
- 2025年氫氧化亞鎳合作協(xié)議書
- 澳大利亞市場拓展:海外分公司注冊與運營管理合同
- 智能家居產(chǎn)品全國分銷網(wǎng)絡(luò)布局及市場開發(fā)合同
- 網(wǎng)絡(luò)游戲IP授權(quán)與衍生品制作合作協(xié)議
- 拼多多品牌店鋪綜合營銷策略執(zhí)行與合作合同
- 共享辦公空間戰(zhàn)略合作伙伴協(xié)議
- 海底撈火鍋店各崗位職責(zé)
- 發(fā)證機關(guān)所在地區(qū)代碼表
- 愛蓮說-王崧舟
- 小微企業(yè)信用評級標(biāo)準(zhǔn)模板
- 車輛安全設(shè)施設(shè)備定期檢查臺賬
- Q∕GDW 10799.7-2020 國家電網(wǎng)有限公司電力安全工作規(guī)程 第7部分:調(diào)相機部分
- 田中靖久頸椎病癥狀量表20分法
- 人教版小學(xué)五年級數(shù)學(xué)競賽試題及答案
- 新設(shè)備驗收標(biāo)準(zhǔn)
- 屋面掛瓦技術(shù)交底鋼掛瓦條
- 湖北群藝積分制管理方案計劃
評論
0/150
提交評論