Linux中关于一个I2C驱动同时操纵两条I2C总线的问题

发布于 2022-10-15 08:35:26 字数 3555 浏览 19 评论 0

我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

妄司 2022-10-22 08:35:26

注册2c_board_info的时候,两个设备要指定不同的总线号,你是怎么注册的呢?

不必在意 2022-10-22 08:35:26

我也是啊,我是做CAMERA的自适应,两个CAMERA,也是写在前面的一个可以驱动成功,第二个就不行。只要写在前面,无论哪个CAMERA,都可以成功驱动,而写在后面的总是悲剧,求大虾指导啊

难得心□动 2022-10-22 08:35:26

http://bbs.chinaunix.net/thread-2333657-1-1.html

这是我的问题,和楼主一样,大家进来看看啊

墨小沫ゞ 2022-10-22 08:35:26

本帖最后由 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);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文