1. 程式人生 > >linux驅動開發 主裝置號與次裝置號

linux驅動開發 主裝置號與次裝置號

一個字元裝置或者塊裝置都有一個主裝置號和次裝置號。主裝置號和次裝置號統稱為設
備號。主裝置號用來表示一個特定的驅動程式。次裝置號用來表示使用該驅動程式的各
裝置。例如一個嵌入式系統,有兩個LED指示燈,LED燈需要獨立的開啟或者關閉。那麼
,可以寫一個LED燈的字元裝置驅動程式,可以將其主裝置號註冊成5號裝置,次裝置號
分別為1和2。這裡,次裝置號就分別表示兩個LED燈。
1.主裝置號和次裝置號的表示
在Linux核心中,dev_t型別用來表示裝置號。在Linux 2.6.29.4中,dev_t定義為一個
無符號長整型變數,如下:typedef u_long dev_t;
u_long在32位機中是4個位元組,在64位機中是8位元組。以32位機為例,其中高12表示主裝置號,低20為表示次裝置號,如圖6.1所示。

2.主裝置號和次裝置號的獲取
為了寫出可移植的驅動程式,不能假定主裝置號和次裝置號的位數。不同的機型中,主
裝置號和次裝置號的位數可能是不同的。應該使用MAJOR巨集得到主裝置號,使用MINOR巨集來得到次裝置號。下面是兩個巨集的定義:
#define MINORBITS   20                                  /*次裝置號位數*/
#define MINORMASK   ((1U << MINORBITS) - 1)             /*次裝置號掩碼*/
#define MAJOR(dev)  ((unsigned int) ((dev) >> MINORBITS))

/*dev右移20位得到主裝置號*/ 
#define MINOR(dev)((unsigned int) ((dev) & MINORMASK))
   /*與次裝置掩碼與,得到次裝置號*/
MAJOR巨集將dev_t向右移動20位,得到主裝置號;MINOR巨集將dev_t的高12位清零,得到次
裝置號。相反,可以將主裝置號和次裝置號轉換為裝置號型別(dev_t),使用巨集
MKDEV可以完成這個功能。#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))  
MKDEV巨集將主裝置號(ma)左移20位,然後與次裝置號(mi)相與,得到裝置號。
3.靜態分配裝置號

靜態分配裝置號,就是驅動程式開發者,靜態地指定一個裝置號。對於一部分常用的設
備,核心開發者已經為其分配了裝置號。這些裝置號可以在核心原始碼documentation/
devices.txt檔案中找到。如果只有開發者自己使用這些裝置驅動程式,那麼其可以選
擇一個尚未使用的裝置號。在不新增新硬體的時候,這種方式不會產生裝置號衝突。但
是當新增新硬體時,則很可能造成裝置號衝突,影響裝置的使用。
4.動態分配裝置號
由於靜態分配裝置號存在衝突的問題,所以核心社群建議開發者使用動態分配裝置號的
方法。動態分配裝置號的函式是alloc_chrdev_region()。
5.檢視裝置號
當靜態分配裝置號時,需要檢視系統中已經存在的裝置號,從而決定使用哪個新裝置號
。可以讀取/proc/devices檔案獲得裝置的裝置號。/proc/devices檔案包含字元裝置和
塊裝置的裝置號,如下所示。[[email protected] /]# cat /proc/devices /*cat命令檢視
/proc/devices檔案的內容*/  Character devices:                  /*字元裝置*/
1 mem    4 /dev/vc/0    7 vcs    13 input    14 sound    21 sg  Block
devices:  /*塊裝置*/    1 ramdisk    2 fd    8 sd    253  device-mapper    254 mdp   
3. 6.1.3 申請和釋放裝置號
 核心維護著一個特殊的資料結構,用來存放裝置號與裝置的關係。在安裝裝置時,應該
