新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux設備驅動開發之:字符設備驅動編程

        嵌入式Linux設備驅動開發之:字符設備驅動編程

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257111.htm

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

        表11.3 設備號分配與釋放函數語法要點

        所需頭文件

        #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:要申請設備號的設備名稱(在/proc/devices和sysfs中顯示)

        dev:動態分配的第一個設備號

        函數返回值

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

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

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

        在獲得了系統分配的設備號之后,通過注冊設備才能實現設備號和驅動程序之間的關聯。這里講解2.6內核中的字符設備的注冊和注銷過程。

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

        如果要從系統中刪除一個設備,則要調用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:系統給該設備分配的第一個設備號

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

        函數返回值

        成功:

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

        cdev_add:返回0

        出錯:

        cdev_alloc:返回NULL

        cdev_add:返回-1

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

        前面已經提到字符設備的實際操作在structfile_operations結構的一組函數中定義,并在驅動程序中需要與字符設備結構關聯起來。下面討論structfile_operations結構中最主要的成員函數和它們的用法。

        (4)打開設備。

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

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

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

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

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

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

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

        n MOD_INC_USE_COUNT:計數器加1。

        n MOD_DEC_USE_COUNT:計數器減1。

        n MOD_IN_USE:計數器非零時返回真。

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

        注意

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

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

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 临澧县| 辽阳市| 蓬莱市| 潜江市| 交口县| 崇州市| 安多县| 沾益县| 西华县| 舞阳县| 景德镇市| 丹凤县| 荆州市| 福鼎市| 彩票| 红河县| 兴安县| 井陉县| 姚安县| 庐江县| 香格里拉县| 弥勒县| 阿拉善盟| 北碚区| 夏河县| 长岭县| 南雄市| 花莲县| 游戏| 南宁市| 仁布县| 西乡县| 扎囊县| 梅州市| 汉源县| 宁陵县| 汾阳市| 关岭| 贵港市| 南乐县| 静海县|