- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- cisco交换机端口镜像.ppt
- Cinderella AAA1.ppt
- Class 12 K2 Writing -- May 16 -- to send.ppt
- Clustering in Microarray Data-mining and Challenges Beyond.ppt
- Cognitive Task Analysis for Teams.ppt
- Colors Reading(I)gayle.ppt
- Communication.Fundamentals.ppt
- Confirm Recycle capillary stable to produce evaluation.ppt
- Conclusion of Rhetorical Devices.ppt
- Coolcolor-3042系列机器操作说明书.doc
- Longman welcome to English 1A chapter 5 A复习.ppt
- M1 U1 It smells delicious.ppt
- M10U2_this_morning_we_took_a_walk_.ppt
- M1U42012-grammar.ppt
- M3-U8-L3 做课课件 薛春燕.ppt
- M9 Unit4 behind beliefs-project.ppt
- management accounting exam review.ppt
- Managing People for Service Advantage.ppt
- Mankiw Economics Chap_03 中山大学吴柏林教授“曼昆·经济学原理”绝密资料.ppt
- Mankiw经济学原理课件英文Chap03.ppt
文档评论(0)