給裝置申請一個裝置號,使系統可以明確裝置對應的裝置號。裝置驅動程式中的很多功
能,是通過裝置號來操作裝置的。下面,首先對申請裝置號進行簡述。
1.申請裝置號
在構建字元裝置之前,首先要向系統申請一個或者多個裝置號。完成該工作的函式是
register_chrdev_region(),該函式在<fs/char_dev.c>中定義:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
其中,from是要分配的裝置號範圍的起始值。一般只提供from的主裝置號,from的次設
備號通常被設定成0。count是需要申請的連續裝置號的個數。最後name是和該範圍編號
關聯的裝置名稱,該名稱不能超過64位元組。
和大多數核心函式一樣,register_chrdev_region()函式成功時返回0。錯誤時,返回
一個負的錯誤碼,並且不能為字元裝置分配裝置號。下面是一個例子程式碼,其申請了
CS5535_GPIO_COUNT個裝置號。retval = register_chrdev_region(dev_id,
CS5535_GPIO_COUNT,NAME);
在Linux中有非常多的字元裝置,在人為的為字元裝置分配裝置號時,很可能發生衝突
。Linux核心開發者一直在努力將裝置號變為動態的。可以使用
alloc_chrdev_region()函式達到這個目的。
int alloc_chrdev_region(dev_t *dev, unsigned baseminor,unsigned count, const char *name)
在上面的函式中,dev作為輸出引數,在函式成功返回後將儲存已經分配的裝置號。函
數有可能申請一段連續的裝置號,這是dev返回第一個裝置號。baseminor表示要申請的
第一個次裝置號,其通常設為0。count和name與register_chrdev_region()函式的對應
引數一樣。count表示要申請的連續裝置號個數,name表示裝置的名字。下面是一個例
子程式碼,其申請了CS5535_GPIO_COUNT個裝置號。retval =
alloc_chrdev_region(&dev_id, 0, CS5535_GPIO_COUNT, NAME);
2.釋放裝置號
使用上面兩種方式申請的裝置號,都應該在不使用裝置時,釋放裝置號。裝置號的釋放
統一使用下面的函式:void unregister_chrdev_region(dev_t from, unsignedcount);
在上面這個函式中,from表示要釋放的裝置號,count表示從from開始要釋放的裝置號

個數。通常,在模組的解除安裝函式中呼叫unregister_chrdev_region()函式。

相關推薦

linux驅動開發 主裝置裝置

一個字元裝置或者塊裝置都有一個主裝置號和次裝置號。主裝置號和次裝置號統稱為設備號。主裝置號用來表示一個特定的驅動程式。次裝置號用來表示使用該驅動程式的各裝置。例如一個嵌入式系統,有兩個LED指示燈,LED燈需要獨立的開啟或者關閉。那麼,可以寫一個LED燈的字元裝置驅動程式,

主裝置裝置概念

主裝置號標誌裝置驅動程式,次裝置號標誌特定的子裝置。這麼想就理解了:一塊有著不同分割槽的磁碟,那麼主裝置號就標誌著這塊磁碟,此裝置號就標誌著這塊磁碟上的不同分割槽,也就是這塊磁碟的各分割槽的主裝置號是相同的,但各次裝置

linux驅動開發-檔案系統裝置檔案

目錄 1.Linux檔案系統操作 Linux檔案建立,開啟,關閉函式 #檔案許可權最終由mode&umask決定 int creat (const char *filename,mode_t mod

linux驅動開發之一個真正的裝置驅動需要一些什麼元素(裝置,操作方法)

1,需要一個裝置號(重點看下面的程式碼) 因為核心中有很多的裝置驅動,所以需要一個裝置號id來進行區分 裝置號分成兩個部分: 主裝置號:某一

Linux驅動開發(5)——生成裝置節點

項裝置可以說是對一部分字元裝置的封裝,還有一部分不好歸類驅 動也歸到雜項裝置 雜項裝置初始化部分原始檔“drivers/char/ misc.c”,這一部分通過 Makefile可知,是強制編譯的。 雜項設備註冊標頭檔案include/linux/miscdevice

嵌入式Linux驅動開發(四)——字元裝置驅動之中斷方式以及中斷方式獲取按鍵值

之前我們完成了關於通過查詢的方式獲取按鍵鍵值的驅動程式,可以參考:嵌入式Linux開發——裸板程式之中斷控制器。 雖然讀取鍵值沒有什麼問題,但是測試程式佔用CPU過高,一直在不斷的查詢,資源消耗過大,這個問題非常嚴重,我們必須要來解決一下。但是在解決這個問題之前,我們先來思考一個問題,除

Linux驅動開發詳解》——LCD裝置驅動重要資料結構及驅動框架

