字元裝置驅動之cdev_init()
系列函式 1.
核心中每個字元裝置都對應乙個cdev
結構的變數,下面是它的定義:
linux-2.6.22/include/linux/cdev.h
struct cdev ;
1>kobj
是乙個嵌入在該結構中的核心物件。它用於該資料結構的一般管理。
2>owner
指向提供驅動程式的模組
3>ops
是一組檔案操作,實現了與硬體通訊的具體操作。
4>dev
指定了裝置號
5>count
表示與該裝置關聯的從裝置的數目
6>list
用來實現乙個鍊錶,其中包含所有表示該裝置的裝置特殊檔案的inode.
2.乙個cdev
一般它有兩種定義初始化方式:靜態的和動態的
1>
靜態記憶體定義初始化:
struct cdev my_cdev;
cdev_init(&my_cdev, &fops);
my_cdev.owner = this_module;
2>
動態記憶體定義初始化:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &fops;
my_cdev->owner = this_module;
兩種使用方式的功能是一樣的,只是使用的記憶體區不一樣,一般視實際的資料結構需求而定。
3. 下面是具體實現
1>struct cdve * cdev_alloc(void)
struct cdev *cdev_alloc(void)
return p;
}2>void cdev_init(struct cdev *cdev, const struct file_operations *fops)函式
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
兩個函式完成都功能基本一致,只是cdev_init()
還多賦了乙個cdev->ops
的值。
cdev_init
的引數fops
包含了一些函式指標,指向處理與裝置實際通訊的函式 4.
初始化cdev
後,需要把它新增到系統中去。為此可以呼叫cdev_add()
函式。傳入cdev
結構的指標,起始裝置編號,以及裝置編號範圍。
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
1>cdev_add
的count
引數表示該裝置提供的從裝置號的數量。在cdev_add
成功返回後,裝置進入活動狀態。
2>kobj_map()
核心中所有都字元裝置都會記錄在乙個kobj_map
結構的cdev_map
變數中。這個結構的變數中包含乙個雜湊表用來快速訪問所有的物件。kobj_map()
函式就是用來把字元裝置編號和cdev
結構變數一起儲存到cdev_map
這個雜湊表裡。當後續要開啟乙個字元裝置檔案時,通過呼叫kobj_lookup()
函式,根據裝置編號就可以找到cdev
結構變數,從而取出其中的ops
字段。
5.當乙個字元裝置驅動不再需要的時候(比如模組解除安裝),就可以用cdev_del()
函式來釋放cdev
占用的記憶體
void cdev_del(struct cdev *p)
其中cdev_unmap()
呼叫kobj_unmap()
來釋放cdev_map
雜湊表中的物件。kobject_put()
釋放cdev
結構本身。
platform裝置驅動之按鍵掃瞄(cdev裝置)
一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 3 核心版本 linux 2.6.35 4 交叉編譯工具鏈 arm none linux gnueabi 二 詳細 1 button device.c platform device include include inc...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...