但大多新書早已經是講2.6的介面了,如ldd3、國嵌、宋寶華的書
(1)早期版本的字元裝置註冊。
早期版本的裝置註冊使用函式 register_chrdev(),呼叫該函式後就可以向系統申請 主裝置號,如果 register_chrdev()操作成功,裝置名就會出現在/proc/devices 檔案裡。 在關閉裝置時,通常需要解除原先的裝置註冊,此時可使用函式 unregister_chrdev(), 此後該裝置就會從/proc/devices 裡消失。其中主裝置號和次裝置號不能大於 255。
當前不少的字元裝置驅動**仍然使用這些早期版本的函式介面,但在未來核心 的**中,將不會出現這種程式設計介面機制。因此應該盡量使用後面講述的程式設計機制。
register_chrdev()函式語法要點
所需標頭檔案
#include
函式原型
int register_chrdev(unsigned int major, const char *name,struct file_operations *fops)
函式傳入值
major:裝置驅動程式向系統申請的主裝置號,如果為 0 則系統為此驅動程式動態
配乙個主裝置號
name:裝置名
fops:對各個呼叫的入口點
成功:如果是動態分配主裝置號,此返回所分配的主裝置號。且裝置名就會出現在/proc/devices 檔案裡
函式返回值
出錯: 1
unregister_chrdev()函式語法要點
所需標頭檔案
#include
函式原型
int unregister_chrdev(unsigned int major, const char *name)
函式傳入值
major:裝置的主裝置號,必須和註冊時的主裝置號相同
name:裝置名
函式返回值
成功:0,且裝置名從/proc/devices 檔案裡消失
出錯: 1
(2)裝置號相關函式。
在前面已經提到裝置號有主裝置號和次裝置號,其中主裝置號表示裝置類 型,對應於確定的驅動程式,具備相同主裝置號的裝置之間共用同乙個驅動程 序,而用次裝置號來標識具體物理裝置。因此在建立字元裝置之前,必須先獲 得裝置的編號(可能需要分配多個裝置號)。
在 linux 2.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()函式釋放已分配的(無論是靜態的還是動態的)設 備號。
它們的函式格式如表 11.3 所示。
表 11.3 裝置號分配與釋放函式語法要點
所需標頭檔案
#include
函式原型
int register_chrdev_region (dev_t first, unsigned int count, char *name)
int alloc_chrdev_region (dev_t *dev, unsigned int firstminor, unsigned int count, char *nam )
void unregister_chrdev_region (dev_t first, unsigned int count)
函式傳入值
first:要分配的裝置號的初始值
count:要分配(釋放)的裝置號數目
name:要申請裝置號的裝置名稱(在/proc/devices 和 sysfs 中顯示)
dev:動態分配的第乙個裝置號
函式返回值
成功:0(只限於兩種註冊函式)
出錯: 1(只限於兩種註冊函式)
(3)最新版本的字元裝置註冊。
在獲得了系統分配的裝置號之後,通過註冊裝置才能實現裝置號和驅動程式之間 的關聯。這裡講解 2.6 核心中的字元裝置的註冊和登出過程。
在 linux 核心中使用 struct cdev 結構來描述字元裝置,我們在驅動程式中必 須將已分配到的裝置號以及裝置操作介面(即為 struct file_operations 結構)賦予 struct cdev 結構變數。首先使用 cdev_alloc()函式向系統申請分配 struct cdev 結構, 再用 cdev_init()函式初始化已分配到的結構並與 file_operations 結構關聯起來。最 後呼叫 cdev_add()函式將裝置號與 struct cdev 結構進行關聯並向核心正式報告新 裝置的註冊,這樣新裝置可以被用起來了。
如果要從系統中刪除乙個裝置,則要呼叫 cdev_del()函式。具體函式格式如表 11.4
所示。最新版本的字元裝置註冊
所需標頭檔案
#include
函式原型
sturct cdev *cdev_alloc(void)
void cdev_init(struct cdev *cdev, struct file_operations *fops)
int cdev_add (struct cdev *cdev, dev_t num, unsigned int count)
void cdev_del(struct cdev *dev)
函式傳入值
cdev :需要初始化 / 註冊 / 刪除的 struct cdev 結構
fops :該字元裝置的 file_operations 結構
num :系統給該裝置分配的第乙個裝置號
count :該裝置對應的裝置號數量
函式返回值
成功:
cdev_alloc :返回分配到的 struct cdev 結構指標
cdev_add :返回 0
函式返回值
函式返回值
出錯:
cdev_alloc :返回 null
cdev_add :返回 -1
2.6 核心仍然保留早期版本的 register_chrdev()等字元裝置相關函式,其實從核心
**中可以發現,在 register_chrdev()函式的實現中用到 cdev_alloc()和 cdev_add()函式, 而在 unregister_chrdev()函式的實現中呼叫 cdev_del()函式。因此很多**仍然使用早 期版本介面,但這種機制將來會從核心中消失。
參考:華清《嵌入式linux應用程式開發標準教程》
字元裝置註冊例項
實驗平台 s5pv210開發板 kernel2.6 功能 驅動三顆led,led1 led2,共用乙個fops,led3單獨使用乙個fops。當open led1 led2 時,led1 和 led2 同時亮,open led3 時,led3亮 release 對應熄滅。include includ...
linux字元裝置註冊相關函式
本文介紹linux字元裝置註冊相關的四個函式 cdev alloc cdev init cdev add和cdev del。這四個函式在檔案 fs char dev.c中定義,在標頭檔案include linux cdev.h中宣告。其中cdev alloc和cdev init是一對 互斥 函式,以...
Linux 驅動之字元裝置註冊
目的 給空模組新增驅動殼子 核心工作量 file operations及其元素填充 註冊驅動。腦海裡先有框架,知道自己要幹嘛 細節 不需要乙個字乙個字敲,可以到核心中去尋找參考 複製過來改 寫下的所有 必須心裡清楚明白,不能似懂非懂。先定義file operations結構體變數 自定義乙個file...