0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式Linux主設(shè)備號(hào)和次設(shè)備號(hào)的獲取

Q4MP_gh_c472c21 ? 來(lái)源:未知 ? 作者:李倩 ? 2018-05-23 17:18 ? 次閱讀

Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,稱為設(shè)備文件。應(yīng)用程序可以打開(kāi)、關(guān)閉和讀寫(xiě)這些設(shè)備文件,完成對(duì)設(shè)備的操作,就像操作普通的數(shù)據(jù)文件一樣。為了管理這些設(shè)備,系統(tǒng)為設(shè)備編了號(hào),每個(gè)設(shè)備號(hào)又分為主設(shè)備號(hào)和次設(shè)備號(hào)。主設(shè)備號(hào)用來(lái)區(qū)分不同種類的設(shè)備,而次設(shè)備號(hào)用來(lái)區(qū)分同一類型的多個(gè)設(shè)備。對(duì)于常用設(shè)備,Linux有約定俗成的編號(hào),如硬盤(pán)的主設(shè)備號(hào)是3。

一個(gè)字符設(shè)備或者塊設(shè)備都有一個(gè)主設(shè)備號(hào)和次設(shè)備號(hào)。主設(shè)備號(hào)和次設(shè)備號(hào)統(tǒng)稱為設(shè)備號(hào)。主設(shè)備號(hào)用來(lái)表示一個(gè)特定的驅(qū)動(dòng)程序。次設(shè)備號(hào)用來(lái)表示使用該驅(qū)動(dòng)程序的各設(shè)備。例如一個(gè)嵌入式系統(tǒng),有兩個(gè)LED指示燈,LED燈需要獨(dú)立的打開(kāi)或者關(guān)閉。那么,可以寫(xiě)一個(gè)LED燈的字符設(shè)備驅(qū)動(dòng)程序,可以將其主設(shè)備號(hào)注冊(cè)成5號(hào)設(shè)備,次設(shè)備號(hào)分別為1和2。這里,次設(shè)備號(hào)就分別表示兩個(gè)LED燈。

設(shè)備文件通常都在 /dev 目錄下。如:

如上,前面第一個(gè)字符為c 的表示字符設(shè)備。在字符設(shè)備里,有主設(shè)備號(hào)和次設(shè)備號(hào)。如上1,4,7 分別是主設(shè)備號(hào),0,1,3,7,70,71都是次設(shè)備號(hào)。一般的,主設(shè)備號(hào)標(biāo)識(shí)出與設(shè)備關(guān)聯(lián)的設(shè)備驅(qū)動(dòng)。如 /dev/null 和 /dev/full 由 1 號(hào)驅(qū)動(dòng)來(lái)管理,/dev/vcs 和/dev/vcs1由 7 號(hào)驅(qū)動(dòng)來(lái)管理,/dev/ttyS6 由 4 號(hào)驅(qū)動(dòng)來(lái)管理。

現(xiàn)在的 Linux 內(nèi)核允許多個(gè)驅(qū)動(dòng)共享一個(gè)主設(shè)備號(hào),但更多的設(shè)備都遵循一個(gè)驅(qū)動(dòng)對(duì)一個(gè)主設(shè)備號(hào)的原則。

內(nèi)核由次設(shè)備號(hào)確定當(dāng)前所指向的是哪個(gè)設(shè)備。根據(jù)所編寫(xiě)的驅(qū)動(dòng)程序,可以從內(nèi)核那里得到一個(gè)直接指向設(shè)備的指針,或者使用次設(shè)備號(hào)作為一個(gè)設(shè)備本地?cái)?shù)組的索引。但不論如何,內(nèi)核自身幾乎不知道次設(shè)備號(hào)的什么事情。

設(shè)備號(hào)的內(nèi)部表示在內(nèi)核中,dev_t 類型( 在 linux/types.h 頭文件有定義 ) 用來(lái)表示設(shè)備號(hào),包括主設(shè)備號(hào)和次設(shè)備號(hào)兩部分。對(duì)于 2.6.x 內(nèi)核,dev_t 是個(gè) 32 位量,其中 12 位用來(lái)表示主設(shè)備號(hào),20 位用來(lái)表示次設(shè)備號(hào)。

在 linux/types.h 頭文件里定義有

主設(shè)備號(hào)和次設(shè)備號(hào)的獲取

