免费注册 查看新帖 |

Chinaunix

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

关于platform和i2c驱动的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-25 16:06 |只看该作者 |倒序浏览
1. 我想知道所谓的平台设备有没有主次设备号,如果有,是在哪里注册的,我用sourceinsight找了好久也没有找到,如果没有,为什么好多平台设备驱动在模块初始化的时候一句简单的Platform_driver_register()就可以了,那怎么建立设备文件呢???
  2.关于i2c-dev.c,它到底是适配器的驱动,还是挂载到i2c总线的设备驱动,具体怎么理清i2c-core,i2c总线驱动和i2c设备驱动的关系,如果用设备文件打开,是打开的总线驱动还是设备驱动??

大侠们救救我吧,太迷惑了!

论坛徽章:
0
2 [报告]
发表于 2009-03-25 16:57 |只看该作者
主要看你注册的是什么平台设备吧

需要字符操作的话就需要主次设备号~

http://blog.chinaunix.net/u1/57901/showart.php?id=1803248

间接介绍有platform设备和驱动的注册~

你可以参考一下~

I2C我没看过~ 就帮不上了~ = 3=

论坛徽章:
5
3 [报告]
发表于 2009-03-25 17:34 |只看该作者
LZ的处女贴也发这里了. 支持一下.

简单回答一下你的第2问:
i2c-dev提供了接口给你做open/close/read/write
i2c-core实现了I2C命令的封装, i2c client的封装.
I2c设备驱动实现了具体的i2c client instance.

                                                 call               call
open/close/read/write  i2c-dev ->   i2c-core -> i2c device driver

个人观点, 仅供参考.

论坛徽章:
0
4 [报告]
发表于 2009-03-26 16:30 |只看该作者
谢谢楼上两位的回复,我差不多明白 了,我是这样理解的
1 platform和主次设备号没有关系的,如果你想用设备文件打开设备,就一定要有设备号创建节点
2 i2c-dev实现了一个虚拟的i2c设备驱动,它随你的设备打开而创建,然后可以通过i2c-dev提供的函数对其操控,设备关系时又消失,如果想要有一个真正的设备文件,需要自己去实现

论坛徽章:
0
5 [报告]
发表于 2009-03-26 16:47 |只看该作者
1。Platform_driver_register是和Platform_device_register对应的,Platform_driver_register注册一个驱动,包括名字、探测函数(probe)等,而Platform_device_register注册一个设备,包括名字、设备资源(IO资源、中断资源及其他)等。这两者通过名字联系在一起。如果名字相同,那么驱动的探测函数就会被执行,然后再注册一个设备驱动,就可以通过open/close/read/write等来操作设备了。
2。i2c-dev.c应该是实现了一个I2C总线驱动,通过这个驱动,可以访问总线上的任何I2C设备,具体过程可以参考Documentation/i2c/dev-interface,不过编写应用程序的人要知道I2C设备的器件地址才行。

论坛徽章:
0
6 [报告]
发表于 2009-03-26 21:52 |只看该作者
我觉得楼上的说i2c-dev.c是总线设备是不对的,看i2c-dev.c的代码可以看到它实现了一个i2c-client,这说明它代表的是挂载在总线上的设备

论坛徽章:
0
7 [报告]
发表于 2009-03-27 09:37 |只看该作者
i2c-dev.c的代码看不出实现了一个i2c-client,而是实现了一个I2C总线上所有i2c-client的访问,这一点你可以通过Documentation/i2c/dev-interface的介绍来理解,所以i2c-dev.c可以理解为总线驱动。
根据Documentation/i2c/dev-interface,举例来说,假如一个I2C总线上有两个设备,地址为0x40和0x50。
第一步,打开总线/dev/i2c-x,此处x代表总线号,如第一根i2c总线就是i2c-0,第二根i2c总线就是i2c-1,依此类推。
  int file;
  int adapter_nr = 2; /* probably dynamically determined */
  char filename[20];
  
  sprintf(filename,"/dev/i2c-%d",adapter_nr);
  if ((file = open(filename,O_RDWR)) < 0) {
    /* ERROR HANDLING; you can check errno to see what went wrong */
    exit(1);
  }

第二步,对I2C总线(第一步打开的总线)进行一些ioctl操作,如
I2C_TENBIT是说明I2C总线(第一步打开的总线)上的待访问设备的地址是7bits地址还是10bits地址

第三步,指定I2C总线(第一步打开的总线)上的待访问设备的地址
  int addr = 0x40; /* The I2C address */
  if (ioctl(file,I2C_SLAVE,addr) < 0) {
    /* ERROR HANDLING; you can check errno to see what went wrong */
    exit(1);
  }

第四步,对I2C总线(第一步打开的总线)进行read/write操作,也可以通过i2c-core.c中提供的API进行读写操作。如
  __u8 register = 0x10; /* Device register to access */
  __s32 res;
  char buf[10];
  /* Using SMBus commands */
  res = i2c_smbus_read_word_data(file,register);
  if (res < 0) {
    /* ERROR HANDLING: i2c transaction failed */
  } else {
    /* res contains the read word */
  }
  /* Using I2C Write, equivalent of
           i2c_smbus_write_word_data(file,register,0x6543) */
  buf[0] = register;
  buf[1] = 0x43;
  buf[2] = 0x65;
  if ( write(file,buf,3) != 3) {
    /* ERROR HANDLING: i2c transaction failed */
  }

第五步,关闭I2C总线(第一步打开的总线)
close(file);



另外,值得一提的是,
i2c-client的驱动放在drivers/i2c/chips,就是某个具体i2c设备的驱动
底层i2c总线的驱动放在drivers/i2c/busses,就是跟CPU相关的i2c接口
drivers/i2c/algos放着i2c上的算法,什么算法,就是如何实现i2c总线上的时序,当然,如果drivers/i2c/busses的CPU相关代码有实现的话就不会用这一部分
i2c-core.c更重要的实现管理和提供一些API接口
i2c-dev.c实现的就是总线访问接口

评分

参与人数 1可用积分 +15 收起 理由
yidou + 15 good

查看全部评分

论坛徽章:
5
8 [报告]
发表于 2009-03-29 14:39 |只看该作者

回复 #7 liuyibing 的帖子

楼上说得很详细,赞

论坛徽章:
0
9 [报告]
发表于 2009-03-31 12:17 |只看该作者
多谢yidou版主
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP