Chinaunix首页 | 论坛 | 博客
  • 博客访问: 434473
  • 博文数量: 99
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 1012
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-20 16:30
个人简介

linux kernel 工程师

文章分类

全部博文(99)

文章存档

2018年(5)

2017年(12)

2016年(27)

2015年(10)

2014年(43)

2012年(2)

我的朋友

分类: 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。

 

 

阅读(1599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~