**
在linux驅動中把無法歸類的五花八門的裝置定義為混雜裝置(用miscdevice結構體表述)。
miscdevice共享乙個主裝置號misc_major(即10),但次裝置號不同。 所有的miscdevice設
備形成了乙個鍊錶,對裝置訪問時核心根據次裝置號查詢對應的miscdevice裝置,然後呼叫其file_operations結構中註冊的檔案操作介面進行操作。 在核心中用struct
miscdevice表示miscdevice裝置,然後呼叫其file_operations結構中註冊的檔案操作介面進行操作。miscdevice的api實現在drivers/char/misc.c中。
下邊是描述這個裝置的結構體:
c-sharp**
struct miscdevice ;
然後來看看misc子系統的初始化函式:
c-sharp**
static
int __init misc_init(void)
/*misc作為乙個子系統被註冊到linux核心中*/
subsys_initcall(misc_init);
下邊是register_chrdev函式的實現:
c-sharp**
int register_chrdev(unsigned int major, const
char *name,
const
struct file_operations *fops)
來看看這個裝置的操作函式的集合:
c-sharp**
static
const
struct file_operations misc_fops = ;
可以看到這裡只有乙個開啟函式,使用者開啟miscdevice裝置是通過主裝置號對應的開啟函式,在這個函式中找到次裝置號對應的相應的具體裝置的open函式。它的實現如下:
c-sharp**
static
int misc_open(struct inode * inode, struct file * file)
}
if (!new_fops)
}
if (!new_fops)
goto fail;
}
err = 0;
/*儲存舊開啟函式的位址*/
old_fops = file->f_op;
/*讓主裝置號的操作函式集合指標指向具體裝置的操作函式集合*/
file->f_op = new_fops;
if (file->f_op->open)
}
fops_put(old_fops);
fail:
mutex_unlock(&misc_mtx);
unlock_kernel();
return err;
}
再來看看misc子系統對外提供的兩個重要的api,misc_register,misc_deregister:
c-sharp**
int misc_register(struct miscdevice * misc)
}
/*看是否是需要動態分配次裝置號*/
if (misc->minor == misc_dynamic_minor)
/*得到這個次裝置號*/
misc->minor = i;
}
/*設定點陣圖中相應位為1*/
if (misc->minor
misc_minors[misc->minor >> 3] |= 1
/*計算出裝置號*/
dev = mkdev(misc_major, misc->minor);
/*在/dev下建立裝置節點,這就是有些驅動程式沒有顯式呼叫device_create,卻出現了裝置節點的原因*/
misc->this_device = device_create(misc_class, misc->parent, dev, null,
"%s", misc->name);
if (is_err(misc->this_device))
/* * add it to the front, so that later devices can "override"
* earlier defaults
*//*將這個miscdevice新增到misc_list鍊錶中*/
list_add(&misc->list, &misc_list);
out:
mutex_unlock(&misc_mtx);
return err;
}
這個是miscdevice的解除安裝函式:
c-sharp**
int misc_deregister(struct miscdevice *misc)
mutex_unlock(&misc_mtx);
return 0;
}
總結一下miscdevice驅動的註冊和解除安裝流程:
misc_register:
匹配次裝置號->找到乙個沒有占用的次裝置號(如果需要動態分配的話)->計算設號->建立裝置文-
miscdevice結構體新增到misc_list鍊錶中。
misc_deregister:
從mist_list中刪除miscdevice->刪除裝置檔案->點陣圖位清零。
Linux驅動修煉之道 混雜裝置
在linux驅動中把無法歸類的五花八門的裝置定義為混雜裝置 用miscdevice結構體表述 miscdevice共享乙個主裝置號misc major 即10 但次裝置號不同。所有的miscdevice設 備形成了乙個鍊錶,對裝置訪問時核心根據次裝置號查詢對應的miscdevice裝置,然後呼叫其f...
linux混雜裝置驅動
在linux系統中,存在一類字元裝置,它們擁有相同的主裝置號 10 但次裝置號不同,我 們稱這類裝置為混雜裝置 miscdevice 所有的 混雜裝置形成乙個鍊錶,對裝置訪問時核心根據 次裝置號查詢到相應的混雜裝置。linux中使用struct miscdevice來描述乙個混雜裝置。struct ...
Linux驅動修煉之道
一些學習linux驅動的筆記整理在這裡與大家分享,如果那裡有錯誤也請高手指出。若干年後能進入intel開源中心或ibm搞linux kernel是我目前的目標。君子藏器於身,待時而動。文章 不斷更新中。linux驅動修煉之道 流水燈 linux驅動修煉之道 按鍵 linux驅動修煉之道 lcd背光與...