靜態登記法

當驅動程式在設定字元裝置時,要做的第一件事事先取得一或多個裝置編號。用來處理這件工作的是所定義的register_chrdev_region()函式:

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

第一個引數first是你想配置的裝置編號範圍之起點;first的次編號部分通常是0,但這不是硬性規定。count是你想申請的連續裝置編號的總數。如果count過大,得到的範圍可能會跨越下一個主編號。最後的name引數是獲得此編號範圍的裝置名稱。這名稱會出現在/proc/devices與sysfs。

如同大部分的核心函式,回傳值為0表示成功,負值表示失敗,而且負值本身就是錯誤代碼。如果事先就知道所需的裝置編號的精確範圍,register_chrdev_region會很方便,問題是通常你不知道應該使用哪一個主編號,這時通常會使用動派配置的方式,以下為靜態登記的例子:

int major = 20,minor = 0;
dev_t dev=MKDEV(major,minor);
register_chrdev_region(dev,1,DRIVER_NAME);

另外在linux 2.4以前的做法是以使用 register_chrdev() 登記,Linux 2.6 已不推薦這個作法:

int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops);

寫法為:

int major = 20;
int register_chrdev(major,DRIVER_NAME,&fops);

這個函式是在 「fs/char_dev.c」檔案內實作的。major 引數是要使用的 major number,name 引數則是驅動程式名稱,fops 引數則是驅動程式提供的系統呼叫處理介面。登錄成功後,就會在 /proc/devices 顯示驅動程式名稱及 major number。major 引數也可傳入 「0」,如此 kernel 會自動分配一個還沒用到的 major number。

註銷登記

卸載驅動程式時,要用 unregister_chrdev_region() 函式跟 kernel 刪除 major number。

void unregister_chrdev_region(dev_t first, unsigned int count);

第一個引數(first)是包含主次編號的dev_t型態。 第二個引數是裝置數有多少。 範例:

unregister_chrdev_region(MKDEV(driverno,0),1);

如果是以register_chrdev()舊版本方式註冊的話則是使用下列方式註銷:

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

第一個引數(major) 是 register_chrdev() 函式分配的 「major number」。 第二個引數(name) 是驅動程式的名稱。 以上面例子來說就是:

unregister_chrdev(major,DRIVER_NAME);

results matching ""

    No results matching ""