第7章嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)(inode解釋說(shuō)明)_第1頁(yè)
第7章嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)(inode解釋說(shuō)明)_第2頁(yè)
第7章嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)(inode解釋說(shuō)明)_第3頁(yè)
第7章嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)(inode解釋說(shuō)明)_第4頁(yè)
第7章嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)(inode解釋說(shuō)明)_第5頁(yè)
已閱讀5頁(yè),還剩130頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 第第7 7章章 嵌入式嵌入式LinuxLinux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1 嵌入式嵌入式Linux的設(shè)備管理的設(shè)備管理7.2 設(shè)備驅(qū)動(dòng)模塊化編程設(shè)備驅(qū)動(dòng)模塊化編程7.3 GPIO字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)7.4 A/D轉(zhuǎn)換器驅(qū)動(dòng)程序設(shè)計(jì)轉(zhuǎn)換器驅(qū)動(dòng)程序設(shè)計(jì)7.5 IC卡驅(qū)動(dòng)程序設(shè)計(jì)卡驅(qū)動(dòng)程序設(shè)計(jì)7.6 內(nèi)核驅(qū)動(dòng)程序設(shè)計(jì)內(nèi)核驅(qū)動(dòng)程序設(shè)計(jì)觸摸屏驅(qū)動(dòng)程序觸摸屏驅(qū)動(dòng)程序第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 第第7章章 嵌入式嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1 嵌入式嵌入式Linux的設(shè)備管理的設(shè)備管理設(shè)備驅(qū)動(dòng)

2、程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層講,是內(nèi)核中具有最高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層硬件處理例程。完成以下功能:硬件處理例程。完成以下功能: 對(duì)設(shè)備初始化和釋放;對(duì)設(shè)備初始化和釋放; 對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的操對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的操作接口;作接口; 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或者回送應(yīng)用程序請(qǐng)求讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或者回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);的數(shù)據(jù); 檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)

3、誤。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 整個(gè)設(shè)備管理子系統(tǒng)的結(jié)構(gòu)如圖整個(gè)設(shè)備管理子系統(tǒng)的結(jié)構(gòu)如圖7.1 所示。所示。 圖圖7.1設(shè)備管理系統(tǒng)結(jié)構(gòu)設(shè)備管理系統(tǒng)結(jié)構(gòu) 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1.1 設(shè)備驅(qū)動(dòng)和文件系統(tǒng)的關(guān)系設(shè)備驅(qū)動(dòng)和文件系統(tǒng)的關(guān)系 open 打開(kāi)設(shè)備準(zhǔn)備打開(kāi)設(shè)備準(zhǔn)備I/O操作。操作。 其調(diào)用格式為其調(diào)用格式為: :int open(char *filename, int access); 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) close close() close close()函數(shù)的作用是關(guān)閉由函數(shù)的作用是關(guān)閉由open()open()函數(shù)打開(kāi)的函

4、數(shù)打開(kāi)的文件文件, , 其調(diào)用格式為其調(diào)用格式為: :int close(int handle);int close(int handle);該函數(shù)關(guān)閉文件描述字該函數(shù)關(guān)閉文件描述字handle handle 相連的文件。相連的文件。 read 從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖區(qū)的從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖區(qū)的I/O 操作,一般操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。是從緩沖區(qū)里讀數(shù)據(jù)。 write write 往設(shè)備上寫數(shù)據(jù),對(duì)于有緩沖區(qū)的往設(shè)備上寫數(shù)據(jù),對(duì)于有緩沖區(qū)的I/O I/O 操作,一操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。般是把數(shù)據(jù)寫入緩沖區(qū)里。write()write()函數(shù)的調(diào)用格式為:函數(shù)的調(diào)用格式

5、為:int write(int handle, void int write(int handle, void * *buf, int count);buf, int count);write()write()函數(shù)把函數(shù)把count count 個(gè)字節(jié)從個(gè)字節(jié)從buf buf 指向的緩沖區(qū)寫入與指向的緩沖區(qū)寫入與handle handle 相連的文件中,返回值為實(shí)際寫入的字節(jié)數(shù)。相連的文件中,返回值為實(shí)際寫入的字節(jié)數(shù)。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) ioctl ioctl主要用于對(duì)設(shè)備進(jìn)行讀寫之外的其他控制。主要用于對(duì)設(shè)備進(jìn)行讀寫之外的其他控制。用戶空間的用戶空間的ioctl io

6、ctl 函數(shù)的原型為:函數(shù)的原型為:int ioctl(inf fd,int cmd,)int ioctl(inf fd,int cmd,)其中的其中的代表可變數(shù)目的參數(shù)表,實(shí)際中是一個(gè)可選參數(shù),一般定代表可變數(shù)目的參數(shù)表,實(shí)際中是一個(gè)可選參數(shù),一般定義為義為: :int ioctl(inf fd,int cmd,char int ioctl(inf fd,int cmd,char * *argp)argp)驅(qū)動(dòng)程序中定義的驅(qū)動(dòng)程序中定義的ioctl ioctl 方法原型為:方法原型為:int (int (* *ioctl) (struct inode ioctl) (struct inode

7、 * *inode, struct file inode, struct file * *file,unsigned int cmd, unsigned long arg)file,unsigned int cmd, unsigned long arg)inode inode 和和filp filp 兩個(gè)指針對(duì)應(yīng)應(yīng)用程序傳遞的文件描述符兩個(gè)指針對(duì)應(yīng)應(yīng)用程序傳遞的文件描述符fdfd、cmd cmd 不會(huì)被修改地傳遞給驅(qū)動(dòng)程序,可選的參數(shù)不會(huì)被修改地傳遞給驅(qū)動(dòng)程序,可選的參數(shù)arg arg 則無(wú)論用戶應(yīng)用程則無(wú)論用戶應(yīng)用程序使用的是指針還是其他類型值,都以序使用的是指針還是其他類型值,都以u(píng)nsi

