i2c--2.6.34文档:如何枚举产生i2c_client
来源:互联网 发布:java 位图存储 编辑:程序博客网 时间:2024/06/03 22:06
根据自己的理解翻译了http://lxr.linux.no/linux+v2.6.34/Documentation/i2c/instantiating-devices中关于枚举建立i2c_client的文档。有异议或疑问请参照原文,毕竟内核的文档才是真正的精华。
方法1:使用总线号声明设备。
i2c_new_probed_device的原型是:
struct i2c_client * i2c_new_probed_device(struct i2c_adapter *adap,struct i2c_board_info *info,unsigned short const *addr_list);
这个函数将会在指定的总线上探测addr_list中的地址,将第一个有ACK反馈的地址赋给info->addr然后使用前两个参数调用i2c_new_device。它的返回值也是一个可用的i2c_client指针。i2c_unregister_device() 可以注销i2c_new_device()/i2c_new_probed_device()申请的i2c_client。
补充:驱动开发者如何知道一个物理i2c总线的编号?
[root@zlg /]# cat /sys/class/i2c-dev/i2c-0/name
PNX4008-I2C0
[root@zlg /]# cat /sys/class/i2c-dev/i2c-1/name
PNX4008-I2C1
[root@zlg /]# cat /sys/class/i2c-dev/i2c-2/name
USB-I2C
方法3:在所有i2c总线上探测特定设备
内核文档中关于方法2的限制及方法3的好处我没看懂。说一下自己的理解,那就是方法2虽然可以探测多个地址,但是仅仅能在一个指定的总线上探测,并且探测到第一个可用的地址就停止探测了。如果之前并不确定总线的编号,或者一次探测多个i2c设备,就需要用到方法3了。实现方法3需要两个条件:******实现i2c_driver的detect成员。这个成员函数原型是:
int (*detect)(struct i2c_client *, int kind, struct i2c_board_info *);
这个函数必须检查第二个参数的addr域是否自己支持的地址,是的话则至少填充info->type,info的其它成员也可以填充,但不应该修改addr。
如果是就返回0,否则返回-ENODEV。
******初始化i2c_driver的
address_list成员。i2c_driver注册的时候,i2c_core会在所有已经注册的i2c_adapter上探测
address_list中的所有地址,硬件探测成功之后后调用i2c_driver的detect成员,然后根据detect填充的info建立一个i2c_client。如果两个总线上有相同的地址的设备,那么会分别建立两个i2c_client。如果
address_list中的多个地址都有设备占用,那么会建立多个i2c_client。
或许因为方法3太过于强大和灵活,内核文档不推荐这种方法。优先选用方法1和2。
方法4:从用户控件枚举。如果编写驱动的时候实在无法知道i2c设备的地址(连可能的地址列表也不知道),那就需要系统运行后从用户空间输入了。
用户空间通过两个sysfs属性文件来建立和删除i2c_client:new_device和delete_device。这两个文件都是只写的。
new_device有两个参数:i2c设备的名字(字符串)和地址(以0x开头的16进制数)。
delete_device只有一个参数,那就是设备的地址。
举例:
# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device可以看到,此时已经指定了总线编号。
补充--方法5:在i2c_driver中的attach_adapter中调用i2c_new_device()或者i2c_new_probed_device()
这个方法色实质和方法2类似。
这样的例子在2.6.34内核的/sound/ppc/keywest.c中,可以参考。
i2c_driver和i2c_client的总线类型均为i2c_bus_type,i2c_client的name成员(对应info->type)和i2c_driver中的id_table中的名字是它们相互绑定的依据。
不同的i2c_adapter上可以挂靠相同地址的设备,但是i2c设备的名字是全局的,因此不同设备的名字不要相同。(并不是不能相同)。
- i2c--2.6.34文档:如何枚举产生i2c_client
- i2c--2.6.34文档:如何枚举产生i2c_client
- i2c--2.6.34文档:如何枚举产生i2c_client
- i2c--2.6.34文档:如何枚举产生i2c_client
- i2c--2.6.34文档:如何枚举产生i2c_client
- 如何枚举产生i2c_client
- Linux下面写i2c设备的驱动-如何枚举产生i2c_client
- Linux下面写i2c设备的驱动-如何枚举产生i2c_client
- 如何枚举产生i2c_client ,何时使用i2c_new_device
- 如何枚举产生i2c_client ,何时使用i2c_new_device
- 如何实例化一个i2c设备(struct i2c_client)
- linux I2C 驱动之----i2c_client 的注册
- i2c struct i2c_adapter /i2c_client /i2c_driver /i2c_add_driver() /i2c_register_driver()
- linux I2C 驱动之----i2c_client 的注册
- linux I2C 驱动之----i2c_client 的注册
- linux I2C 驱动之----i2c_client 的注册
- linux I2C 驱动之----i2c_client 的注册
- i2c_client,i2c_adapter和I2C-core的简介
- 智能手机技术的发展与剖析
- MFC的模块状态:从AfxGetApp()和AFX_MANAGE_STATE()看MFC的模块状态
- MyEclipse注册码
- ubuntu10.04 数字小键盘不能使用的解决方法
- MyEclipse6.5安装SVN插件方法(三种)及使用
- i2c--2.6.34文档:如何枚举产生i2c_client
- Linux磁盘分区UUID的获取及其UUID的作用
- 深入JAVA虚拟机
- FirstChatRoom
- BI数据分析方法小结
- 多个linux gcc版本
- 管理理念:软件项目管理原则谈
- Apache Avro 和 Thrift 的比较(摘录)
- (转)FCKEditor工具栏按钮的设置方法及具体参数含义