核心檔案:/drivers/video/fbmem.c 18.2.3.Linux幀緩衝相關資料結構與函式          1. fb_info結構體(最關鍵) /* struct fb_info 結構體 */ struct fb_info {     int node;

Linux驅動開發主裝置驅動裝置裝置

一、引言   很久前接觸linux驅動就知道主裝置號找驅動,次裝置號找裝置。這句到底怎麼理解呢,如何在驅動中實現呢,在介紹該實現之前先看下核心中主次裝置號的管理:   二、Linux核心主次裝置號的管理   Linux的裝置管理是和檔案系統緊密結合的,各種裝置都以檔

《5.linux驅動開發-第6部分-5.6.misc類裝置蜂鳴器驅動

《5.linux驅動開發-第6部分-5.6.misc類裝置與蜂鳴器驅動》 第一部分、章節目錄 5.6.1.板載蜂鳴器驅動測試 5.6.2.misc類裝置介紹 5.6.3.misc驅動框架原始碼分析1 5.6.4.misc驅動框架原始碼分析2 5.6.5.蜂鳴器驅動原始碼分析1 5.6.6

linux 如何得到裝置檔案的裝置主裝置&裝置

使用stat (/usr/include/sys/stat.h)系統呼叫,介面如下: stat (__const char *__path, struct stat *__statbuf)得到的資訊在stat結構體中: struct stat { __dev

Linux驅動開發(9)——註冊字元裝置

static int scdev_init(void) { int ret = 0,i; dev_t num_dev; printk(KERN_EMERG "numdev_major is %d!\n",numdev_major); printk(KERN_EMERG "

Linux驅動開發(8)——靜態和動態申請字元裝置

先貼一段demo #include <linux/init.h> /*包含初始化巨集定義的標頭檔案,程式碼中的module_init和module_exit在此檔案中*/ #include <linux/module.h> /*包含初始化載入模組的標頭檔案,程

Linux驅動開發(3)——以module方式註冊裝置

通過 s3c_device_leds_ctl->*smdk4x12_devices[]->platform_add_devices()->platform_device_register() 可以直接使用“platform_device_register()”來註冊裝置

Linux驅動開發(13)——併發原子操作

併發 併發的概念 多個執行單元同時、並行被執行。Linux系統是多工的,很多工會同時執行。 假如有三個執行單元ABC,共享了記憶體資源。 執行單元A對Buffer寫1000個“a”; 執行單元B對Buffer寫1000個“b”; 執行單元C從buffer中讀取資料。 如果按照

Linux驅動開發11:【裝置樹】nanopi的PWM驅動

介紹 前兩節利用裝置樹實現了nanopi的LED驅動和按鍵驅動,這一節來實現nonapi的PWM驅動。PWM驅動在核心中也有相應的實現,因此這裡只是按照要求新增裝置樹檔案即可。這一節和之前一樣,首先修改裝置樹檔案進行測試,然後分析核心相應的軟體實現。 新增裝置樹節點 因為在s

Linux驅動開發10:【裝置樹】nanopi的按鍵驅動

介紹 這一節在nanopi上實現按鍵驅動,和LED驅動一樣,通用的按鍵驅動在linux核心中已經實現好,我們只需要按照要求寫好裝置樹即可,不用我們自己實現按鍵驅動。這一節中首先修改裝置樹並測試按鍵驅動,然後分析drivers/input/keyboard/gpio_keys.c檔案,

Linux USB 驅動開發(一)—— USB裝置基礎概念

Linux USB 驅動開發(一)—— USB裝置基礎概念           在終端使用者看來,USB裝置為主機提供了多種多樣的附加功能,如檔案傳輸,聲音播放等,但對USB主機來說,它與所有USB裝置的介面都是一致的。一個USB裝置由3個功

linux驅動開發-第11部分-5.11.網路裝置驅動介紹》

《linux驅動開發-第11部分-5.11.網路裝置驅動介紹》 第一部分、章節目錄 5.11.1.網路裝置驅動概述 5.11.2.虛擬網絡卡驅動分析1 5.11.3.虛擬網絡卡驅動分析2 5.11.4.DM9000驅動原始碼分析1 5.11.5.DM9000驅動原始碼分析2 第二部分

《5.linux驅動開發-第10部分-5.10.塊裝置驅動介紹》

《5.linux驅動開發-第10部分-5.10.塊裝置驅動介紹》 第一部分、章節目錄 5.10.1.正確理解塊裝置驅動的概念 5.10.2.塊裝置驅動框架簡介 5.10.3.塊裝置驅動案例分析1 5.10.4.塊裝置驅動案例分析2 5.10.5.塊裝置驅動案例分析3 第二部分、章節介

《5.linux驅動開發-第5部分-5.5.linux裝置驅動模型》

《5.linux驅動開發-第5部分-5.5.linux裝置驅動模型》 第一部分、章節目錄 5.5.1.linux裝置驅動模型簡介 5.5.2.裝置驅動模型的底層架構 5.5.3.匯流排式裝置驅動組織方式 5.5.4.platform平臺匯流排簡介1 5.5.5.platform平臺匯流排