<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:字符設備驅動(dòng)編程

嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:字符設備驅動(dòng)編程

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257111.htm

它們的函數格式如表11.3所示。

表11.3 設備號分配與釋放函數語(yǔ)法要點(diǎn)

所需頭文件

#includelinux/fs.h>

函數原型

intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name)

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

voidunregister_chrdev_region(dev_tfirst,unsignedintcount)

函數傳入值

first:要分配的設備號的初始值

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

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

dev:動(dòng)態(tài)分配的第一個(gè)設備號

函數返回值

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

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

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

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

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

如果要從系統中刪除一個(gè)設備,則要調用cdev_del()函數。具體函數格式如表11.4所示。

表11.4 最新版本的字符設備注冊

所需頭文件

#includelinux/cdev.h>

函數原型

sturctcdev*cdev_alloc(void)

voidcdev_init(structcdev*cdev,structfile_operations*fops)

intcdev_add(structcdev*cdev,dev_tnum,unsignedintcount)

voidcdev_del(structcdev*dev)

函數傳入值

cdev:需要初始化/注冊/刪除的structcdev結構

fops:該字符設備的file_operations結構

num:系統給該設備分配的第一個(gè)設備號

count:該設備對應的設備號數量

函數返回值

成功:

cdev_alloc:返回分配到的structcdev結構指針

cdev_add:返回0

出錯:

cdev_alloc:返回NULL

cdev_add:返回-1

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

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

(4)打開(kāi)設備。

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

n 遞增計數器,檢查錯誤。

n 如果未初始化,則進(jìn)行初始化。

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

n 分配并填寫(xiě)被置于filp->private_data的數據結構。

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

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

n MOD_INC_USE_COUNT:計數器加1。

n MOD_DEC_USE_COUNT:計數器減1。

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

另外,當有多個(gè)物理設備時(shí),就需要識別次設備號來(lái)對各個(gè)不同的設備進(jìn)行不同的操作,在有些驅動(dòng)程序中并不需要用到。

注意

雖然這是對設備文件執行的第一個(gè)操作,但卻不是驅動(dòng)程序一定要聲明的操作。若這個(gè)函數的入口為NULL,那么設備的打開(kāi)操作將永遠成功,但系統不會(huì )通知驅動(dòng)程序。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

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




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>