8、gned long unsigned long 的形式傳遞的形式傳遞給驅(qū)動(dòng)。給驅(qū)動(dòng)。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1.2 設(shè)備類型設(shè)備類型 Linux 中的設(shè)備可以分為三類:中的設(shè)備可以分為三類: 字符設(shè)備字符設(shè)備 塊設(shè)備塊設(shè)備 網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備。 一個(gè)運(yùn)行的一個(gè)運(yùn)行的linux linux 系統(tǒng),當(dāng)前使用的設(shè)系統(tǒng),當(dāng)前使用的設(shè)備可以通過(guò)文件備可以通過(guò)文件/proc/devices/proc/devices 查看。查看。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1.3 設(shè)備號(hào)設(shè)備號(hào) linux/uclinux linux/uclinux 內(nèi)核還需要內(nèi)核還需要 : :主設(shè)備

9、號(hào)主設(shè)備號(hào)標(biāo)識(shí)設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序。系統(tǒng)中不同標(biāo)識(shí)設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序。系統(tǒng)中不同的設(shè)備可以有相同的主設(shè)備號(hào),主設(shè)備號(hào)相同的的設(shè)備可以有相同的主設(shè)備號(hào),主設(shè)備號(hào)相同的設(shè)備使用相同的驅(qū)動(dòng)程序。設(shè)備使用相同的驅(qū)動(dòng)程序。 次設(shè)備號(hào)次設(shè)備號(hào)用來(lái)區(qū)分具體驅(qū)動(dòng)程序的實(shí)例。一個(gè)主用來(lái)區(qū)分具體驅(qū)動(dòng)程序的實(shí)例。一個(gè)主設(shè)備號(hào)可能有多個(gè)設(shè)備與之對(duì)應(yīng),這多個(gè)設(shè)備正設(shè)備號(hào)可能有多個(gè)設(shè)備與之對(duì)應(yīng),這多個(gè)設(shè)備正是在驅(qū)動(dòng)程序內(nèi)通過(guò)次設(shè)備號(hào)來(lái)進(jìn)一步區(qū)分的。是在驅(qū)動(dòng)程序內(nèi)通過(guò)次設(shè)備號(hào)來(lái)進(jìn)一步區(qū)分的。次設(shè)備號(hào)只能由設(shè)備驅(qū)動(dòng)程序使用,內(nèi)核的其他次設(shè)備號(hào)只能由設(shè)備驅(qū)動(dòng)程序使用,內(nèi)核的其他部分僅將它作為參數(shù)傳遞給驅(qū)動(dòng)程序。部分僅將它作為參數(shù)

10、傳遞給驅(qū)動(dòng)程序。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 字符型設(shè)備主設(shè)備號(hào)的添加和注銷字符型設(shè)備主設(shè)備號(hào)的添加和注銷 字符型設(shè)備主設(shè)備號(hào)的添加和注銷分別通過(guò)調(diào)用函數(shù)字符型設(shè)備主設(shè)備號(hào)的添加和注銷分別通過(guò)調(diào)用函數(shù)register_chrdev()register_chrdev()和和unregister_chrdev()unregister_chrdev()實(shí)現(xiàn),這兩實(shí)現(xiàn),這兩個(gè)函數(shù)原型在個(gè)函數(shù)原型在文件說(shuō)明。文件說(shuō)明。extern int register_chrdev(unsigned int major, extern int register_chrdev(unsigned int m

11、ajor, const char const char * *name, struct file_operations name, struct file_operations * *fops);fops);extern int unregister_chrdev(unsigned int major, extern int unregister_chrdev(unsigned int major, const char const char * *name);name);第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1.4 設(shè)備驅(qū)動(dòng)中關(guān)鍵數(shù)據(jù)結(jié)構(gòu)設(shè)備驅(qū)動(dòng)中關(guān)鍵數(shù)據(jù)結(jié)構(gòu) 在在linuxlinu

12、x系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序所提供系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序所提供的這組入口點(diǎn)由一個(gè)文件操作結(jié)構(gòu)進(jìn)行說(shuō)的這組入口點(diǎn)由一個(gè)文件操作結(jié)構(gòu)進(jìn)行說(shuō)明,分別是明,分別是: : file_operationsfile_operations數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) inodeinode數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) filefile數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu), 它們定義于它們定義于Linux/fs.hLinux/fs.h文件中。文件中。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 1. file_operations數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) struct file_operations struct file_operations struct module

