Linux中关于一个I2C驱动同时操纵两条I2C总线的问题
我在Linux环境下编写I2C的驱动过程中,有两个一样的I2C从设备(设备地址也一样),在硬件电路上分别接在不同的两条I2C总线上。因为两个从设备的操作是一模一样的,我想编写一个I2C的驱动,可以同时完成对这两个从设备操作。
代码大致如下:
struct i2c_client *xxx_client = NULL;//全局变量,之后对设备的操作都是通过操作他来完成的。
static const struct i2c_device_id xxx_id[] = {
{ "xxx1", 0, },
{ "xxx2", 0, },
{ }
};
注册i2c_board_info
static struct i2c_board_info __initdata test_i2c_devices[] = {
{
I2C_BOARD_INFO("xxx1", 0x27);//0x27为芯片地址
},
{
I2C_BOARD_INFO("xxx2", 0x27);
},
};
中间省略总线设备等
static int __devinit xxx_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
xxx_client = .....;//在这里获取相应的client值。
……
//设备的注册等一系列动作
return 0;
}
static struct i2c_driver xxx_driver = {
.driver = {
.name= "xxx",
},
.probe= xxx_probe,
.remove= xxx_remove,
.id_table= xxx_id,
};
static int __init xxx_init(void)
{
return i2c_add_driver(&xxx_driver);
}
module_init(xxx_init);
......
现遇到了如下的问题:
第一个I2C设备(xxx1)可以正常操作,第二个I2C设备(xxx2)却出现错误。从打印信息上看,显示的是主设备与从设备没有连接上。我分别对其中的任何一个进行操作时,都可以正常设备,说明了硬件上没有问题,但是一旦将两个合在一起时,就出现了问题,总是在前面的那个可以正常操作,后面的那个就会出现错误。从打印信息上也可以看出,根据i2c_device_id 匹配上的对应的client。但就是第二个无法正常通信。由于设备节点已经被OS与APP程序多处使用,改变或增加设备节点的方法不现实。
故想请教各位高人,帮忙分析下问题出现的可能与解决方法。我感觉问题出在xxx_probe中,但是却不知道在哪里。运行的过程中就像是xxx_probe被分别调用了两次,第一次是正常的,第二次就报错,因为第二次也会出现设备注册的过程,所以这个问题也不知道要如何解决。
代码中关于static const struct i2c_device_id xxx_id[] 的写法正确吗?
恳请各位高人不吝赐教!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
注册2c_board_info的时候,两个设备要指定不同的总线号,你是怎么注册的呢?
我也是啊,我是做CAMERA的自适应,两个CAMERA,也是写在前面的一个可以驱动成功,第二个就不行。只要写在前面,无论哪个CAMERA,都可以成功驱动,而写在后面的总是悲剧,求大虾指导啊
http://bbs.chinaunix.net/thread-2333657-1-1.html
这是我的问题,和楼主一样,大家进来看看啊
本帖最后由 npuazm 于 2011-07-26 16:41 编辑
感觉 下面的代码有问题
static const struct i2c_device_id xxx_id[] = {
{ "xxx1", 0, },
{ "xxx2", 0, },
{ }
}
应该是这样吧
static const struct i2c_device_id xxx1_id[] = {
{ "xxx1", 0, },
{ }
}
注册i2c_board_info
static struct i2c_board_info __initdata test_i2c_devices1[]/*这是和host 关联的,及这个用I2C 1*/
= {
{
I2C_BOARD_INFO("xxx1", 0x27);//0x27为芯片地址
},
};
static struct i2c_board_info __initdata test_i2c_devices2[]/*这是和host 关联的,及这个用I2C 2*/
= {
{
I2C_BOARD_INFO("xxx2", 0x27);//0x27为芯片地址
},
};
中间省略总线设备等
第一个I2C 设备:
static const struct i2c_device_id xxx1_id[] = {
{ "xxx1", 0, },
{ }
}
static int __devinit xxx1_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
xxx1_client = .....;//在这里获取相应的client值。
……
//设备的注册等一系列动作
return 0;
}
static struct i2c_driver xxx1_driver = {
.driver = {
.name= "xxx1",
},
.probe= xxx1_probe,
.remove= xxx1_remove,
.id_table= xxx1_id,
};
static int __init xxx1_init(void)
{
return i2c_add_driver(&xxx1_driver);
}
module_init(xxx1_init);
第二个I2C 设备:
static const struct i2c_device_id xxx2_id[] = {
{ "xxx2", 0, },
{ }
}
static int __devinit xxx2_probe(struct i2c_client *client,const struct i2c_device_id *id)
{
xxx1_client = .....;//在这里获取相应的client值。
……
//设备的注册等一系列动作
return 0;
}
static struct i2c_driver xxx2_driver = {
.driver = {
.name= "xxx2",
},
.probe= xxx2_probe,
.remove= xxx2_remove,
.id_table= xxx2_id,
};
static int __init xxx2_init(void)
{
return i2c_add_driver(&xxx2_driver);
}
module_init(xxx2_init);