Linux驅動學習(四)

2021-09-08 16:13:15 字數 2494 閱讀 9792

在前三篇裡學習了linux平台裝置和驅動的一些知識後,這篇就說一下驅動程式是怎麼自動生成裝置檔案。

寫過linux驅動的可能都知道,linux裡有一類裝置叫做混雜裝置,而且還可以發現註冊這一類裝置後是不用手動去生成裝置檔案的。好吧,由這類裝置的註冊函式入手,從而去了解是怎樣自動生成裝置檔案的。看看混雜裝置註冊函式在/drivers/char/misc.c裡的定義:

1

int misc_register(struct miscdevice *misc)215

}1617if (misc->minor ==misc_dynamic_minor)

23 misc->minor = dynamic_minors - i - 1;24

set_bit(i, misc_minors);25}

26//

misc_major = 10

27 dev = mkdev(misc_major, misc->minor);

2829 misc->this_device = device_create(misc_class, misc->parent, dev,

30 misc, "

%s", misc->name);

31if (is_err(misc->this_device))

3839

/*40

* add it to the front, so that later devices can "override"

41* earlier defaults

42*/

43 list_add(&misc->list, &misc_list);

44out

:45 mutex_unlock(&misc_mtx);

46return

err;

47 }

第17~25行的作用是分配乙個還沒用過的次裝置號(混雜裝置的主裝置號都是一樣的);第27行,生成乙個裝置號(由主裝置號和次裝置號組成)。第29行,自動生成裝置檔案的「玄機」就在裡面,看它在drivers/base/core.c裡的定義:

1

struct device *device_create(struct

class *class, struct device *parent,

2 dev_t devt, void *drvdata, const

char *fmt, ...)

3

關鍵看第8行device_create_vargs()的定義:

1

struct device *device_create_vargs(struct

class *class, struct device *parent,

2 dev_t devt, void *drvdata, const

char *fmt,

3va_list args)416

17 dev->devt =devt;

18 dev->class = class

;19 dev->parent =parent;

20 dev->release =device_create_release;

21dev_set_drvdata(dev, drvdata);

2223 retval = kobject_set_name_vargs(&dev->kobj, fmt, args);

24if

(retval)

25goto

error;

2627 retval =device_register(dev);

28if

(retval)

29goto

error;

3031

return

dev;

3233

error:

34put_device(dev);

35return

err_ptr(retval);

36 }

第17~21行,很明顯,就是設定device變數的一些成員的值;第27行,怎麼樣,很眼熟是吧,前面已經分析過了,這裡就不再累述。

下面總結一下在編寫驅動程式時怎麼讓核心幫我們自動生成裝置檔案,其實也就是多呼叫2個函式:

1. class_create()

該函式在include/linux/device.h裡定義。

2. 上面所說的device_create()

關鍵在於把class_create()函式的返回值作為device_create()函式第乙個引數的值,其他引數的含義都很好明白。

linux驅動學習

1.在dev目錄下用ls l檢視字元裝置,輸出第一列為c的的標識的裝置,其中有主裝置號,和次裝置號 裝置檔案對應裝置驅動,linux將每個裝置對映成為乙個檔案,如果訪問檔案,那麼對應的訪問就是相應的io驅動程式,檔案和驅動主要是通過主裝置號聯絡起來的,次裝置號就是反應了具體是那個裝置 核心中 dev...

Linux驅動學習

1.make時使用make arch arm cross compile arm linux gnueabihf 命令而不是make命令 2.編譯.c檔案使用arm linux gnueabihf gcc o c生產可執行檔案 3.cat proc devices 只顯示驅動的主裝置號,且是分類顯示...

linux驅動學習

驅動學習筆記 1模組載入函式 模組載入的是觸發,載入完畢後就解除安裝 static int init mymodule init void module init mymodule init 2模組解除安裝函式 模組被關閉時觸發,或者系統被關閉時觸發 static void exit mymodul...