13、struct module * *owner;owner;loff_t (loff_t (* *llseek) (struct file llseek) (struct file * *, loff_t, int);, loff_t, int);ssize_t (ssize_t (* *read) (struct file read) (struct file * *, char , char * *, size_t, loff_t , size_t, loff_t * *););ssize_t (ssize_t (* *write) (struct file write) (struct f

14、ile * *, const char , const char * *, size_t, loff_t , size_t, loff_t * *););int (int (* *readdir) (struct file readdir) (struct file * *, void , void * *, filldir_t);, filldir_t);unsigned int (unsigned int (* *poll) (struct file poll) (struct file * *, struct poll_table_struct , struct poll_table_s

15、truct * *););int (int (* *ioctl) (struct inode ioctl) (struct inode * *, struct file , struct file * *, unsigned int, unsigned , unsigned int, unsigned long);long);int (int (* *mmap) (struct file mmap) (struct file * *, struct vm_area_struct , struct vm_area_struct * *););int (int (* *open) (struct

16、inode open) (struct inode * *, struct file , struct file * *););int (int (* *flush) (struct file flush) (struct file * *););第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) int (int (* *release) (struct inode release) (struct inode * *, struct file , struct file * *););int (int (* *fsync) (struct file fsync) (struct file * *,

17、struct dentry , struct dentry * *, int datasync);, int datasync);int (int (* *fasync) (int, struct file fasync) (int, struct file * *, int);, int);int (int (* *lock) (struct file lock) (struct file * *, int, struct file_lock , int, struct file_lock * *););ssize_t (ssize_t (* *readv) (struct file rea

18、dv) (struct file * *, const struct iovec , const struct iovec * *, unsigned long, , unsigned long, loff_t loff_t * *););ssize_t (ssize_t (* *writev) (struct file writev) (struct file * *, const struct iovec , const struct iovec * *, unsigned long, , unsigned long, loff_t loff_t * *););ssize_t (ssize

19、_t (* *sendpage) (struct file sendpage) (struct file * *, struct page , struct page * *, int, size_t, , int, size_t, loff_t loff_t * *, int);, int);unsigned long (unsigned long (* *get_unmapped_area)(struct file get_unmapped_area)(struct file * *,unsigned ,unsigned long,unsigned long,unsigned long,

20、unsigned long);long,unsigned long,unsigned long, unsigned long);第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 在在file_operationsfile_operations數(shù)據(jù)結(jié)構(gòu)中,指出了設(shè)備驅(qū)動(dòng)程序所提供的入數(shù)據(jù)結(jié)構(gòu)中,指出了設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn)位置,分別是:口點(diǎn)位置,分別是:owner module owner module 的擁有者。的擁有者。lseeklseek移動(dòng)文件指針的位置,只能用于可以隨機(jī)存取的設(shè)備。移動(dòng)文件指針的位置,只能用于可以隨機(jī)存取的設(shè)備。readread進(jìn)行讀操作,進(jìn)行讀操作,bufbuf為存放讀取

21、結(jié)果的緩沖區(qū),為存放讀取結(jié)果的緩沖區(qū),countcount為所要為所要讀取的數(shù)據(jù)長(zhǎng)度。讀取的數(shù)據(jù)長(zhǎng)度。writewrite進(jìn)行寫操作,與進(jìn)行寫操作,與readread類似。類似。readdirreaddir只用于文件系統(tǒng),對(duì)設(shè)備無(wú)用。只用于文件系統(tǒng),對(duì)設(shè)備無(wú)用。selectselect進(jìn)行選擇操作。進(jìn)行選擇操作。ioctlioctl進(jìn)行讀、寫以外的其他操作。進(jìn)行讀、寫以外的其他操作。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) mmapmmap用于把設(shè)備的內(nèi)容映射到地址空間,一般只有塊設(shè)備驅(qū)用于把設(shè)備的內(nèi)容映射到地址空間,一般只有塊設(shè)備驅(qū)動(dòng)程序使用。動(dòng)程序使用。openopen打開(kāi)設(shè)備進(jìn)行打開(kāi)設(shè)備

22、進(jìn)行I/OI/O操作。返回操作。返回0 0表示成功,返回負(fù)數(shù)表示表示成功,返回負(fù)數(shù)表示失敗。失敗。releaserelease關(guān)閉設(shè)備并釋放資源。即關(guān)閉設(shè)備并釋放資源。即close close 操作。操作。 flushflush清除內(nèi)容,一般只用于網(wǎng)絡(luò)文件系統(tǒng)中。清除內(nèi)容,一般只用于網(wǎng)絡(luò)文件系統(tǒng)中。fsyncfsync實(shí)現(xiàn)內(nèi)存與設(shè)備的同步,如將內(nèi)存數(shù)據(jù)寫入硬盤。實(shí)現(xiàn)內(nèi)存與設(shè)備的同步,如將內(nèi)存數(shù)據(jù)寫入硬盤。fasyncfasync實(shí)現(xiàn)內(nèi)存與設(shè)備之間的異步通訊。實(shí)現(xiàn)內(nèi)存與設(shè)備之間的異步通訊。locklock文件鎖定,用于文件共享時(shí)的互斥訪問(wèn)。文件鎖定,用于文件共享時(shí)的互斥訪問(wèn)。readvreadv

23、在進(jìn)行讀操作前要驗(yàn)證地址是否可讀。在進(jìn)行讀操作前要驗(yàn)證地址是否可讀。writevwritev在進(jìn)行寫操作前要驗(yàn)證地址是否可寫。在進(jìn)行寫操作前要驗(yàn)證地址是否可寫。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 2 2 inodeinode數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)文件系統(tǒng)處理的文件所需要的信息在文件系統(tǒng)處理的文件所需要的信息在inodeinode(索引結(jié)點(diǎn))數(shù)據(jù)結(jié)構(gòu)中。(索引結(jié)點(diǎn))數(shù)據(jù)結(jié)構(gòu)中。InodeInode數(shù)數(shù)據(jù)結(jié)構(gòu)提供了關(guān)于特殊設(shè)備文件據(jù)結(jié)構(gòu)提供了關(guān)于特殊設(shè)備文件/dev/DriverName/dev/DriverName的信息,定義如下:的信息,定義如下: struct inodestruct ino

24、de稱做索引節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu),稱做索引節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu),inodeinode(索引結(jié)點(diǎn))數(shù)據(jù)結(jié)構(gòu)定義如下:(索引結(jié)點(diǎn))數(shù)據(jù)結(jié)構(gòu)定義如下:struct inode struct inode struct list_headstruct list_headi_hash; /i_hash; /指向哈希鏈表的指針指向哈希鏈表的指針struct list_headstruct list_headi_list; /i_list; /指向索引結(jié)點(diǎn)鏈表的指針指向索引結(jié)點(diǎn)鏈表的指針struct list_headstruct list_headi_dentry; /i_dentry; /指向目錄項(xiàng)鏈表的指針指向目錄項(xiàng)鏈