為了寫(xiě)出可移植的驅(qū)動(dòng)程序,不能假定主設(shè)備號(hào)和次設(shè)備號(hào)的位數(shù)。不同的機(jī)型中,主設(shè)備號(hào)和次設(shè)備號(hào)的位數(shù)可能是不同的。應(yīng)該使用MAJOR宏得到主設(shè)備號(hào),使用MINOR宏來(lái)得到次設(shè)備號(hào)。下面是兩個(gè)宏的定義:(linux/kdev_t.h)

#define MINORBITS 20 /*次設(shè)備號(hào)*/

#define MINORMASK ((1U << MINORBITS) - 1) ????????????/*次設(shè)備號(hào)掩碼*/ ?

#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) /*dev右移20位得到主設(shè)備號(hào)*/

#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) /*與次設(shè)備掩碼與,得到次設(shè)備號(hào)*/

MAJOR宏將dev_t向右移動(dòng)20位,得到主設(shè)備號(hào);MINOR宏將dev_t的高12位清零,得到次設(shè)備號(hào)。相反,可以將主設(shè)備號(hào)和次設(shè)備號(hào)轉(zhuǎn)換為設(shè)備號(hào)類型(dev_t),使用宏MKDEV可以完成這個(gè)功能。

#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))

MKDEV宏將主設(shè)備號(hào)(ma)左移20位,然后與次設(shè)備號(hào)(mi)相與,得到設(shè)備號(hào)

靜態(tài)分配設(shè)備號(hào)

靜態(tài)分配設(shè)備號(hào),就是驅(qū)動(dòng)程序開(kāi)發(fā)者,靜態(tài)地指定一個(gè)設(shè)備號(hào)。對(duì)于一部分常用的設(shè)備,內(nèi)核開(kāi)發(fā)者已經(jīng)為其分配了設(shè)備號(hào)。這些設(shè)備號(hào)可以在內(nèi)核源碼documentation/ devices.txt文件中找到。如果只有開(kāi)發(fā)者自己使用這些設(shè)備驅(qū)動(dòng)程序,那么其可以選擇一個(gè)尚未使用的設(shè)備號(hào)。在不添加新硬件的時(shí)候,這種方式不會(huì)產(chǎn)生設(shè)備號(hào)沖突。但是當(dāng)添加新硬件時(shí),則很可能造成設(shè)備號(hào)沖突,影響設(shè)備的使用。

動(dòng)態(tài)分配設(shè)備號(hào)

由于靜態(tài)分配設(shè)備號(hào)存在沖突的問(wèn)題,所以內(nèi)核社區(qū)建議開(kāi)發(fā)者使用動(dòng)態(tài)分配設(shè)備號(hào)的方法。動(dòng)態(tài)分配設(shè)備號(hào)的函數(shù)是alloc_chrdev_region()。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209499
  • 設(shè)備
    +關(guān)注

    關(guān)注

    2

    文章

    4509

    瀏覽量

    70638

