- 1、本文档共31页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
i2c_ioctl概要1
PowerPC + Linux2.6.25平台下的I2C驱动架构分析
Sailor_forever? sailing_9806#163.com?
(本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途。任何个人、媒体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。如 有任何问题,请留言或者发邮件给sailing_9806#163.com)/sailor_8318/archive/2010/09/25/5905988.aspx?
【摘要】本文以PowerPC+Linux 2.6.25 平台为例,详细分析了I2C总线的驱动架构。首先介绍了I2C的总体架构,从用户的角度将其分为三个层面,不同的开发者只需要关注相应的层面即可。然后分析了主要数据结构及其之间的相互关系,接着分析了不同层的具体实现,最后以一款EEPEOM为例讲述了如何在用户空间访问I2C驱动。对于ARM + Linux平台,只有平台依赖层即总线适配器驱动有差异。【关键字】PowerPC, I2C, i2c-core, adapter , i2c_algorithm, RTC, EEPROM
PowerPC + Linux2.6.25平台下的I2C驱动架构分析 1
?????? ???? ?
一、I2C概述I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL。I2C是一种多主机控制总线,同一总线上可允许多个master,即总线上的设备都有主动发起数据传输的可能,依靠线与逻辑来实现无损仲裁。但通常情况是总线上有个带CPU的master,其他设备被master访问。I2C总体架构在2.6的Linux内核中,I2C的驱动架构分为如下三个层次:硬件抽象层、平台依赖层和用户接口层。2.1??? 硬件抽象层i2c-core.h和i2c-core.c为其主体框架代码,提供了核心数据结构的定义、i2c适配器驱动和设备驱动的注册、注销管理等API。其为硬件平台无关层,向下屏蔽了物理总线适配器的差异,定义了统一的访问策略和接口;其向上提供了统一的接口,以便I2C设备驱动通过总线适配器进行数据收发。2.2??? 平台依赖层i2c总线适配器(adapter)就是一条i2c总线的控制器(所谓控制是相对于本CPU来说的),在物理上连接若干i2c设备。在Linux驱动中,每种处理器平台有自己的适配器驱动,属于平台移植相关层。每一个特定的硬件平台在i2c/busses/目录下都有一个adapter的实现,对于PowerPC平台来说,其是i2c-mpc.c。其按照核心层定义的接口实现了i2c_adapter,提供了具体的访问方式i2c_algorithm。2.3??? 用户接口层设备驱动层为用户接口层,其为用户提供了通过I2C总线访问具体设备的接口。3??? 主要的数据结构3.1??? AdapterAdapter是对某一条I2C总线的抽象,是特定总线的相关属性的集合。http://lxr.linux.no/#linux+v2.6.25/include/linux/i2c.h#L312 312struct i2c_adapter {?313??????? struct module *owner;?314??????? unsigned int id;?315??????? unsigned int class;?316??????? const struct i2c_algorithm *algo; /* the algorithm to access the bus */?317??????? void *algo_data;?318?319??????? /* administration stuff. */?320??????? int (*client_register)(struct i2c_client *);?321??????? int (*client_unregister)(struct i2c_client *);?322?323??????? /* data fields that are valid for all devices?? */?324??????? u8 level;?????????????????????? /* nesting level for lockdep */?325??????? struct mutex bus_lock;? //?326??????? struct mutex clist_lock;?327?328??????? int timeout;?329??????? int
文档评论(0)