国产肉体XXXX裸体137大胆,国产成人久久精品流白浆,国产乱子伦视频在线观看,无码中文字幕免费一区二区三区 国产成人手机在线-午夜国产精品无套-swag国产精品-国产毛片久久国产

新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 嵌入式Linux設(shè)備驅(qū)動開發(fā)之:字符設(shè)備驅(qū)動編程

嵌入式Linux設(shè)備驅(qū)動開發(fā)之:字符設(shè)備驅(qū)動編程

作者: 時間:2013-09-13 來源:網(wǎng)絡 收藏

本文引用地址:http://m.ptau.cn/article/257111.htm

它們的函數(shù)格式如表11.3所示。

表11.3 設(shè)備號分配與釋放函數(shù)語法要點

所需頭文件

#includelinux/fs.h>

函數(shù)原型

intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name)

intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name)

voidunregister_chrdev_region(dev_tfirst,unsignedintcount)

函數(shù)傳入值

first:要分配的設(shè)備號的初始值

count:要分配(釋放)的設(shè)備號數(shù)目

name:要申請設(shè)備號的設(shè)備名稱(在/proc/devices和sysfs中顯示)

dev:動態(tài)分配的第一個設(shè)備號

函數(shù)返回值

成功:0(只限于兩種注冊函數(shù))

出錯:-1(只限于兩種注冊函數(shù))

(3)最新版本的字符設(shè)備注冊。

在獲得了系統(tǒng)分配的設(shè)備號之后,通過注冊設(shè)備才能實現(xiàn)設(shè)備號和驅(qū)動程序之間的關(guān)聯(lián)。這里講解2.6內(nèi)核中的字符設(shè)備的注冊和注銷過程。

在Linux內(nèi)核中使用structcdev結(jié)構(gòu)來描述字符設(shè)備,我們在驅(qū)動程序中必須將已分配到的設(shè)備號以及設(shè)備操作接口(即為structfile_operations結(jié)構(gòu))賦予structcdev結(jié)構(gòu)變量。首先使用cdev_alloc()函數(shù)向系統(tǒng)申請分配structcdev結(jié)構(gòu),再用cdev_init()函數(shù)初始化已分配到的結(jié)構(gòu)并與file_operations結(jié)構(gòu)關(guān)聯(lián)起來。最后調(diào)用cdev_add()函數(shù)將設(shè)備號與structcdev結(jié)構(gòu)進行關(guān)聯(lián)并向內(nèi)核正式報告新設(shè)備的注冊,這樣新設(shè)備可以被用起來了。

如果要從系統(tǒng)中刪除一個設(shè)備,則要調(diào)用cdev_del()函數(shù)。具體函數(shù)格式如表11.4所示。

表11.4 最新版本的字符設(shè)備注冊

所需頭文件

#includelinux/cdev.h>

函數(shù)原型

sturctcdev*cdev_alloc(void)

voidcdev_init(structcdev*cdev,structfile_operations*fops)

intcdev_add(structcdev*cdev,dev_tnum,unsignedintcount)

voidcdev_del(structcdev*dev)

函數(shù)傳入值

cdev:需要初始化/注冊/刪除的structcdev結(jié)構(gòu)

fops:該字符設(shè)備的file_operations結(jié)構(gòu)

num:系統(tǒng)給該設(shè)備分配的第一個設(shè)備號

count:該設(shè)備對應的設(shè)備號數(shù)量

函數(shù)返回值

成功:

cdev_alloc:返回分配到的structcdev結(jié)構(gòu)指針

cdev_add:返回0

出錯:

cdev_alloc:返回NULL

cdev_add:返回-1

2.6內(nèi)核仍然保留早期版本的register_chrdev()等字符設(shè)備相關(guān)函數(shù),其實從內(nèi)核代碼中可以發(fā)現(xiàn),在register_chrdev()函數(shù)的實現(xiàn)中用到cdev_alloc()和cdev_add()函數(shù),而在unregister_chrdev()函數(shù)的實現(xiàn)中調(diào)用cdev_del()函數(shù)。因此很多代碼仍然使用早期版本接口,但這種機制將來會從內(nèi)核中消失。

前面已經(jīng)提到字符設(shè)備的實際操作在structfile_operations結(jié)構(gòu)的一組函數(shù)中定義,并在驅(qū)動程序中需要與字符設(shè)備結(jié)構(gòu)關(guān)聯(lián)起來。下面討論structfile_operations結(jié)構(gòu)中最主要的成員函數(shù)和它們的用法。

(4)打開設(shè)備。

打開設(shè)備的函數(shù)接口是open,根據(jù)設(shè)備的不同,open函數(shù)接口完成的功能也有所不同,但通常情況下在open函數(shù)接口中要完成如下工作。

n 遞增計數(shù)器,檢查錯誤。

n 如果未初始化,則進行初始化。

n 識別次設(shè)備號,如果必要,更新f_op指針。

n 分配并填寫被置于filp->private_data的數(shù)據(jù)結(jié)構(gòu)。

其中遞增計數(shù)器是用于設(shè)備計數(shù)的。由于設(shè)備在使用時通常會打開多次,也可以由不同的進程所使用,所以若有一進程想要刪除該設(shè)備,則必須保證其他設(shè)備沒有使用該設(shè)備。因此使用計數(shù)器就可以很好地完成這項功能。

這里,實現(xiàn)計數(shù)器操作的是在2.6內(nèi)核早期版本的linux/module.h>中定義的3個宏,它們在最新版本里早就消失了,在下面列出只是為了幫讀者理解老版本中的驅(qū)動代碼。

n MOD_INC_USE_COUNT:計數(shù)器加1。

n MOD_DEC_USE_COUNT:計數(shù)器減1。

n MOD_IN_USE:計數(shù)器非零時返回真。

另外,當有多個物理設(shè)備時,就需要識別次設(shè)備號來對各個不同的設(shè)備進行不同的操作,在有些驅(qū)動程序中并不需要用到。

注意

雖然這是對設(shè)備文件執(zhí)行的第一個操作,但卻不是驅(qū)動程序一定要聲明的操作。若這個函數(shù)的入口為NULL,那么設(shè)備的打開操作將永遠成功,但系統(tǒng)不會通知驅(qū)動程序。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

linux相關(guān)文章:linux教程




評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