LINUX下I2C框架.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LINUX下I2C框架

基于2440板子,linux内核下的I2C,操作E2PROM 分析篇: AT24C02 LINUX I2C架构分析: 简化: 设备驱动层:提供策略(我们90%的任务)。(E2PROM驱动 /触摸屏驱动 /传感器驱动) 总线驱动层:提供一个硬件操作能力。I2C控制驱动(总线驱动)在芯片(S3C2410)生产出来的时候生产厂商就已经写好了,且永远不变(1类芯片对应1种控制器驱动,控制器驱动就是去操作各种寄存器的值,实现标准I2C时序) I2C核心层:的作用在这就体现出来了,得用它来承上启下,连接设备驱动和总线驱动。 open 最主要就是第5步(前面绕来绕去的不用管),1,打开open时,将获取到的adap (2440就一个)放到临时变量client结构中;2,将client挂到到file-private_data中。供以后读写使用。这样适配器adap就和file建立了某种联系。第二步的三个结构体都是临时变量。 I2c_transfer() :只负责将Msg 给 adap。这个函数非常通用。不管读写,最终都会调用 使用篇: 每一个read, write 都会构建一个msg结构体(已包含从器件地址)并自动地先发送从器件地址,再发送后面的段内地址和数据。 注意:赋值的地址应该右移1位因为底层处理的时候,会将传下去的数据左移1位取其最低7位。所以实际器件地址是0xa0 (1010 0000),应用程序中应该是0x50 (0101 0000), 当从控制I2C到另一个器件时,需要改的是从机地址(当然,也有片内地址) 当增加适配器时,还需注意器件时挂在哪个适配器上。 去掉此项为去掉通用接口,需自己写I2C驱动. 此项为控制器驱动. 附件 /*利用通用驱动程序,在应用层使用 I2C*/ #includesys/stat.h #includesys/types.h #includefcntl.h #includelinux/i2c-dev.h #includesys/ioctl.h #define I2C_SLAVE 0X0703 int main (int argc,char **argv) { //1,open device file int fd; int adapter_nr = 0; /* probably dynamically determined */ char filename[20]; char buf[10]; char rbuf[10]; unsigned char addr_data = 0x00; snprintf(filename, 19, /dev/i2c-%d, adapter_nr); fd = open(filename, O_RDWR); if (file 0) { printf(open device file fail!\n); return -1; } //2,set slave addr int addr = 0x50; /* The I2C address ,0xa0 wrong, should be 0x50*/ ioctl(fd, I2C_SLAVE, addr); //3,send slave addr, register_addr(addr_data) and data buf[0] = addr_data; buf[1] = 0x92; //data write(fd, buf, 2); /*the write cmd will build a struct msg which contain the slave_addr, and send slave_addr first.*/ //4,read [addr] //4.1 send register addr write(fd,addr_data,1); //4.2 read data read(fd,rbuf,1); printf(rbuf[0] = 0x%x\n,rbuf[0]); } E2PROM驱动:(有误,可以参考大概思路) /* *参照i2c-dev.c通用接口驱动,ds1682.c */ /* *参照i2c-dev.c通用接口驱动,ds1682.c */ #includelinux/module.h #includelinux/init.h #includelinux/fs.h #includelinux/i2c.h #inclu

文档评论(0)

l215322 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档