安卓驅動裝置註冊

2021-10-01 16:41:38 字數 2787 閱讀 1955

linux驅動註冊流程

驅動結構體填充完畢後,需要註冊到核心之中。

其中有三種方法來註冊裝置驅動:

(1) 動態註冊申請裝置號 + cdev 註冊裝置驅動

在不知道裝置號的情況下,通過動態註冊驅動申請到的裝置號並存到dev_t 型別中,通過cdev_init將驅動結構體ops賦值給cdev->ops,然後通過cdev_add將cdev結構體與裝置號關聯。

動態註冊並申請裝置號api:

alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,

const char *name)

dev :       alloc_chrdev_region函式向核心申請下來的裝置號結構體

baseminor : 次裝置號的起始

count:     申請次裝置號的個數

name :     執行 cat  /proc/devices顯示的名稱

cdev的使用:

a. 執行cdev_init函式,將cdev和file_operations關聯起來

b. 使用cdev_add函式,將cdev和裝置號關聯起來

解除安裝api:

unregister_chrdev_region(dev *dev, int num);

eg:驅動動態裝置號註冊例項: flashlight_devno為被賦值的結構體變數

cdev_init原型

cdev_add原型

cdev解除安裝api: void cdev_del(struct cdev *p)

(2) 靜態申請裝置號 + cdev 註冊裝置驅動

在已知驅動主裝置號的情況下,可以通過靜態註冊驅動。其步驟與動態註冊有些區別。

需要先定義乙個dev_t結構體,然後通過mkdev將主裝置號與此裝置號合成賦值給dev_t。

靜態註冊驅動api:

int register_chrdev_region(dev_t *dev, unsigned int count, char *name);

dev: 由已知的主裝置號合成的裝置號結構體 mkdev(major,mnior)的返回值

count: 申請此裝置號個數

name: 裝置名 出現在 /proc/devices

解除安裝靜態註冊api:

unregister_chrdev_region(dev *dev, int num);

eg.靜態註冊獲取裝置號,其中major為已經被賦值的變數

(3) 自動識別靜態、動態分配

程式也可以自動選擇靜態或動態分配api:

int register_chrdev(unsigned int num, const char *name, struct file_operations *ops)

num: 為0時動態註冊,非零時以num為主裝置號靜態註冊。

name: 裝置名

ops: 驅動結構體

解除安裝api:

int unregister_chrdev(unsigned int major, const  char *name)

與上兩個註冊方法不同的是,int register_chrdev會自動將ops與裝置號關聯,不用手動cdev_init、cdev_add。且當建立class節點需要裝置號結構體時,需要mkdev(major,minor)返回值。但是此api較為耗資源。

eg.自動識別靜態、動態分配

根據主次裝置號獲取裝置號結構體api:

dev_num=mkdev(major,minor);  major是乙個表示裝置號的主裝置號,minor次裝置號

根據裝置號結構體獲取主次裝置號api:

major = major(dev_num); 獲取主裝置號

minor = minor(dev_num); 獲取從裝置號

裝置註冊成功後,在/pro/device可檢視

裝置註冊進去後,需要建立節點才可以使驅動被呼叫。

在/sys/class建立節點類api:

struct class *class_create(struct module *owner, const char *name)

owner:模組所有者

name: 指定類名   //在/sys/下可見

在/sys/class/name已知類節點下建立裝置節點api:

struct device *device_create(struct class *cls, struct device *parent,

dev_t devt, void *drvdata,

const char *fmt, ...);

eg.建立節點

裝置註冊 驅動註冊以及雜項裝置註冊之間的關係

1.裝置宣告是在平台檔案 home leizi android itop4412 kernel 3.0 arch arm mach exynos mach itop4412.c中,如下圖,並且裝置名稱是led two.核心編譯之後,s3c device leds ctl被註冊到核心中,並不名稱是le...

Linux 驅動之字元裝置註冊

目的 給空模組新增驅動殼子 核心工作量 file operations及其元素填充 註冊驅動。腦海裡先有框架,知道自己要幹嘛 細節 不需要乙個字乙個字敲,可以到核心中去尋找參考 複製過來改 寫下的所有 必須心裡清楚明白,不能似懂非懂。先定義file operations結構體變數 自定義乙個file...

linux驅動程式設計之裝置註冊

linux下編寫驅動時有註冊裝置這一步,裝置註冊有兩種方法,一種是直接以平台的形式新增,平時都是用這種方式實現,另一種則是編譯成.c檔案,通過ko檔案新增進去,其實就是將以平台的方式新增的過程通過自己的 實現出來,如下是這兩種的實現過程 1.以平台的形式新增 a.新增裝置的結構體 b.將裝置新增到裝...