首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

LinuxI2C分系统之一实例化IC2设备(Client)的四种方法(一、二)

2013-03-21 
LinuxI2C子系统之一实例化IC2设备(Client)的四种方法(一、二)最近的项目工作中需要调试维护I2C控制的视频采

LinuxI2C子系统之一实例化IC2设备(Client)的四种方法(一、二)

      最近的项目工作中需要调试维护I2C控制的视频采集设备驱动代码,于是花了些时间来研究I2C驱动框架,发现其复杂度不亚于ALSA-ASOC驱动框架(仅个人感觉,勿怪)!并打算将自己的研究心得记录下来,一是自己想看时可以随时找到,二来是帮助后来者少走弯路。第一篇I2C子系统从译文开始:

原文件位置:linux源码目录\Documentation\i2c\instantiating-devices

                       ===========================================

                                                    怎么实例化I2C设备

                      ===========================================

     与PCI与USB总线不同,I2C总线不能在硬件层就将挂在其上的设备枚举出来。相反地,软件必须清楚哪个设备挂在哪个I2C总线上及各个设备的地址ID。所以,内核驱动代码必须显式地“手动”实例化I2C设备。针对不同设备操作的复杂度及项目及其他需要,目前有四种实例化I2C设备的方法:

第一:根据I2C总线号来实例化设备

    这种方法适用于用I2C作为系统总线的嵌入式设备。在这类系统中,I2C总线会事先确定一个总线号,正是这个原因,就可以提前定义(原文是pre-declare字面意思是声明,但个人感觉是定义,此处值得商榷,还请读者多提宝贵意见,下同)挂在确定了总线号的I2C总线设备了。对I2C总线设备的定义是通过结构体i2c_board_info来完成的,该结构体实例后来会被i2c_register_board_info()函数调用并挂到一个专门管理i2c_board_info结构的链表。

用omap2 h4为例来说明:

static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev){(...)struct i2c_adapter *i2c_adap;struct i2c_board_info i2c_info;(...)i2c_adap = i2c_get_adapter(2);memset(&i2c_info, 0, sizeof(struct i2c_board_info));strlcpy(i2c_info.name, "isp1301_pnx", I2C_NAME_SIZE);isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info,   normal_i2c, NULL);i2c_put_adapter(i2c_adap);(...)}

      上面的代码通过i2c_new_probed_device()函数为OHCI适配器上的I2C总线实例化了至少1个I2C设备。首先测试设备地址0X2C,如果没反应则再尝试设备地址0x2D,如果还没反应地话,就会放弃,匹配设备驱动失败。

   实例化I2C设备的驱动程序同样负责在Cleanup时析构设备。析构是通过i2c_new_device()或者i2c_new_probed_device()函数中i2c_unregister_device()来完成的。

另两种方法见后续博文。

  

热点排行