新聞中心

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

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

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

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

        3.程序主要組成

        (1)早期版本的字符設備注冊。

        早期版本的設備注冊使用函數register_chrdev(),調用該函數后就可以向系統申請主設備號,如果register_chrdev()操作成功,設備名就會出現在/proc/devices文件里。在關閉設備時,通常需要解除原先的設備注冊,此時可使用函數unregister_chrdev(),此后該設備就會從/proc/devices里消失。其中主設備號和次設備號不能大于255。

        當前不少的字符代碼仍然使用這些早期版本的函數接口,但在未來內核的代碼中,將不會出現這種編程接口機制。因此應該盡量使用后面講述的編程機制。

        register_chrdev()函數格式如表11.1所示。

        表11.1 register_chrdev()函數語法要點

        所需頭文件

        #includelinux/fs.h>

        函數原型

        intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops)

        函數傳入值

        major:程序向系統申請的主設備號,如果為0則系統為此驅動程序動態地分配一個主設備號

        name:設備名

        fops:對各個調用的入口點

        函數返回值

        成功:如果是動態分配主設備號,此返回所分配的主設備號。且設備名就會出現在/proc/devices文件里

        出錯:-1

        unregister_chrdev()函數格式如下表11.2所示:

        表11.2 unregister_chrdev()函數語法要點

        所需頭文件

        #includelinux/fs.h>

        函數原型

        intunregister_chrdev(unsignedintmajor,constchar*name)

        函數傳入值

        major:設備的主設備號,必須和注冊時的主設備號相同

        name:設備名

        函數返回值

        成功:0,且設備名從/proc/devices文件里消失

        出錯:-1

        (2)設備號相關函數。

        在前面已經提到設備號有主設備號和次設備號,其中主設備號表示設備類型,對應于確定的驅動程序,具備相同主設備號的設備之間共用同一個驅動程序,而用次設備號來標識具體物理設備。因此在創建字符設備之前,必須先獲得設備的編號(可能需要分配多個設備號)。

        在Linux2.6的版本中,用dev_t類型來描述設備號(dev_t是32位數值類型,其中高12位表示主設備號,低20位表示次設備號)。用兩個宏MAJOR和MINOR分別獲得dev_t設備號的主設備號和次設備號,而且用MKDEV宏來實現逆過程,即組合主設備號和次設備號而獲得dev_t類型設備號。

        分配設備號有靜態和動態的兩種方法。靜態分配(register_chrdev_region()函數)是指在事先知道設備主設備號的情況下,通過參數函數指定第一個設備號(它的次設備號通常為0)而向系統申請分配一定數目的設備號。動態分配(alloc_chrdev_region())是指通過參數僅設置第一個次設備號(通常為0,事先不會知道主設備號)和要分配的設備數目而系統動態分配所需的設備號。

        通過unregister_chrdev_region()函數釋放已分配的(無論是靜態的還是動態的)設備號。

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

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 长海县| 英超| 综艺| 仙游县| 上林县| 灌云县| 淳化县| 秭归县| 固阳县| 济南市| 白玉县| 枞阳县| 都江堰市| 武强县| 锡林浩特市| 绿春县| 甘谷县| 泾源县| 丹寨县| 临桂县| 苍溪县| 柳州市| 太康县| 松滋市| 新巴尔虎右旗| 辽阳市| 丽江市| 高唐县| 琼中| 临澧县| 乌恰县| 修武县| 石河子市| 皋兰县| 蒙城县| 咸阳市| 霍林郭勒市| 九龙县| 刚察县| 泰来县| 咸宁市|