[英]Linux Char Driver
誰能告訴我Char驅動程序如何綁定到相應的物理設備?
另外,我想知道我們在char驅動程序中的哪個位置指定了物理設備相關的信息,內核可以使用這些信息來進行綁定。
謝謝 !!
全局數組(用於塊的bdev_map和用於字符設備的cdev_map)用於實現哈希表,該哈希表使用設備主數作為哈希鍵。
在調用char in驅動程序進行注冊后,調用get in調用以獲取主數字和副數字。
int register_chrdev_region(dev_t from,unsigned count,const char * name)int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,const char * name);
獲得設備編號范圍后,需要通過將其添加到字符設備數據庫中來激活該設備。
無效的cdev_init(struct cdev * cdev,const struct file_operations * fops); int cdev_add(struct cdev * p,dev_t dev,unsigned count);復制代碼
在cdev結構上,這里用文件操作和相關的字符設備進行初始化。
每當打開設備文件時,各種文件系統實現都會調用init_special_inode函數來為塊或字符設備文件創建inode。
void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{
inode->i_mode = mode;
if (S_ISCHR(mode)) {
inode->i_fop = &def_chr_fops;
inode->i_rdev = rdev;
} else if (S_ISBLK(mode)) {
inode->i_fop = &def_blk_fops;
inode->i_rdev = rdev;
}
else
printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n",
mode);
}
現在將調用default_chr_fpos chrdev_open ()方法。 它會在cdev_map數組中查找inode-> rdev設備,並獲取cdev結構的實例。 引用cdev時,它將文件-> f_op綁定到cdev文件操作,並調用字符驅動程序的open方法。
在I2C客戶端驅動程序之類的字符驅動程序中,我們在客戶端結構的“ addr”字段中指定從站地址,然后在此客戶端上調用i2c_master_send()或i2c_master_receive()。 該調用最終將轉到控制該線路的主適配器,然后適配器與從屬地址指定的設備進行通信。
驅動程序操作的綁定主要通過cdev_init()和cdev_add()函數完成。
驅動程序也可以選擇提供probe()函數,並讓內核查找並綁定該驅動程序能夠支持的所有設備。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.