原文標(biāo)題:嵌入式Linux主設(shè)備號(hào)和次設(shè)備號(hào)詳解

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式Linux下PCI設(shè)備驅(qū)動(dòng)的設(shè)計(jì)

    ]。Linux因其開(kāi)放源代碼以及穩(wěn)定的性能,越來(lái)越受到廣大用戶青睞。同時(shí),基于Linux內(nèi)核的嵌入式操作系統(tǒng)應(yīng)用勢(shì)頭強(qiáng)勁,開(kāi)發(fā)基于Linux設(shè)備
    發(fā)表于 10-08 09:44

    嵌入式驅(qū)動(dòng)開(kāi)發(fā) Linux字符設(shè)備驅(qū)動(dòng)

    1.嵌入式設(shè)備驅(qū)動(dòng)概述2.字符設(shè)備驅(qū)動(dòng)框架3.GPIO驅(qū)動(dòng)程序設(shè)計(jì)實(shí)例4.中斷處理和同步機(jī)制1.1驅(qū)動(dòng)程序設(shè)計(jì)是嵌入式Linux開(kāi)發(fā)中重要的
    發(fā)表于 10-09 17:21

    嵌入式設(shè)備如何獲取公網(wǎng)IP?

    設(shè)備又沒(méi)有該程序;方法設(shè)備采用的是嵌入式linux,其中的工具箱busybox中有輕量級(jí)的wget應(yīng)用,因此可以用改應(yīng)用獲取
    發(fā)表于 10-27 08:09

    為什么要配置Linux系統(tǒng)嵌入式設(shè)備的串口通信?

    我們查看這些數(shù)據(jù),那么問(wèn)題來(lái)了,當(dāng)我們可以讓一個(gè)設(shè)備從串口使用UART的方式輸出數(shù)據(jù),這個(gè)設(shè)備和一個(gè)搭載Linux系統(tǒng)的嵌入式設(shè)備通信的時(shí)候
    發(fā)表于 12-16 07:24

    如何查看注冊(cè)的主設(shè)備號(hào)

    嵌入式LINUX驅(qū)動(dòng)學(xué)習(xí)之4.字符設(shè)備驅(qū)動(dòng)編程(三)用戶空間實(shí)現(xiàn)代碼之驅(qū)動(dòng)注冊(cè)和卸載一、注冊(cè)驅(qū)動(dòng) 模塊:二、查看注冊(cè)的主設(shè)備號(hào)三、根據(jù)
    發(fā)表于 12-24 07:03

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā) Linux 設(shè)備驅(qū)動(dòng)的基本概念Linux
    發(fā)表于 09-10 13:10 ?82次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)開(kāi)發(fā)

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

    描述了基于嵌入式Linux的字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程。以電機(jī)、數(shù)碼管、串口和mini鍵盤(pán)的驅(qū)動(dòng)設(shè)計(jì)為例,詳細(xì)闡述了嵌入式linux
    發(fā)表于 02-23 15:45 ?24次下載

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

    描述了基于嵌入式Linux的字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程。以電機(jī)、數(shù)碼管、串口和mini鍵盤(pán)的驅(qū)動(dòng)設(shè)計(jì)為例,詳細(xì)闡述了嵌入式linux
    發(fā)表于 07-14 17:31 ?31次下載

    嵌入式應(yīng)用中的USB主設(shè)備功能

    嵌入式應(yīng)用中的USB主設(shè)備功能 USB已經(jīng)成為設(shè)備和PC之間通信的標(biāo)準(zhǔn)方式,從通用設(shè)備(如閃存設(shè)備和鼠標(biāo))到專用
    發(fā)表于 06-02 07:49 ?658次閱讀

    嵌入式應(yīng)用中的USB主設(shè)備功能

    嵌入式應(yīng)用中的USB主設(shè)備功能 USB已經(jīng)成為設(shè)備和PC之間通信的標(biāo)準(zhǔn)方式,從通用設(shè)備(如閃存設(shè)備和鼠標(biāo))到專用
    發(fā)表于 08-27 10:32 ?491次閱讀

    基于嵌入式Linux LCD設(shè)備驅(qū)動(dòng)分析

    基于嵌入式Linux LCD設(shè)備驅(qū)動(dòng)分析
    發(fā)表于 10-30 16:20 ?14次下載
    基于<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> LCD<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)分析

    嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)基礎(chǔ)總結(jié)(下篇)

    14, 字符設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)基礎(chǔ)主設(shè)備號(hào)設(shè)備號(hào)(二者一起為
    的頭像 發(fā)表于 03-15 09:17 ?6259次閱讀

    想要駕馭Linux驅(qū)動(dòng)開(kāi)發(fā),必須深刻理解Linux總線設(shè)備驅(qū)動(dòng)框架

    想要駕馭Linux驅(qū)動(dòng)開(kāi)發(fā),必須深刻理解Linux總線設(shè)備驅(qū)動(dòng)框架。之所以會(huì)形成這樣的框架,主要是為了代碼的可重用性,因?yàn)轵?qū)動(dòng)和設(shè)備的關(guān)系是一對(duì)多的。正如
    的頭像 發(fā)表于 03-22 11:08 ?1.1w次閱讀
    想要駕馭<b class='flag-5'>Linux</b>驅(qū)動(dòng)開(kāi)發(fā),必須深刻理解<b class='flag-5'>Linux</b>總線<b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)框架

    嵌入式Linux UART

    文章目錄前言串口連接串口測(cè)試C代碼微信公眾號(hào)前言這是前篇:嵌入式Linux i.MX開(kāi)發(fā)板嵌入式Linux NFS
    發(fā)表于 11-01 16:26 ?8次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> UART

    推薦 | 幾個(gè)我星標(biāo)的嵌入式公眾號(hào)

    小麥大叔 推薦一位我的好朋友的公眾號(hào):小麥大叔,號(hào)主麥?zhǔn)?,萬(wàn)粉號(hào)主。CSDN知名博客專家,萬(wàn)粉博主。麥?zhǔn)骞?b class='flag-5'>號(hào)和博客的內(nèi)容博大精深,包括但不限于嵌入
    發(fā)表于 12-01 20:06 ?7次下載
    推薦 | 幾個(gè)我星標(biāo)的<b class='flag-5'>嵌入式</b>公眾<b class='flag-5'>號(hào)</b>