15543|10

222

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

linux下找不到I2C某设备的设备节点 [复制链接]

本帖最后由 lzwml 于 2015-12-9 15:41 编辑

问题1:I2C设备驱动的设备节点在哪?
内核编译I2C总线驱动,能看到/dev/i2c-0设备节点

加载at24.ko能设备驱动,却找不到at24的设备节点,只有几个设备相关的目录
[root@embedsky nfs]# find / -name "at24"
/sys/bus/i2c/drivers/at24
/sys/module/at24
问题2:AT24的地址怎么变成0x50了?
数据手册里AT24C02/04/08,他们的地址都是0xA0,而我看网上的例子都是用0x50地址,用扫描工具看到确实有个0x50地址的设备
[root@EmbedSky nfs]# i2cdetect -y -r 0      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
内核里linux-2.6.30.4/drivers/misc/eeprom/at24.c有相关介绍。这个50是什么貌似是内核专门为eeprom而分配的。那么问题来了,以后我自己写一个内核没有的I2C设备驱动,我怎么知道该设备的地址变成多少?
/*  * However, misconfiguration can lose data. "Set 16-bit memory address"
* to a part with 8-bit addressing will overwrite data. Writing with too
* big a page size also loses data. And it's not safe to assume that the
* conventional addresses 0x50..0x57 only hold eeproms; a PCF8563 RTC
* uses 0x51, for just one example.
*/