25、表的指針struct list_headstruct list_headi_dirty_buffers; /i_dirty_buffers; /指向指向“臟臟”緩沖區(qū)鏈表的指針緩沖區(qū)鏈表的指針struct list_headstruct list_headi_dirty_data_buffers; i_dirty_data_buffers; unsigned longunsigned longi_ino; /i_ino; /描述索引結(jié)點(diǎn)描述索引結(jié)點(diǎn)atomic_tatomic_ti_count; /i_count; /當(dāng)前使用該結(jié)點(diǎn)的進(jìn)程數(shù)當(dāng)前使用該結(jié)點(diǎn)的進(jìn)程數(shù)第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)

26、程序開(kāi)發(fā) kdev_tkdev_ti_dev; /i_dev; /設(shè)備類型設(shè)備類型umode_tumode_ti_mode; /i_mode; /文件類型文件類型nlink_tnlink_ti_nlink; /i_nlink; /與該結(jié)點(diǎn)建立鏈接的文件數(shù)與該結(jié)點(diǎn)建立鏈接的文件數(shù)uid_tuid_ti_uid; /i_uid; /文件擁有者的標(biāo)識(shí)號(hào)文件擁有者的標(biāo)識(shí)號(hào)gid_tgid_ti_gid; /i_gid; /文件擁有者的所在組的標(biāo)識(shí)號(hào)文件擁有者的所在組的標(biāo)識(shí)號(hào)kdev_tkdev_ti_rdev; /i_rdev; /實(shí)際設(shè)備標(biāo)識(shí)號(hào)實(shí)際設(shè)備標(biāo)識(shí)號(hào)loff_tloff_ti_size; /

27、i_size; /文件大小文件大小time_ttime_ti_atime; /i_atime; /文件最后訪問(wèn)的時(shí)間文件最后訪問(wèn)的時(shí)間time_ttime_ti_mtime; /i_mtime; /文件最后修改的時(shí)間文件最后修改的時(shí)間time_ttime_ti_ctime; /i_ctime; /結(jié)點(diǎn)最后修改的時(shí)間結(jié)點(diǎn)最后修改的時(shí)間unsigned intunsigned inti_blkbits; /i_blkbits; /位數(shù)位數(shù)unsigned longunsigned long i_blksize; /i_blksize; /塊大小塊大小unsigned longunsigned lo

28、ng i_blocks; /i_blocks; /文件所占用的塊數(shù)文件所占用的塊數(shù)unsigned longunsigned long i_version; /i_version; /版本號(hào)版本號(hào)struct semaphorestruct semaphorei_sem; /i_sem; /用于同步操作的信號(hào)量結(jié)構(gòu)用于同步操作的信號(hào)量結(jié)構(gòu)第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) struct semaphorestruct semaphorei_zombie; /i_zombie; /索引結(jié)點(diǎn)的信號(hào)量索引結(jié)點(diǎn)的信號(hào)量struct inode_operationsstruct inode_ope

29、rations* *i_op; /i_op; /索引結(jié)點(diǎn)操作索引結(jié)點(diǎn)操作struct file_operationsstruct file_operations* *i_fop; /i_fop; /指向文件操作的指針指向文件操作的指針struct super_blockstruct super_block* *i_sb; /i_sb; /指向讀文件系統(tǒng)超級(jí)塊指針指向讀文件系統(tǒng)超級(jí)塊指針wait_queue_head_twait_queue_head_ti_wait;i_wait; /指向索引結(jié)點(diǎn)等待隊(duì)列的指針指向索引結(jié)點(diǎn)等待隊(duì)列的指針struct file_lockstruct file_lo

30、ck* *i_flock; /i_flock; /指向文件加鎖鏈表的指針指向文件加鎖鏈表的指針struct address_spacestruct address_space * *i_mapping; /i_mapping; /把所有可交換的頁(yè)面管理起來(lái)把所有可交換的頁(yè)面管理起來(lái)struct address_spacestruct address_space i_data; /i_data; /數(shù)據(jù)數(shù)據(jù)struct dquotstruct dquot* *i_dquotMAXQUOTAS; /i_dquotMAXQUOTAS; /索引結(jié)點(diǎn)的磁盤限額索引結(jié)點(diǎn)的磁盤限額struct list_h

31、eadstruct list_headi_devices; /i_devices; /設(shè)備文件形成的鏈表設(shè)備文件形成的鏈表struct pipe_inode_infostruct pipe_inode_info* *i_pipe; /i_pipe; /指向管道文件指向管道文件struct block_devicestruct block_device* *i_bdev; /i_bdev; /指向塊設(shè)備文件的指針指向塊設(shè)備文件的指針struct char_devicestruct char_device * *i_cdev; /i_cdev; /指向字符設(shè)備文件的指針指向字符設(shè)備文件的指針uns

32、igned longunsigned longi_dnotify_mask; i_dnotify_mask; 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) struct dnotify_structstruct dnotify_struct* *i_dnotify; i_dnotify; unsigned longunsigned longi_state; /i_state; /索引結(jié)點(diǎn)狀態(tài)標(biāo)志索引結(jié)點(diǎn)狀態(tài)標(biāo)志unsigned intunsigned inti_flags; /i_flags; /文件系統(tǒng)的安裝標(biāo)志文件系統(tǒng)的安裝標(biāo)志unsigned charunsigned chari_sock;

