Linux字元裝置驅動之cdev init 系列

2021-08-25 20:23:32 字數 1960 閱讀 4557

字元裝置驅動之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等。這...