没有合适的资源?快使用搜索试试~ 我知道了~
里面详细描述了i2c源代码情景分析中遇到的问题
资源详情
资源评论
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/6697301/bg1.jpg)
目录
声明
你可以自由地随意修改本文档的任何文字内容及图表,但是如果你在自己的文档中以任何形式直接引用
了本文档的任何原有文字或图表并希望发布你的文档,那么你也得保证让所有得到你的文档的人同时享
有你曾经享有过的权利。
i2c 源代码情景分析(Beta2)
作者在 www.linuxforum.net
上的 ID 为 shrek2
欢迎补充,欢迎批评指正!
第 1 章 i2c 核心数据结构之间的关系.......................................................3
第 2 章 i2c-core.c 的初始化......................................................................10
i2c_init 函数........................................................................................................................................................10
i2cproc_init 函数................................................................................................................................................11
第 3 章 安装、卸载 pxa255 的 i2c 适配器驱动程序...............................13
pxa_i2c 数据结构...............................................................................................................................................13
i2c_adap_pxa_init 函数......................................................................................................................................15
i2c_add_adapter 函数.........................................................................................................................................16
i2c_del_adapter 函数..........................................................................................................................................18
i2c_adap_pxa_exit 函数.....................................................................................................................................20
第 4 章 安装、卸载 ltc3445 驱动程序......................................................22
ltc3445_init 函数................................................................................................................................................22
i2c_add_driver 函数...........................................................................................................................................23
i2c_probe 函数....................................................................................................................................................24
i2c_check_functionality 函数.............................................................................................................................27
i2c_smbus_xfer 函数..........................................................................................................................................28
i2c_transfer 函数.................................................................................................................................................30
ltc3445_detect_client 函数.................................................................................................................................31
i2c_attach_client 函数........................................................................................................................................33
ltc3445_cleanup 函数.........................................................................................................................................34
i2c_del_driver 函数............................................................................................................................................34
1
![](https://csdnimg.cn/release/download_crawler_static/6697301/bg2.jpg)
目录
ltc3445_detach_client 函数................................................................................................................................36
i2c_detach_client 函数.......................................................................................................................................37
第 5 章 与 pxa255 的 i2c 适配器相关的代码...........................................39
i2c_pxa_reset 函数.............................................................................................................................................39
i2c_pxa_abort 函数.............................................................................................................................................40
i2c_pxa_xfer 函数...............................................................................................................................................40
i2c_pxa_do_xfer 函数........................................................................................................................................42
i2c_pxa_start_message 函数..............................................................................................................................43
i2c_pxa_handler 函数.........................................................................................................................................44
i2c_pxa_irq_txempty 函数.................................................................................................................................45
i2c_pxa_irq_rxfull 函数......................................................................................................................................49
第 6 章 i2c-dev 的初始化..........................................................................51
i2c_dev_init 函数................................................................................................................................................51
i2cdev_attach_adapter 函数................................................................................................................................52
第 7 章 i2c 框架提供的设备访问方法.....................................................54
i2cdev_open 函数...............................................................................................................................................54
i2cdev_ioctl 函数................................................................................................................................................55
i2cdev_read 函数................................................................................................................................................56
i2c_master_recv 函数.........................................................................................................................................57
对 i2cdev_read 和 i2c_master_recv 的修改.......................................................................................................58
i2cdev_release 函数............................................................................................................................................61
第 8 章 编写 i2c 设备驱动程序模块的方法.............................................63
第 9 章 用户进程访问 i2c 设备的步骤.....................................................66
讨论和总结................................................................................................67
i2c 操作中的同步问题.......................................................................................................................................67
总结各个模块初始化函数的作用....................................................................................................................67
对 i2c 框架代码的修改......................................................................................................................................68
有关 i2c 设备私有数据结构的讨论..................................................................................................................70
遗留的问题.........................................................................................................................................................70
(注意:本文档中的源代码以 i2c-2.9.1 包及 www.arm.linux.org.uk
上下载的 pxa 的 i2c 适配器的补丁 2360-2
为准!)
2
![](https://csdnimg.cn/release/download_crawler_static/6697301/bg3.jpg)
第 1 章 i2c 核心数据结构之间的关系
第 1 章 i2c 核心数据结构之间的关系
i2c 总线适配器(adapter)就是一条 i2c 总线的控制器,在物理连接上若干 i2c 设备并联于该 i2c 总线的
SCL 和 SDA 线上,如下图所示:
那么相应软件数据结构的设计、数据结构之间的关系就至少应该描述硬件物理连接的这种组织关系。
Linux 的 i2c 框架中各个部分的关系如下图所示:
SDA
pxa255 I2C
LTC3445 other device
SCL
3
![](https://csdnimg.cn/release/download_crawler_static/6697301/bg4.jpg)
第 1 章 i2c 核心数据结构之间的关系
内核中 i2c 相关代码可以分为三个层次:
1. i2c 框架:i2c.h 和 i2c-core.c 为 i2c 框架的主体,提供了核心数据结构的定义、i2c 适配器驱动和设备
驱动的注册、注销管理,i2c 通信方法上层的、与具体适配器无关的代码、检测设备地址的上层代码
等;i2c-dev.c 用于创建 i2c 适配器的/dev/i2c/%d 设备节点,提供 i2c 设备访问方法等。
2. i2c 总线适配器驱动:定义描述具体 i2c 总线适配器的 i2c_adapter 数据结构、实现在具体 i2c 适配器上
的 i2c 总线通信方法,并由 i2c_algorithm 数据结构进行描述。
3. i2c 设备驱动:定义描述具体设备的 i2c_client 和可能的私有数据结构、借助 i2c 框架的 i2c_probe 函数
实现注册设备的 attach_adapter 方法、提供设备可能使用的地址范围、以及设备地址检测成功后创建
i2c_client 数据结构的回调函数。
下面介绍 i2c 各核心数据结构的定义和它们之间的连接关系。
1. 一个 i2c 设备的驱动程序由 i2c_driver 数据结构描述,定义于 include/linux/i2c.h:
struct i2c_driver {
char name[32];
int id;
unsigned int flags;
int (*attach_adapter)(struct i2c_adapter *);
int (*detach_client)(struct i2c_client *);
int (*command)(struct i2c_client *client,unsigned int cmd, void *arg);
void (*inc_use)(struct i2c_client *client);
void (*dec_use)(struct i2c_client *client);
};
其中 name 为最大长度为 32 字节的字符串,id 可选 0xf000 到 0xffff 中的任一数值,flags 域可以直接设置
为 I2C_DF_NOTIFY。attach_adapter 回调函数在安装 i2c 设备驱动程序模块时、或者在安装 i2c 适配器驱
动程序模块时被调用,用于检测、认领设备并为设备分配 i2c_client 数据结构。detach_client 方法在卸载适
配器或设备驱动程序模块时被调用,用于从总线上注销设备、并释放 i2c_client 及相应的私有数据结构。
inc_use 和 dec_use 所指向的函数用于改变 i2c 设备驱动程序模块的引用计数。注意不要直接调用 i2c_driver
数据结构中的这两个方法,而要通过如下函数调用路径:
i2c_use_client > i2c_inc_use_client > inc_use
i2c_release_client > i2c_dec_use_client > dec_use
通过最顶层的 i2c_use/release_client 函数来同时改变 i2c 设备和 i2c 适配器驱动程序模块的引用计数。另外,
不能在 attach_adapter 函数检测到一个 i2c 设备时就增加驱动程序模块的引用计数,而应该在用户进程访问
一个/dev/i2c/%d 设备节点时增加模块的引用计数,则关闭设备节点时减少引用计数(但在当前的应用中,
适配器和设备的驱动程序都是静态地链接入内核映像的,所以在 pxa255 的 i2c 补丁中并没有使用控制引
用计数的函数)。
4
![](https://csdnimg.cn/release/download_crawler_static/6697301/bg5.jpg)
第 1 章 i2c 核心数据结构之间的关系
2. 一个 i2c 设备由 i2c_client 数据结构进行描述:
struct i2c_client {
char name[32];
int id;
unsigned int flags; /* div., see below */
unsigned int addr; /* chip address - NOTE: 7bit addresses are stored in the */
/* _LOWER_ 7 bits of this char */
struct i2c_adapter *adapter; /* the adapter we sit on */
struct i2c_driver *driver; /* and our access routines */
void *data; /* for the clients */
int usage_count; /* How many accesses currently to the client*/
};
在安装适配器或者设备的驱动程序时通过设备驱动程序 i2c_driver 中的 attach_adapter 函数检测设备地址。
如果检测成功则调用设备驱动程序提供的回调函数创建描述设备的 i2c_client 数据结构,并将其中的
driver 指针指向设备驱动程序的 i2c_driver 数据结构。这样将来就可以使用 i2c_driver 中的注销设备和控制
引用计数的方法了。
由下文可见在描述 i2c 适配器的 i2c_adapter 数据结构中设计了指向该总线上所有 i2c 设备的 i2c_client 数据
结构的指针数组 clients,而每个 i2c_client 又通过 adapter 指针回指 i2c_adapter。数据结构之间类似的组织
关系在 Linux 内核中屡见不鲜,比如父子进程的 PCB 之间、父目录及子目录和子文件的 dentry 之间,等
等。
每个 i2c 设备都有唯一的 7 位地址 addr。由于设备可能支持多个地址,所以在设备驱动程序模块中要指出
需要检测的地址范围(由 i2c_client_address_data 二维数组指定),而设备实际使用的地址在检测成功并
为之分配 i2c_client 数据结构时填入。以 i2c 设备 ltc3445 为例,硬件支持的地址为 1001011 或者 0101011,
即 7 位地址的高 2 位由具体的布线方法决定(可以分别接到 VCC 或者 GND)。如果 ltc3445 驱动程序的
开发者知道具体的布线方法,那么在驱动程序中就可以直接指定。否则可以指定地址检测范围为这两个
地址,而在加载驱动程序模块时由软件进行地址检测。
需要说明的是,i2c 设备的 7 位地址是就当前 i2c 总线而言的,是“相对地址”。不同的 i2c 总线上的设备可
以使用相同的 7 位地址,但是它们所在的 i2c 总线不同。所以在系统中一个 i2c 设备的“绝对地址”由二元组
(i2c 适配器的 ID 和设备在该总线上的 7 位地址)表示。
i2c_client 数据结构为描述 i2c 设备的“模板”,而具体的 i2c 设备可能需要描述个性的私有数据。私有数据
结构由 i2c_client 数据结构中的 data 域指向。设备驱动程序开发者可以设计合适的私有数据结构来描述硬
件的特性。值得一提的是,目前在 Linux 内核中常用的表示与具体设备、对象等相关的私有数据结构的方
法有两种,一种就是采用 void 类型的指针 data 来指向具体的私有数据结构,又比如 file 结构中的
private_data 域在设备驱动程序中往往被设置为指向具体的设备数据结构;第二种方法就是采用 union 域,
比如 VFS 的 super_block、inode 数据结构。super_block 和 inode 数据结构本身集中描述了各种文件系统的
共性,而具体文件系统的个性则放到 union 中进行描述,在挂载具体的文件系统时实例化为具体的 union
5
剩余63页未读,继续阅读
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
arvin_fresh
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- .gif动态图制作工具软件,ScreenToGif
- baidusearch_AndroidPhone_13-58-5-10-1_1013790t.apk
- CFA学习资料(2024最新考纲,包含全部十个科目的讲义、思维导图及练习题)
- 绘制爱心(1).zip
- 使用Python计算扑克牌算法
- Matlab实现Transfomer多变量时间序列预测,风电功率预测(完整源码和数据)
- vsftpd-3.0.5及编译脚本(交叉编译)
- Matlab实现Transfomer时间序列预测,风电功率预测(完整源码和数据)
- amap-wx.130.js
- 高分项目,PID-小车类-两轮平衡小车(原理图、PCB、程序源码、BOM等)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0