Linux字符設(shè)備驅(qū)動(dòng)_第1頁
免費(fèi)預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

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

文檔簡介

1、linux字符設(shè)備驅(qū)動(dòng)/*linux字符設(shè)備驅(qū)動(dòng)源代碼sd.c*/ ilude linux/init.h /*模塊頭文件*/ include linux/mole.h include linux/types.h /*dev_t頭文件*/ include linux/kdev_t.h /*major和minor宏頭文件*/ include linux/fs.h /*register_ch_region等函數(shù) _operations結(jié)構(gòu)體*/ include linux/cdev.h /*suct cdev結(jié)構(gòu)體*/ include asm/uaccess.h /*copy_to_user函數(shù)*/

2、 define device_name sc /*定義設(shè)備名*/ define device_major 250 struct cdev my_cdev; int scdd_open(struct inode *inode,structfile *filp) return0; int scdd_close(struct inode *inode,structfile *filp) return0; ssize_t scdd_read(struct file *filp,char_user *buff,size_t size,loff_t *offp) intleft; chardata=1;

3、for(left=size;left left-) /*拷貝數(shù)據(jù)到用戶空間*/ copy_to_user(buff, data,1); buff returnsize; ssize_t scdd_(struct file *filp,char_user *buff,size_t size,loff_t *offp) return0; /*file_operations結(jié)構(gòu)體*/ struct file_operations scdd_fops= .owner=this_module, .read=scdd_read, .write=scdd_write, .open=scdd_open, .r

4、elease=scdd_close, ; ic int _init scdd_init(vo) /*模塊初始化函數(shù)*/ intsmajor; smajor=device_major; dev_tdev_n=mkdev(smajor,0); /*申請?jiān)O(shè)備號(hào)*/ if(!register_chrdev_region(dev_n,1,device_name) /*靜態(tài)申請*/ printk( registerccessn ee gotoregister_error; /*else /*動(dòng)態(tài)申請*/ /*alloc_chrdev_region( dev_n,0,1,device_name); smaj

5、or=major(dev_n); */ /*初始化cdev結(jié)構(gòu)體*/ cdev_init( my_cdev, scdd_fops); my_cdev.owner=this_module; my_cdev.ops= scdd_fops; /*注冊字符設(shè)備*/ cdev_add( my_cdev,dev_n,1); return0; register_error: unregister_chrdev_region(mkdev(device_major,0),1); return0; static void _it scdd_exit(void) /*模塊卸載函數(shù)*/ cdev_del( my_cd

6、ev); unregister_chrdev_region(mkdev(device_major,0),1); module_init(scdd_init); module_exit(scdd_exit); module_license( dual bsd/gpl 這個(gè)程序只是容易演示字符注冊的一個(gè)完整過程,并不帶有復(fù)雜的操作,調(diào)用read時(shí)向用戶空間寫全1 要點(diǎn): 1.設(shè)備號(hào),主設(shè)備號(hào)用來標(biāo)識(shí)設(shè)備所對應(yīng)的驅(qū)動(dòng)程序,同一個(gè)驅(qū)動(dòng)程序可以對應(yīng)多個(gè)設(shè)備,次設(shè)備號(hào)就是用來區(qū)別采納同一個(gè)驅(qū)動(dòng)程序的不同設(shè)備文件。 內(nèi)核中采納dev_t來描述設(shè)備號(hào),其實(shí)dev_t實(shí)質(zhì)為unsign int類型,其中高12位

7、為主設(shè)備號(hào),低20位為次設(shè)備號(hào),其定義在linux/types.h中 從dev_t中分解出主設(shè)備號(hào)和次設(shè)備號(hào) major(dev_t dev) minor(dev_t dev) 將主設(shè)備號(hào)和次設(shè)備號(hào)轉(zhuǎn)換成dev_t類型 mkdev(intmajor,int minor) 2.申請?jiān)O(shè)備號(hào) 靜態(tài)申請,函數(shù)定義在linux/fs.h中 int register_chrdev_region(dev_t from,unsigned count,const char *name) from是申請?jiān)O(shè)備號(hào)起始 ,from次設(shè)備號(hào)常常被置成0,count是所哀求延續(xù)設(shè)備號(hào)個(gè)數(shù),name是該設(shè)備號(hào)范圍關(guān)聯(lián)的名稱,

8、它將浮現(xiàn)在/proc/device和sysfs中。 分配勝利返回0,錯(cuò)誤狀況下,將返回一個(gè)負(fù)的錯(cuò)誤碼,并且不能用法所哀求的設(shè)備號(hào)。 動(dòng)態(tài)申請 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) 申請的設(shè)備號(hào)將保存在dev中,baseminor為所申請的第一個(gè)次設(shè)備號(hào) 無論哪種方式申請?jiān)O(shè)備號(hào),不用法時(shí)要釋放設(shè)備號(hào) void unregister_chrdev_region(dev_t first,unsigned int count) 3.三個(gè)重要的結(jié)構(gòu) struct

9、file_operations struct file struct inode struct file_operations一個(gè)函數(shù)指針集合,定義能在設(shè)備上舉行的操作,常用的有: int (*open)(structinode *inode,stuuct file *filep) void (*release)(structinode *inode,struct file *filep) ssize_t(*read)(struct file *filep,char _user *buff,size_t size,loff_t *offp) ssize_t(*write)(struct fil

10、e *filep,char _user *buff,size_t seze,loff_t * offp) int(*ioctl)(struct inode *inode,struct file *filep,unsigned int cmd,unsigned longarg) off_t(*llseek)(struct file *filp,loff_t,int) struct file表示一個(gè)打開的文件,一個(gè)文件被打開十次,則有10個(gè)structfile結(jié)構(gòu) struct file結(jié)構(gòu)成員有: mode_t f_mode 文件模式,例如:可讀可寫 lofft_t f_pos 當(dāng)前讀/寫位置

11、struct file_operations *f_op 與文件相關(guān)操作,執(zhí)行open操作時(shí)對這個(gè)指針賦 void *private_data在open時(shí)置為null,用于跨系統(tǒng)調(diào)用時(shí)保存十分實(shí)用的資源 struct inode用來記錄文件的物理上的信息,一個(gè)文件被打開10次,但惟獨(dú)一個(gè)structinode結(jié)構(gòu),struct inode結(jié)構(gòu)成員如下: dev_t i_rdev 用來保存設(shè)備號(hào) struct cdev*i_cdev 指向字符設(shè)備結(jié)構(gòu)struct cdev的指針 4.字符設(shè)備的注冊 內(nèi)核用法struct cdev結(jié)構(gòu)表示字符設(shè)備,定義在linux/cdev.h中。 初始化cdev

12、結(jié)構(gòu)體有兩種方式 靜態(tài): struct cdev my_cdev; cdev_init( my_cdev, fops); my_cdev.owner = this_module; 動(dòng)態(tài)(就是通過kmalloc去申請cdev結(jié)構(gòu)): struct cdev *my_cdev = cdev_alloc(); my_cdev- ops= my_fops; my_cdev.owner= this_module; 注冊 int cdev_add(struct cdev *dev,dev_t num,unsigned int count) num是設(shè)備號(hào),count常常取1 注銷 void cdev_del(struct cd

溫馨提示

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

評(píng)論

0/150

提交評(píng)論