问题3:测试程序并没有调用到设备驱动,而是依靠总线驱动操作设备,而我想通过设备驱动实现(因为设备驱动抽象,不用自己去计算地址什么的)!
最终我成功操作at24c02芯片,但是使用的不是设备驱动(at24.ko),而是总线驱动那个设备节点(网上找不到操作设备驱动的例子,所以在这里跪求。也就是说:即使没有写设备驱动,应用层也可以通过总线驱动的设备节点来操作设备,而系统调用仅是一个ioctrl。但该调用方法很不灵活

  1. // 写入的结构体
  2. struct i2c_at24_w
  3. {
  4.     unsigned char addr;
  5.     unsigned char wdata[8];
  6. };
  7. // 读出的结构体
  8. struct i2c_at24_r
  9. {
  10.     unsigned char addr;
  11.     unsigned char rdata[128];
  12. };
  13. int main()
  14. {

  15.     int fd =open("/dev/i2c-0", O_RDWR);
  16.     if (fd< 0) {
  17.            printf("open /dev/i2c-0 failed\n");
  18.            goto exit;
  19.     }

  20.     struct i2c_msg  msg;
  21.     struct i2c_at24_r rd = {0};
  22.     struct i2c_at24_w wd = {0};


  23.     struct i2c_rdwr_ioctl_data ioctl_data;
  24.     struct i2c_msg msgs;

  25.     // 要写入的消息
  26.     ioctl_data.nmsgs= 1;
  27.     ioctl_data.msgs= &msgs;

  28.     // 0地址写入8Byte 0x33,AT24C02一次最多能写入8byte
  29.     for (int i = 0; i < 8;i++) {
  30.         wd.wdata[i] = 0x33;
  31.     }

  32.     wd.addr    = 0x00;
  33.     msgs.addr  = 0x50;
  34.     msgs.flags = 0;
  35.     msgs.len   = sizeof(struct i2c_at24_w);
  36.     msgs.buf   = (unsigned char*)&wd;
  37.     printf("ioctl write addr 0, return :%d\n", ioctl(fd, I2C_RDWR, &ioctl_data));
  38. ioctl_data.nmsgs= 1;
  39.     ioctl_data.msgs= &msgs;

  40.     // 写入要读的地址
  41.     msgs.addr  = 0x50;
  42.     msgs.flags = 0;
  43.     msgs.len   = sizeof(rd.addr);
  44.     msgs.buf   = (unsigned char*)&rd.addr;
  45.     printf("ioctl write address, return :%d\n", ioctl(fd, I2C_RDWR, &ioctl_data));

  46.     // 连续读取128byte
  47.     msgs.addr   = 0x50;
  48.     msgs.flags |= I2C_M_RD;
  49.     msgs.len    = sizeof(rd.rdata);
  50.     msgs.buf    = (unsigned char*)&rd.rdata[0];
  51.     printf("ioctl read, return :%d\n", ioctl(fd, I2C_RDWR, &ioctl_data));

  52.     close(fd);
  53. }
复制代码




最新回复

请问问题一解决了吗?出现了同样的问题。  详情 回复 发表于 2016-6-28 15:32
点赞 关注

回复
举报

7219

帖子

192

TA的资源

五彩晶圆(高级)

沙发
 
问题2:AT24的地址怎么变成0x50了?

是0x80 可以在手册中看到 A2 A1 A0都接地

至于为什么是0x50 涉及到I2C总线层

发设备地址时,左移了1位发送的

0x50(0x01010000 << 1) 实际设备地址是0xa0 (1010 0000)

点评

哟西,找到了那个宏定义 I2C_BOARD_INFO  详情 回复 发表于 2015-12-9 19:52
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

板凳
 
我也是初学  才疏学浅 问题三没看懂。

点评

第三个我晓得了,我只加载了驱动,没有加载设备所以没有设备节点 现在正在查资料证明添加I2C设备  详情 回复 发表于 2015-12-9 19:56
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

4
 
常见泽1 发表于 2015-12-9 19:00
问题2:AT24的地址怎么变成0x50了?

是0x80 可以在手册中看到 A2 A1 A0都接地

至于为什么是0x50 涉及 ...

哟西,找到了那个宏定义
I2C_BOARD_INFO
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

5
 
常见泽1 发表于 2015-12-9 19:02
我也是初学  才疏学浅 问题三没看懂。

第三个我晓得了,我只加载了驱动,没有加载设备所以没有设备节点
现在正在查资料证明添加I2C设备
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

6
 
你这个是mini2440的板子么  对于I2C的mini2440程序很不明白 还请赐教

点评

TQ2440  详情 回复 发表于 2015-12-15 16:50
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(高级)

7
 
路过,看看
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

8
 
本帖最后由 lzwml 于 2015-12-15 17:03 编辑
常见泽1 发表于 2015-12-11 11:19
你这个是mini2440的板子么  对于I2C的mini2440程序很不明白 还请赐教

TQ2440
----------------------------------------------------------
以总线驱动at24c
[root@EmbedSky nfs]# ./test-at24.elf
ioctl write addr 0, return :1
ioctl write addr 1, return :1
ioctl write addr 2, return :1
ioctl write address, return :1
ioctl read, return :1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 33 33 33 33 33 33 33 33 09 09 09 09 09 09 09 00
10: 04 04 04 04 04 04 04 04 18 19 1a 1b 1c 1d 1e 1f
20: fc fc fc fc fc fc fc fc 28 29 2a 2b 2c 2d 2e 2f
30: 40 40 40 40 40 40 40 40 50 50 50 3b 50 50 50 50
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 6b 34 37 63 64 65 62 61 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f

open CHIP failed   <---- 没有加载设备,所以失败


----------------------------------------------------------
加载设备
[root@EmbedSky nfs]# insmod client.ko
get adapter : s3c2410-i2c

加载驱动
[root@EmbedSky nfs]# insmod at24.ko
at24_probe():432
at24 0-0050: 1024 byte at24 EEPROM (writable)
at24 0-0050: page_size 16, num_addresses 4, write_max 16
---------------------------------------------------------
以总线驱动和设备驱动方式读写at24c
[root@EmbedSky nfs]# ./test-at24.elf
ioctl write addr 0, return :1
ioctl write addr 1, return :1
ioctl write addr 2, return :1
ioctl write address, return :1
ioctl read, return :1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 33 33 33 33 33 33 33 33 09 09 09 09 09 09 09 00
10: 04 04 04 04 04 04 04 04 18 19 1a 1b 1c 1d 1e 1f
20: fc fc fc fc fc fc fc fc 28 29 2a 2b 2c 2d 2e 2f
30: 40 40 40 40 40 40 40 40 50 50 50 3b 50 50 50 50
40: 40 41 42 43 44 45 44 26 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 6b 34 37 63 64 65 62 61 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f




     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 33 33 33 33 09 09 09 09 09 09 09 00 04 04 04 04
10: 04 04 04 04 18 19 1a 1b 1c 1d 1e 1f fc fc fc fc
20: fc fc fc fc 28 29 2a 2b 2c 2d 2e 2f 40 40 40 40
30: 40 40 40 40 50 50 50 3b 50 50 50 50 40 41 42 43
40: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53
50: 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 6b 34 37 63
60: 64 65 62 61 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73
70: 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f 80 81 82 83


 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

9
 
本帖最后由 lzwml 于 2015-12-15 17:13 编辑

源码解压后修改script/common.mk关于交叉编译器路径CROSS_COMPILE(arm920t那一项)和src/i2c-client/Makefile关于linux源码目录KERNELDIR

root@fnc:driver-transplant# make DP=pi5
生成测试程序release-arm920t/test-at24.elf

进入src/i2c-client进入加载设备模块编译
root@fnc:i2c-client# make
生成client.ko

配置内核编译at24xx的驱动,我这里是模块
linux-2.6.30.4/drivers/misc/eeprom/at24.ko




driver-transplant.rar

45.86 KB, 下载次数: 22

售价: 2 分芯积分  [记录]

2440驱动移植训练

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
请问问题一解决了吗?出现了同样的问题。

点评

加载驱动后还要加载设备 附件里面有  详情 回复 发表于 2016-6-29 08:39
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

11
 
bamboolobers 发表于 2016-6-28 15:32
请问问题一解决了吗?出现了同样的问题。

加载驱动后还要加载设备
附件里面有
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表