<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/257111.htm

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

          表11.3 設(shè)備號(hào)分配與釋放函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

          #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è)備號(hào)的初始值

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

          name:要申請(qǐng)?jiān)O(shè)備號(hào)的設(shè)備名稱(在/proc/devices和sysfs中顯示)

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

          函數(shù)返回值

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

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

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

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

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

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

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

          所需頭文件

          #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:需要初始化/注冊(cè)/刪除的structcdev結(jié)構(gòu)

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

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

          count:該設(shè)備對(duì)應(yīng)的設(shè)備號(hào)數(shù)量

          函數(shù)返回值

          成功:

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

          cdev_add:返回0

          出錯(cuò):

          cdev_alloc:返回NULL

          cdev_add:返回-1

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

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

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

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

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

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

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

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

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

          這里,實(shí)現(xiàn)計(jì)數(shù)器操作的是在2.6內(nèi)核早期版本的linux/module.h>中定義的3個(gè)宏,它們?cè)谧钚掳姹纠镌缇拖Я?,在下面列出只是為了幫讀者理解老版本中的驅(qū)動(dòng)代碼。

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

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

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

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

          注意

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

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

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




          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();