33、 /i_sock; /是否是套接字文件是否是套接字文件atomic_tatomic_ti_writecount; /i_writecount; /寫進(jìn)程的引用計(jì)數(shù)寫進(jìn)程的引用計(jì)數(shù)unsigned intunsigned inti_attr_flags; /i_attr_flags; /文件創(chuàng)建標(biāo)志文件創(chuàng)建標(biāo)志u32u32i_generation; /i_generation; /保留保留union union struct minix_inode_info struct minix_inode_infominix_i;minix_i; struct jffs2_inode_info struc

34、t jffs2_inode_infojffs2_i;jffs2_i; void void* *generic_ip;generic_ip; u; u; ; 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 3file數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) struct file struct file struct list_headstruct list_headf_list; /f_list; /打開(kāi)的文件形成一個(gè)列表打開(kāi)的文件形成一個(gè)列表 struct dentrystruct dentry* *f_dentry; /f_dentry; /指向相關(guān)目錄項(xiàng)的指針指向相關(guān)目錄項(xiàng)的指針struct vfsmount str

35、uct vfsmount * *f_vfsmnt; /f_vfsmnt; /執(zhí)行執(zhí)行VFSVFS掛載點(diǎn)的指針掛載點(diǎn)的指針struct file_operationsstruct file_operations* *f_op; /f_op; /執(zhí)行文件操作的指針執(zhí)行文件操作的指針atomic_tatomic_tf_count; /f_count; /使用該結(jié)構(gòu)的進(jìn)程數(shù)使用該結(jié)構(gòu)的進(jìn)程數(shù)unsigned int unsigned int f_flags;/f_flags;/文件打開(kāi)的標(biāo)志,如讀寫等文件打開(kāi)的標(biāo)志,如讀寫等mode_tmode_tf_mode; /f_mode; /文件打開(kāi)的模式文件

36、打開(kāi)的模式第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) loff_tloff_tf_pos; /f_pos; /文件的當(dāng)前位置文件的當(dāng)前位置unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; / /* *預(yù)讀標(biāo)志、要預(yù)讀的最多頁(yè)面數(shù)、上次預(yù)讀后的文件指針、預(yù)預(yù)讀標(biāo)志、要預(yù)讀的最多頁(yè)面數(shù)、上次預(yù)讀后的文件指針、預(yù)讀的字節(jié)數(shù)以及預(yù)讀的頁(yè)面數(shù)讀的字節(jié)數(shù)以及預(yù)讀的頁(yè)面數(shù)* */ /struct fown_structstru

37、ct fown_structf_owner; /f_owner; /文件的所有者文件的所有者unsigned intunsigned intf_uid, f_gid; /f_uid, f_gid; /用戶的用戶的UIDUID和和GIDGIDintint f_error; /f_error; /網(wǎng)絡(luò)寫操作錯(cuò)誤碼網(wǎng)絡(luò)寫操作錯(cuò)誤碼unsigned longunsigned longf_version; /f_version; /版本號(hào)版本號(hào)voidvoid * *private_data; /ttyprivate_data; /tty驅(qū)動(dòng)程序使用驅(qū)動(dòng)程序使用struct kiobufstruct k

38、iobuf* *f_iobuf;f_iobuf;longlong f_iobuf_lock; f_iobuf_lock;第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) FileFile結(jié)構(gòu)中與驅(qū)動(dòng)相關(guān)的成員如下:結(jié)構(gòu)中與驅(qū)動(dòng)相關(guān)的成員如下:f_modef_mode標(biāo)識(shí)文件的讀寫權(quán)限標(biāo)識(shí)文件的讀寫權(quán)限f_posf_pos當(dāng)前讀寫位置,類型為當(dāng)前讀寫位置,類型為loff_t loff_t 是是64 64 位的數(shù),只能讀不位的數(shù),只能讀不能寫能寫; ;f_flagf_flag文件標(biāo)志,主要用于進(jìn)行阻塞文件標(biāo)志,主要用于進(jìn)行阻塞/ /非阻塞型操作時(shí)檢查非阻塞型操作時(shí)檢查f_opf_op文件操作的結(jié)構(gòu)指針,內(nèi)

39、核在文件操作的結(jié)構(gòu)指針,內(nèi)核在OPEN OPEN 時(shí)對(duì)此指針賦值。時(shí)對(duì)此指針賦值。private_data Openprivate_data Open系統(tǒng)調(diào)用在調(diào)用驅(qū)動(dòng)程序的系統(tǒng)調(diào)用在調(diào)用驅(qū)動(dòng)程序的open open 方法前,方法前,將此指針值將此指針值NULLNULL,驅(qū)動(dòng)程序可以將這個(gè)字段用于任何目的,一般,驅(qū)動(dòng)程序可以將這個(gè)字段用于任何目的,一般用它指向已經(jīng)分配的數(shù)據(jù),但在內(nèi)核銷毀用它指向已經(jīng)分配的數(shù)據(jù),但在內(nèi)核銷毀file file 結(jié)構(gòu)前要在結(jié)構(gòu)前要在release release 方法中釋放內(nèi)存。方法中釋放內(nèi)存。f_dentryf_dentry文件對(duì)應(yīng)的目錄項(xiàng)結(jié)構(gòu),一般在驅(qū)動(dòng)中用文

40、件對(duì)應(yīng)的目錄項(xiàng)結(jié)構(gòu),一般在驅(qū)動(dòng)中用filp-filp-f_dentry-d_inode f_dentry-d_inode 訪問(wèn)索引節(jié)點(diǎn)時(shí)用到它。訪問(wèn)索引節(jié)點(diǎn)時(shí)用到它。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.1.5 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)中基本函數(shù)設(shè)備驅(qū)動(dòng)開(kāi)發(fā)中基本函數(shù) 1I/O口函數(shù)口函數(shù) 1)int check_region(unsigned int from, unsigned int extent); 2)void request_region(unsigned int from, unsigned int extent,const char *name);3 3)void release_

