免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3637 | 回复: 6
打印 上一主题 下一主题

[硬件及驱动] 在内核中读写某个指定的I2C设备如何得到i2c_adapter结构? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-01 10:05 |只看该作者 |倒序浏览
本帖最后由 msbtx 于 2012-11-01 10:12 编辑

RT,我需要在网络系统中增加对SFP模块的自适应支持,需要在内核态读写某个指定地址的I2C从设备。我现在的想法是用i2c_transfer函数发送,但是他需要一个i2c_adapter结构体,即I2C控制器描述结构,但是我找了很长时间,没有找到相应的全局变量,怎么把它拿出来?

论坛徽章:
0
2 [报告]
发表于 2012-11-01 11:14 |只看该作者
本帖最后由 frank529 于 2012-11-01 11:19 编辑

给你个范例吧,XXX是你的设备名,随便定义:
  1. struct xxx_i2c_client;
  2. struct i2c_driver xxx_i2c_driver ;

  3. static int xxx_i2c_attach_adapter(struct i2c_adapter *adap)
  4. {
  5.        xxx_i2c_client.addr = (i2c地址);
  6.        xxx_i2c_client.driver = &xxx_i2c_driver ;
  7.        xxx_i2c_client.adpter = adap;

  8.       i2c_attach_client(&xxx_i2c_client);
  9. }

  10. static int xxx_i2c_detach_client(struct i2c_client *client)
  11. {
  12.        i2c_detach_client(client);
  13. }


  14. static struct i2c_driver xxx_i2c_driver =
  15. {
  16.         .driver = {
  17.                 .name = "xxx",
  18.         },
  19.         .attach_adapter = xxx_i2c_attach_adapter,
  20.         .detach_client = xxx_i2c_detach_client,
  21. };

  22. static int xxx_i2c_init(void)
  23. {
  24.       i2c_add_driver(&xxx_i2c_driver);
  25. }

  26. static void xxx_i2c_exit(void)
  27. {
  28.       i2c_del_driver(&xxx_i2c_driver);
  29. }


  30. module_init(xxx_i2c_init);
  31. module_exit(xxx_i2c_exit);

复制代码
通过i2c_add_driver添加I2C设备驱动,内核会调用struct i2c_driver的回调函数attach_adapter,内核传入的参数就是指向你所说的adapter。后面就可以用xxx_i2c_client.adapter作为i2c_transfer的参数。



论坛徽章:
0
3 [报告]
发表于 2012-11-01 17:00 |只看该作者
板子的BSP里面的i2c-dev.c里面有这段代码,但是在attach_adapter回调函数里加打印发现没有被调用。
然后我用同样的方法,发现of_register_platform_driver注册的I2C控制器设备结构的probe函数没有被调用。但是设备树里面明明有相关设备,而且在uboot里面的i2c是可以正确初始化的

论坛徽章:
0
4 [报告]
发表于 2012-11-02 09:05 |只看该作者
回复 3# msbtx

两条建议:

    1、跟踪i2c_add_driver函数看没有调用attach_adapter的原因是什么?多半可能是代表I2C控制器的adapter没有正确注册
   2、确认i2c控制器的platform_device和platform_driver是否都有注册,并正确匹配

论坛徽章:
0
5 [报告]
发表于 2012-11-02 13:18 |只看该作者
谢谢frank529的建议,我还有个问题就是,xxx_i2c_attach_adapter函数里的i2c_adapter参数如何拿出来给在其他的文件里的函数用呢?除了自己创建一个全局变量再在函数里吧指针传给它,还有没有更好的办法?

论坛徽章:
0
6 [报告]
发表于 2012-11-05 13:37 |只看该作者
回复 5# msbtx


     这已经是最直接最好的办法了,有什么问题吗?

论坛徽章:
0
7 [报告]
发表于 2012-11-14 16:49 |只看该作者
在内核中操作可以这样:
1.利用filp_open得到struct file指针
2. 然后结合驱动程序,通过 file->private_data 传递LZ所说的client->adapter参数或者调用read/write/ioctl等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP