簡體   English   中英

Linux Char驅動程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM