linux kernel 工程师
全部博文(99)
分类: LINUX
2014-03-17 16:58:23
static int __init i2c_dev_init(void)
{
int res;
printk(KERN_INFO "i2c /dev entries driver\n");
/* 注册一个字符设备,为用户态程序访问i2c提供接口 */
res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
if (res)
goto out;
/* 创建class, 在sys/class/i2c-dev */
i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");
if (IS_ERR(i2c_dev_class)) {
res = PTR_ERR(i2c_dev_class);
goto out_unreg_chrdev;
}
res = i2c_add_driver(&i2cdev_driver);
if (res)
goto out_unreg_class;
return 0;
out_unreg_class:
class_destroy(i2c_dev_class);
out_unreg_chrdev:
unregister_chrdev(I2C_MAJOR, "i2c");
out:
printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);
return res;
}
-------------------------
static struct i2c_driver i2cdev_driver = {
.driver = {
.name = "dev_driver",
},
.attach_adapter = i2cdev_attach_adapter,
.detach_adapter = i2cdev_detach_adapter,
};
i2c_add_driver(&i2cdev_driver);函数执行会调用 i2cdev_attach_adapter,之后就会形成如下的以i2c_dev_list为head的链表。
链表上的每个i2c_dev会指向不同的adapter。
每个adapter的nr表示的总线号,对应于字符设备的minor设备号。
当打开设备时,根据设备的minor设备号找到下面链表里面的对应的adapter。
之后对于设备的读写操作就可以根据找到的adapter进行操作了。
一个adapter实际上就是一个I2c控制器, adapter对应一个算法,该算法实现了对i2c设备的读写时序。
在实际读写时只需要输入设备地址,设备内寄存器地址,读或写, 写的数据或读数据采用的缓冲区地址就ok。