41、region(unsigned int from, unsigned int extent);void release_region(unsigned int from, unsigned int extent);在申請(qǐng)了在申請(qǐng)了I/OI/O端口之后,可以借助端口之后,可以借助asm/io.hasm/io.h中的如下幾個(gè)函數(shù)來(lái)訪問(wèn)中的如下幾個(gè)函數(shù)來(lái)訪問(wèn)I/OI/O端口:端口:inline unsigned int inb(unsigned short port); /inline unsigned int inb(unsigned short port); /讀取某個(gè)端口的值讀取某個(gè)端口的值i

42、nline unsigned int inb_p(unsigned short port);inline unsigned int inb_p(unsigned short port);inline void outb(char value, unsigned short port);/inline void outb(char value, unsigned short port);/向某個(gè)端口賦值向某個(gè)端口賦值inline void outb_p(char value, unsigned short port);inline void outb_p(char value, unsigned

43、 short port);其中其中inb_pinb_p和和outb_poutb_p插入了一定的延時(shí)以適應(yīng)某些慢速的插入了一定的延時(shí)以適應(yīng)某些慢速的I/OI/O端口。端口。 可以查詢可以查詢/proc/ioports文件獲得當(dāng)前已經(jīng)分配的文件獲得當(dāng)前已經(jīng)分配的I/O地址。地址。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 2時(shí)鐘函數(shù)時(shí)鐘函數(shù) 與時(shí)鐘有關(guān)的系統(tǒng)調(diào)用有:與時(shí)鐘有關(guān)的系統(tǒng)調(diào)用有:#include #include #include #include struct timer_list struct timer_list struct timer_list struct timer_lis

44、t * *next;next;struct timer_list struct timer_list * *prev;prev;unsigned long expires;unsigned long expires;unsigned long data;unsigned long data;void (void (* *function)(unsigned long);function)(unsigned long);void add_timer(struct timer_list void add_timer(struct timer_list * * timer); timer);int

45、del_timer(struct timer_list int del_timer(struct timer_list * * timer); timer);inline void init_timer(struct timer_list inline void init_timer(struct timer_list * * timer); timer);第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 3 3內(nèi)存操作函數(shù)內(nèi)存操作函數(shù)#include /linux/kernel.h#include /linux/kernel.h里聲明了里聲明了kmalloc()kmalloc()和和kfree()k

46、free(),用于在,用于在內(nèi)核模式下申請(qǐng)和釋放內(nèi)存。內(nèi)核模式下申請(qǐng)和釋放內(nèi)存。void void * * kmalloc(unsigned int len, int priority); kmalloc(unsigned int len, int priority);void kfree(void void kfree(void * * obj); obj);其中其中l(wèi)enlen為申請(qǐng)的字節(jié)數(shù),為申請(qǐng)的字節(jié)數(shù),objobj為要釋放的內(nèi)存指針。為要釋放的內(nèi)存指針。prioritypriority為分為分配內(nèi)存操作的優(yōu)先級(jí)。配內(nèi)存操作的優(yōu)先級(jí)。與用戶模式下的與用戶模式下的malloc()mall

47、oc()不同,不同,kmalloc()kmalloc()申請(qǐng)空間有大小限制。申請(qǐng)空間有大小限制。長(zhǎng)度是長(zhǎng)度是2 2的整次方??梢陨暾?qǐng)的最大長(zhǎng)度也有限制。另外的整次方??梢陨暾?qǐng)的最大長(zhǎng)度也有限制。另外prioritypriority參數(shù),通常使用時(shí)可以為參數(shù),通常使用時(shí)可以為GFP_KERNELGFP_KERNEL,如果在中斷里調(diào)用,則用,如果在中斷里調(diào)用,則用GFP_ATOMICGFP_ATOMIC參數(shù),因?yàn)槭褂脜?shù),因?yàn)槭褂肎FP_KERNELGFP_KERNEL則調(diào)用者可能進(jìn)入則調(diào)用者可能進(jìn)入sleepsleep狀狀態(tài),在處理中斷時(shí)是不允許的。態(tài),在處理中斷時(shí)是不允許的。kfree()kf

48、ree()釋放的內(nèi)存必須是釋放的內(nèi)存必須是kmalloc()kmalloc()申請(qǐng)的。如果知道內(nèi)存的大小,也可以用申請(qǐng)的。如果知道內(nèi)存的大小,也可以用kfree_s()kfree_s()釋放。釋放。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 4 4復(fù)制函數(shù)復(fù)制函數(shù)在用戶程序調(diào)用在用戶程序調(diào)用readread、writewrite時(shí),因?yàn)檫M(jìn)程的運(yùn)行狀態(tài)由用戶態(tài)變?yōu)楹诵膽B(tài),地時(shí),因?yàn)檫M(jìn)程的運(yùn)行狀態(tài)由用戶態(tài)變?yōu)楹诵膽B(tài),地址空間也變?yōu)楹诵牡刂房臻g。由于址空間也變?yōu)楹诵牡刂房臻g。由于readread、writewrite中參數(shù)中參數(shù)bufbuf是指向用戶程序的私有是指向用戶程序的私有地址空間的,所以不能直

