有谁能告诉我Char Driver如何绑定到相应的物理设备?
另外,我想知道在char驱动程序中我们指定了物理设备相关信息的位置,内核可以使用它来进行绑定。
谢谢!
答案 0 :(得分:2)
全局数组 - 用于块的bdev_map和用于字符设备的cdev_map - 用于实现哈希表,该哈希表使用设备主号作为哈希键。
注册char驱动程序后调用get来获取主要和次要数字。
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);
获取设备编号范围后,需要通过将设备添加到字符设备数据库来激活设备。
void 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,它会将file-> f_op绑定到cdev文件操作,并为字符驱动程序调用open方法。
答案 1 :(得分:0)
在像I2C客户端驱动程序这样的字符驱动程序中,我们在客户端结构中指定了从地址" addr"字段然后在此客户端上调用i2c_master_send()或i2c_master_receive()。此调用最终将转到控制该行的主适配器,然后适配器与从属地址指定的设备进行通信。
驱动程序操作的绑定主要使用cdev_init()和cdev_add()函数完成。
此外,驱动程序可以选择提供probe()函数,让内核查找并绑定该驱动程序能够支持的所有设备。