普通字元裝置驅動的兩種註冊方式(新 舊)

2021-08-20 01:12:57 字數 2166 閱讀 4487

在核心中,對於乙個普通的字元裝置驅動,不難發現有兩種註冊方式:

register_chrdev族函式+建立裝置類、檔案的函式:這種方法是2.4版本流行的舊方法。優點是簡單;缺點是無法指定次裝置號

/*需要的定義*/

int test_major = -1;

static

struct class *mydev_pclass;

#define test_name "test"

#define mydev_cnt 3

/*正式註冊*/

test_major = register_chrdev(0, test_name, &test_fops);

if (test_major < 0)

/*用class_create建立乙個裝置類,這是建立裝置檔案的前置任務*/

mydev_pclass = class_create(this_module, "mydevice");

if (is_err(mydev_pclass))

/*由device_create正式建立裝置檔案*/

device_create(mydev_pclass, null, mkdev(test_major, 0), null, "mydevice");

return

0;/*倒影式錯誤處理流程*/

out_err_2:

class_destroy(mydev_pclass);

out_err_1:

unregister_chrdev(test_major);

out_err_0:

return -einval;

/*需要用到的定義*/

#define mydev_num mkdev(mymajor, 0)

#define myname "mydevice"

#define mydev_cnt 3

static

struct cdev *mydev_pcdev;

static

struct class *mydev_pclass;

dev_t mydev_num = 0;

unsigned int mydev_major = 0;

/*正式開始註冊*/

/*讓核心給我們自動分配裝置號(主次裝置號)*/

ret = alloc_chrdev_region(&mydev_num, 0, mydev_cnt, myname);

mydev_major = major(mydev_num);

if (ret < 0)

printk(kern_info "major %d\n", mydev_major);

/*cdev_alloc例項化乙個字元裝置體。為cdev分配記憶體*/

mydev_pcdev = cdev_alloc();

/*填充cdev裝置體。最主要是將file_operations填充進去*/

cdev_init(mydev_pcdev, &mydev_fops);

/*將裝置體與裝置號繫結並向核心註冊乙個字元裝置*/

ret = cdev_add(mydev_pcdev, mydev_num, mydev_cnt);

if (ret)

/*用class_create建立乙個裝置類,這是建立裝置檔案的前置任務*/

mydev_pclass = class_create(this_module, "mydevice");

if (is_err(mydev_pclass))

/*由device_create正式建立裝置檔案*/

device_create(mydev_pclass, null, mydev_num, null, "mydevice");

return

0;/*倒影式錯誤處理流程*/

out_err_3:

class_destroy(mydev_pclass);

out_err_2:

cdev_del(mydev_pcdev);

out_err_1:

unregister_chrdev_region(mydev_num, mydev_cnt);

out_err_0:

return -einval;

普通字元裝置驅動的兩種註冊方式(新 舊)

在核心中,對於乙個普通的字元裝置驅動,不難發現有兩種註冊方式 register chrdev族函式 建立裝置類 檔案的函式 這種方法是2.4版本流行的舊方法。優點是簡單 缺點是無法指定次裝置號 需要的定義 int test major 1 static struct class mydev pcla...

註冊事件的兩種方式

element.onclick function 特點 傳統的註冊方式具有唯一性,即同乙個元素同一事件只能設定乙個函式,如果寫了多個函式,最後乙個函式會把之前的函式都覆蓋掉。證明 傳統註冊事件 button 方法監聽註冊事件 button ie9 attachevent button var btn...

Android 廣播註冊兩種方式

兩種註冊型別的區別是 1 第一種不是常駐型廣播,也就是說廣播跟隨activity的生命週期。注意 在activity結束前,移除廣播接收器。2 第二種是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行。在android下,要想接受廣播資訊,那麼這個廣播接收器就得我們自己...