Linux kernel Linux字符驱动程序

Linux kernel Linux字符驱动程序,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,有人能告诉我Char驱动程序是如何绑定到相应的物理设备的吗 另外,我想知道我们在char驱动程序中的什么地方指定了与物理设备相关的信息,内核可以使用这些信息进行绑定 谢谢 在像I2C客户机驱动程序这样的字符驱动程序中,我们在客户机结构的“addr”字段中指定从机地址,然后在此客户机上调用I2C_master_send()或I2C_master_receive()。此调用最终将转到控制该线路的主适配器,然后适配器将与从地址指定的设备通信 驱动程序操作的绑定主要通过cdev_init()和cdev_

有人能告诉我Char驱动程序是如何绑定到相应的物理设备的吗

另外,我想知道我们在char驱动程序中的什么地方指定了与物理设备相关的信息,内核可以使用这些信息进行绑定


谢谢

在像I2C客户机驱动程序这样的字符驱动程序中,我们在客户机结构的“addr”字段中指定从机地址,然后在此客户机上调用I2C_master_send()或I2C_master_receive()。此调用最终将转到控制该线路的主适配器,然后适配器将与从地址指定的设备通信

驱动程序操作的绑定主要通过cdev_init()和cdev_add()函数完成


此外,驱动程序还可以选择提供probe()函数,并让内核查找和绑定该驱动程序能够支持的所有设备。

使用全局数组(块的bdev_映射和字符设备的cdev_映射)来实现哈希表,该哈希表使用设备主数字作为哈希键

在注册char驱动程序时,会调用以下调用get in以获取主要号码和次要号码

int register_chrdev_region(dev_t from,unsigned count,const char*name) int alloc_chrdev_区域(dev_t*dev,无符号baseminor,无符号计数, 常量字符*名称)

获得设备编号范围后,需要通过将其添加到字符设备数据库来激活设备

void cdev_init(结构cdev*cdev,常量结构文件_操作*fops); int cdev_add(结构cdev*p,dev_t dev,无符号计数)

这里对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);
}

现在将调用默认的\u chr\u fpos()方法。它将在cdev_映射数组中查找inode->rdev设备,并将获得cdev结构的实例。通过对cdev的引用,它将文件->f_op绑定到cdev文件操作,并调用角色驱动程序的open方法。

谢谢!!但是,我们在char驱动程序中指定特定于硬件的详细信息在哪里?我的主要疑问是char驱动程序如何将特定于供应商/硬件的详细信息传递给内核,这将有助于内核将其绑定到相应的设备。确切的情况和问题是什么,您能否指定。。。。供应商H/W详细信息将通过设备树在内核层本身提供。从应用程序中传递特定于设备的信息的用例是什么。我对Linux设备驱动程序不熟悉。我在试图理解char驱动程序时遇到了这个疑问。我在驱动程序代码中检查了PCI驱动程序,特定于硬件/供应商的详细信息是struct PCI_驱动程序的一部分,然后在初始化期间将其传递给PCI_register_driver()。pci_register_driver()将在内部调用driver_register(),特定于硬件的详细信息将保存在内核中的一个列表中。插入设备时,将迭代驱动程序列表并找到匹配项(将驱动程序绑定到设备)。字符驱动程序是如何实现的??字符驱动程序是一个标准接口,它不需要任何H/W信息,在内核中,您可以创建一个新设备,特定于设备的H/W将从设备树(ARM SOCS)中获取。您只需查看rtc驱动程序,它有一个驱动程序/rtc/rtc-dev.c,这是一个通用的字符驱动程序,将有一个更多的胶水驱动程序特定于您的董事会/HW rtc-*****.c,这将有H/W相关信息,并将从设备树中获取。我得到了上述pci驱动程序的示例代码。在“struct pci_驱动程序”中,我们指定了特定于供应商的详细信息和探测功能。在初始化过程中,我们将调用pci_register_driver()并传递“pci_driver”结构的地址。在内部,pci_寄存器_驱动程序()将调用驱动程序_寄存器()。设备驱动程序列表由总线驱动程序维护。现在,当插入设备时,将调用device_register()函数,并且设备列表也由总线驱动程序维护。总线驱动程序,然后将迭代设备驱动程序和设备的列表,并根据id_表找到匹配项。是否以类似的方式处理char驱动程序??如果是,请提供一些参考。我的主要疑问是char驱动程序如何将特定于供应商/硬件的详细信息传递给内核,这将有助于内核将其绑定到相应的设备。