49、接訪問(wèn),必須通過(guò)下面兩個(gè)系統(tǒng)函數(shù)來(lái)訪問(wèn)用戶程序的地址空間的,所以不能直接訪問(wèn),必須通過(guò)下面兩個(gè)系統(tǒng)函數(shù)來(lái)訪問(wèn)用戶程序的私有地址空間。私有地址空間。# include # include void memcpy_fromfs(void void memcpy_fromfs(void * * to,const void to,const void * * from,unsigned long n); from,unsigned long n);void memcpy_tofs(void void memcpy_tofs(void * * to,const void to,const void *

50、* from,unsigned long n); from,unsigned long n);memcpy_fromfsmemcpy_fromfs由用戶程序地址空間往核心地址空間復(fù)制,由用戶程序地址空間往核心地址空間復(fù)制,memcpy_tofsmemcpy_tofs則反之。則反之。參數(shù)參數(shù)toto為復(fù)制的目的指針,為復(fù)制的目的指針,fromfrom為源指針,為源指針,n n為要復(fù)制的字節(jié)數(shù)。為要復(fù)制的字節(jié)數(shù)。在設(shè)備驅(qū)動(dòng)程序里,可以調(diào)用在設(shè)備驅(qū)動(dòng)程序里,可以調(diào)用printkprintk來(lái)打印一些調(diào)試信息,來(lái)打印一些調(diào)試信息,printkprintk的用法與的用法與printfprintf類似。類

51、似。printkprintk打印的信息不僅出現(xiàn)在屏幕上,同時(shí)還記錄在文件打印的信息不僅出現(xiàn)在屏幕上,同時(shí)還記錄在文件syslogsyslog里。里。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.2 設(shè)備驅(qū)動(dòng)模塊化編程設(shè)備驅(qū)動(dòng)模塊化編程 7.2.1 設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)流程設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)流程 (1 1)硬件接口設(shè)計(jì)或使用嵌入式處理器的生產(chǎn)商提供參考接口電)硬件接口設(shè)計(jì)或使用嵌入式處理器的生產(chǎn)商提供參考接口電路。路。(2 2)定義設(shè)備號(hào)。)定義設(shè)備號(hào)。(3 3)實(shí)現(xiàn)初始化函數(shù)。在驅(qū)動(dòng)程序中實(shí)現(xiàn)驅(qū)動(dòng)的注冊(cè)和卸載。)實(shí)現(xiàn)初始化函數(shù)。在驅(qū)動(dòng)程序中實(shí)現(xiàn)驅(qū)動(dòng)的注冊(cè)和卸載。(4 4)設(shè)計(jì)所要實(shí)現(xiàn)的文件操作,

52、定義)設(shè)計(jì)所要實(shí)現(xiàn)的文件操作,定義file_operationsfile_operations結(jié)構(gòu)。結(jié)構(gòu)。(5 5)實(shí)現(xiàn)所需的文件操作調(diào)用,如)實(shí)現(xiàn)所需的文件操作調(diào)用,如readread、writewrite等。等。(6 6)實(shí)現(xiàn)中斷服務(wù),并用)實(shí)現(xiàn)中斷服務(wù),并用request_irqrequest_irq向內(nèi)核注冊(cè)。向內(nèi)核注冊(cè)。(7 7)編譯該驅(qū)動(dòng)程序到內(nèi)核中,或者用)編譯該驅(qū)動(dòng)程序到內(nèi)核中,或者用insmodinsmod命令加載模塊。命令加載模塊。(8)測(cè)試該設(shè)備,編寫應(yīng)用程序,對(duì)驅(qū)動(dòng)程序進(jìn)行測(cè)試。)測(cè)試該設(shè)備,編寫應(yīng)用程序,對(duì)驅(qū)動(dòng)程序進(jìn)行測(cè)試。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)

53、7.2.2 內(nèi)核空間和用戶空間內(nèi)核空間和用戶空間 系統(tǒng)態(tài)系統(tǒng)態(tài): :在在Linux系統(tǒng)中,內(nèi)核在最高級(jí)執(zhí)行,也稱為系統(tǒng)中,內(nèi)核在最高級(jí)執(zhí)行,也稱為“系統(tǒng)態(tài)系統(tǒng)態(tài)”,在這一級(jí)任何操作都可以執(zhí)行。,在這一級(jí)任何操作都可以執(zhí)行。 用戶態(tài):用戶態(tài):而應(yīng)用程序則用戶態(tài)執(zhí)行在最低級(jí),所謂的而應(yīng)用程序則用戶態(tài)執(zhí)行在最低級(jí),所謂的“用戶態(tài)用戶態(tài)”,在這一級(jí)處理器禁止對(duì)硬件的直接訪問(wèn)和對(duì),在這一級(jí)處理器禁止對(duì)硬件的直接訪問(wèn)和對(duì)內(nèi)存的未授權(quán)訪問(wèn)。內(nèi)存的未授權(quán)訪問(wèn)。 內(nèi)核空間:內(nèi)核空間:模塊運(yùn)行的空間是在所謂的模塊運(yùn)行的空間是在所謂的“內(nèi)核空間內(nèi)核空間”; 用戶空間:用戶空間:應(yīng)用程序運(yùn)行的空間是在應(yīng)用程序運(yùn)行的空

54、間是在“用戶空間用戶空間” ” 。 它們分別引用不同的內(nèi)存映射,也就是程序代碼使用它們分別引用不同的內(nèi)存映射,也就是程序代碼使用不同的不同的“地址空間地址空間”。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.2.3 7.2.3 設(shè)備注冊(cè)和初始化設(shè)備注冊(cè)和初始化 int register_chrdev(unsigned int major, const char *name, struct file_ operations *fops); 注冊(cè)成功,設(shè)備名就會(huì)出現(xiàn)在注冊(cè)成功,設(shè)備名就會(huì)出現(xiàn)在/proc/dvices文件中。文件中。LinuxLinux在在/dev/dev目錄中為每個(gè)設(shè)備建立一個(gè)文

55、件,用目錄中為每個(gè)設(shè)備建立一個(gè)文件,用ls lls l命令列出函數(shù)返回值,命令列出函數(shù)返回值,若小于若小于0 0,則表示注冊(cè)失??;返回,則表示注冊(cè)失??;返回0 0或者大于或者大于0 0的值表示注冊(cè)成功。的值表示注冊(cè)成功。 int unregister_chrdev(unsigned int major, const char int unregister_chrdev(unsigned int major, const char * *name);name); 此函數(shù)的參數(shù)為主設(shè)備號(hào)此函數(shù)的參數(shù)為主設(shè)備號(hào)majormajor和設(shè)備名和設(shè)備名namename。LinuxLinux內(nèi)核把內(nèi)核把na

56、mename和和majormajor在內(nèi)核注冊(cè)的名稱對(duì)比,如果不相等,卸載失敗,并返回在內(nèi)核注冊(cè)的名稱對(duì)比,如果不相等,卸載失敗,并返回EINVALEINVAL;如果;如果majormajor大于最大的設(shè)備號(hào),也返回大于最大的設(shè)備號(hào),也返回EINVALEINVAL。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 設(shè)備驅(qū)動(dòng)的初始化函數(shù)主要完成的功能是有以下設(shè)備驅(qū)動(dòng)的初始化函數(shù)主要完成的功能是有以下5 5項(xiàng):項(xiàng):(1 1)對(duì)驅(qū)動(dòng)程序管理的硬件進(jìn)行必要的初始化。如:)對(duì)驅(qū)動(dòng)程序管理的硬件進(jìn)行必要的初始化。如:S3C2410XS3C2410X的的硬件寄存器設(shè)置。硬件寄存器設(shè)置。(2 2)初始化設(shè)備驅(qū)動(dòng)相關(guān)

57、的參數(shù)。如:設(shè)備變量及設(shè)備相關(guān)的參)初始化設(shè)備驅(qū)動(dòng)相關(guān)的參數(shù)。如:設(shè)備變量及設(shè)備相關(guān)的參數(shù)。數(shù)。(3 3)在內(nèi)核注冊(cè)設(shè)備。調(diào)用)在內(nèi)核注冊(cè)設(shè)備。調(diào)用register_chrdev()register_chrdev()函數(shù)來(lái)注冊(cè)設(shè)備。函數(shù)來(lái)注冊(cè)設(shè)備。(4 4)注冊(cè)中斷。如果設(shè)備需要)注冊(cè)中斷。如果設(shè)備需要IRQIRQ支持,則要使用支持,則要使用request_irq()request_irq()函數(shù)注冊(cè)中斷。函數(shù)注冊(cè)中斷。(5 5)其他初始化工作。主要包括給設(shè)備驅(qū)動(dòng)程序申請(qǐng)包括內(nèi)存、)其他初始化工作。主要包括給設(shè)備驅(qū)動(dòng)程序申請(qǐng)包括內(nèi)存、時(shí)鐘、時(shí)鐘、I/OI/O端口等在內(nèi)的系統(tǒng)資源,這些資源也可以

58、在端口等在內(nèi)的系統(tǒng)資源,這些資源也可以在openopen子程序子程序或者其他地方申請(qǐng)。這些資源不用時(shí),應(yīng)該釋放,以利于資源的共或者其他地方申請(qǐng)。這些資源不用時(shí),應(yīng)該釋放,以利于資源的共享。享。第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 內(nèi)核中驅(qū)動(dòng)程序的初始化函數(shù)如下方式聲明:內(nèi)核中驅(qū)動(dòng)程序的初始化函數(shù)如下方式聲明:int _init chr_driver_init(void);int _init chr_driver_init(void);其中其中_init_init是必不可少的,在系統(tǒng)啟動(dòng)時(shí)會(huì)由內(nèi)核調(diào)用是必不可少的,在系統(tǒng)啟動(dòng)時(shí)會(huì)由內(nèi)核調(diào)用chr_driver_initchr_driver_i

59、nit,完成驅(qū)動(dòng)程序的初始化。,完成驅(qū)動(dòng)程序的初始化。以模塊的形式編寫驅(qū)動(dòng)程序時(shí),則要按照如下方式聲明:以模塊的形式編寫驅(qū)動(dòng)程序時(shí),則要按照如下方式聲明:int init_module(void)int init_module(void)當(dāng)運(yùn)行后面介紹的當(dāng)運(yùn)行后面介紹的insmodinsmod命令插入模塊時(shí),會(huì)調(diào)用命令插入模塊時(shí),會(huì)調(diào)用init_moduleinit_module函數(shù)完成初始化工作。函數(shù)完成初始化工作。 第7章 嵌入式Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā) 7.2.4 中斷管理中斷管理 設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用request_irq函數(shù)來(lái)申請(qǐng)中斷,通過(guò)函數(shù)來(lái)申請(qǐng)中斷,通過(guò)f

60、ree_irq來(lái)釋放中斷。來(lái)釋放中斷。它們?cè)谒鼈冊(cè)趌inux/sched.h中的定義如下:中的定義如下:int request_irq(unsigned int irq, void (*handler)(int irq,void dev_id,struct pt_regs *regs), unsigned long flags, const char *device, void *dev_id );void free_irq(unsigned int irq, void *dev_id);從從request_irq函數(shù)返回的值為函數(shù)返回的值為0時(shí),表示申請(qǐng)成功;負(fù)值表示出現(xiàn)錯(cuò)誤。時(shí),表示申請(qǐng)成

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論