免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chengdot
打印 上一主题 下一主题

[驱动] EEPROM AT24C02 的 I2C 驱动问题 [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
11 [报告]
发表于 2011-02-22 10:06 |只看该作者
就是Cannot get bus,你的dmesg已经给出信息了,不是么?

论坛徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
12 [报告]
发表于 2011-02-22 10:08 |只看该作者
at24_probe() 却未被执行。


这个没执行是不是device没有添加?
板子的描述文件里面添加了at24的device了么?

搜了下内核、mini2440里面就有用到相同的at24、楼主对比下和他的初始化是否有所不同:

  1. /*
  2. * I2C devices
  3. */
  4. static struct at24_platform_data at24c08 = {
  5.         .byte_len       = SZ_8K / 8,
  6.         .page_size      = 16,
  7. };

  8. static struct i2c_board_info mini2440_i2c_devs[] __initdata = {
  9.         {
  10.                 I2C_BOARD_INFO("24c08", 0x50),
  11.                 .platform_data = &at24c08,
  12.         },
  13. };

  14. init_machine里面:
  15.         s3c_i2c0_set_platdata(NULL);

  16.         i2c_register_board_info(0, mini2440_i2c_devs,
  17.                                 ARRAY_SIZE(mini2440_i2c_devs));
复制代码

论坛徽章:
0
13 [报告]
发表于 2011-02-22 16:46 |只看该作者
这个没执行是不是device没有添加?
板子的描述文件里面添加了at24的device了么?

搜了下内核、mini ...
l2y3n2 发表于 2011-02-22 10:08



非常感谢,如你所讲,我加了如下代码可以执行 probe() 了:

  1. static struct at24_platform_data at24c02 = {
  2.         .byte_len        = SZ_1K * 2 / 8,
  3.         .page_size        = 8,
  4. };

  5. static struct i2c_board_info __initdata my_i2c_board_info[] = {
  6.         {
  7.                 I2C_BOARD_INFO("24c02", 0x50),
  8.                 .platform_data        = &at24c02,
  9.         },
  10. };

  11. static void __init uc2440_machine_init(void)
  12. {
  13. printk("%s(%d)::%s()\r\n", __FILE__, __LINE__, __FUNCTION__);
  14.         s3c24xx_fb_set_platdata(&uc2440_fb_info);
  15.         s3c_i2c0_set_platdata(NULL);

  16.         platform_add_devices(uc2440_devices, ARRAY_SIZE(uc2440_devices));
  17.         i2c_register_board_info(0, dot_i2c_board_info, ARRAY_SIZE(my_i2c_board_info));        //        add here
  18.         uc_machine_init();
  19.         s3c2410_gpio_setpin(S3C2410_GPG9, 0);
  20.         s3c2410_gpio_cfgpin(S3C2410_GPG9, S3C2410_GPIO_OUTPUT);
  21.         s3c24xx_udc_set_platdata(&uc_udc_cfg);
  22. }
复制代码
但是:
1. at24.c 中的其他几组 write/read 函数又没有被运行
2. i2c-dev.c 中的 i2cdev_write() 函数的调用流程:
   i2c_master_send() -> i2c_transfer() -> adap->algo->master_xfer()
    到 adap->algo->master_xfer 处又没办法跟踪了,它返回 EREMOTEIO;
3. 另外,如果加了前面所述代码,再 insmod at24.ko 的话,
  应用层中 ioctl(I2C_SLAVE, 0x50) 时会提示 EBUSY,原因是 0x50 这个地址的设备已经存在,
  我的理解是启用了 I2C 驱动后,at24.c 根本不需要,这个理解对吗?

对 i2c 的整个体系和工作流程还不清楚,哪位大哥指点一下?万分感谢!

论坛徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
14 [报告]
发表于 2011-02-23 12:32 |只看该作者
回复 13# chengdot


    probe能够正常执行的话应该添加设备就成功了。

至于write/read应该是你做了对应操作才会调用到驱动里面的write/read函数吧。

这个帖子里面说的好像和你的差不多,可以看下你的/sys目录下面是不是有对应文件
/sys/bus/i2c/devices/3-0050/eeprom或者类似的,有的话直接读取/写入就可以对应到驱动里面的read/write了

原帖地址:
http://www.linuxquestions.org/qu ... ress-e2prom-824197/

论坛徽章:
0
15 [报告]
发表于 2011-02-23 15:13 |只看该作者
回复  chengdot


    probe能够正常执行的话应该添加设备就成功了。

至于write/read应该是你做了对 ...
l2y3n2 发表于 2011-02-23 12:32



又看了一些资料,应该可以确定:如果不考虑具体 i2c 设备的特殊性,的确是不需要 at24.c,s3c24xx_i2c_xfer() 是 linux 内置的通用数据发送程序;

安装 at24.ko 后,你说的 /sys/bus/i2c/devices/0-0050/eeprom 是存在的,cat / echo 用来读写最终也会调用上述函数;

但最后跟踪到 s3c24xx_i2c_xfer() -> ... -> iicstat = readl(i2c->regs + S3C2410_IICSTAT), iicstat 总是返回 0xf1,
这就是 "cant get bus (error -110)" 的根源;
这一个错误看上去这跟具体的 at24c02 设备没啥关系,好像是总线一直在忙?

硬件有问题?但在 bootloader 里读写是正常的,请问这是怎么回事?
(两个上拉电阻目前用的是 4.7K)
要用示波器来看的话,如果操作才能看出总线上的异常?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
16 [报告]
发表于 2011-02-23 15:21 |只看该作者
又看了一些资料,应该可以确定:如果不考虑具体 i2c 设备的特殊性,的确是不需要 at24.c,s3c24xx_i2 ...
chengdot 发表于 2011-02-23 15:13



    不见得是硬件的问题

    供电有的时候不是硬件没给电,而是控制器没有给它设置
bootloader设置了,所以他没问题,bootloader到Linux kernel就相当于系统切换了,到了linux里面,设备有没有被重新初始化就两说了

论坛徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
17 [报告]
发表于 2011-02-23 16:09 |只看该作者
又看了一些资料,应该可以确定:如果不考虑具体 i2c 设备的特殊性,的确是不需要 at24.c,s3c24xx_i2 ...
chengdot 发表于 2011-02-23 15:13



这个就不清楚了……看下datasheet里面i2c控制器的这个寄存器是做什么用的吧。
一般内核里面的i2c总线驱动应该不会有问题才对。

论坛徽章:
0
18 [报告]
发表于 2011-02-23 17:48 |只看该作者
to T-Bagwell:
启动后,我把 IIC 相关寄存器的值打印出来,和 Bootloader 的相同了,但结果还是一样,郁闷。

to l2y3n2:
我准备测试一下硬件;难道是我 RP 不好?

另外,我发现另一个奇怪的现象:
iicstat = readl(i2c->regs + S3C2410_IICSTAT)
这一句在系统启动后,第一次得到的状态竟然并非 S3C2410_IICSTAT_BUSBUSY,
但之后所有的读状态,返回均为 BUSBUSY;

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
19 [报告]
发表于 2011-02-23 17:57 |只看该作者
to T-Bagwell:
启动后,我把 IIC 相关寄存器的值打印出来,和 Bootloader 的相同了,但结果还是一样,郁闷 ...
chengdot 发表于 2011-02-23 17:48



    1. 用示波器量一下关键的pin脚
    2. 打印I2C操作失败的话会有xfer -5一类的值比如(Error during data xfer (-5))
   


像你说的那种现象,只能看看是不是有别人也在用那个寄存器了

论坛徽章:
0
20 [报告]
发表于 2011-03-01 16:34 |只看该作者
你的2410的I2C寄存器的寄存器设置对吗,
启动了I2C模块了没有,
还有就是bootloader的时候的I2C的频率和linux内核启动之后的I2C模块的工作频率,可能不一样。
还有一种可能就是你的I2C的读写地址不对,试试0x51
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP