Linux驱动学习笔记----------IIC框架与流程(一)

历时一个月期末课程设计终于结束了!发现好多东西忘记了,iic流程也有些淡忘,有点慌,夜深人静的时候就整理下吧!还有,杭州最近热的我脑袋都不好用了!

关于iic
1.是一种数据传输协议(spi,usb,sdio,uart…)
2.速度比较:iic < spi < sdio < 网络 < usb
3.它是一种半双工通信方式(两根总线:scl,sda),每个设备有唯一的设备地址
4.一次传输8bit,高位在前,低位在后;总线空闲状态:数据sda拉为高电平。

这里写图片描述

首先从iic的时序开始(基于EEPROM AT24C08):
往AT24C08写数据:
Linux驱动学习笔记----------IIC框架与流程(一)_第1张图片
根据EEPROM datasheet我们可以知道写数据有好多方式,我们这里选择的是按字节写。

往AT24C08读数据:

Linux驱动学习笔记----------IIC框架与流程(一)_第2张图片
我们选择的是随机读取模式(效率高)
查看手册:
Linux驱动学习笔记----------IIC框架与流程(一)_第3张图片

其中I2CDSn 可以用来数据传输
Linux驱动学习笔记----------IIC框架与流程(一)_第4张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第5张图片

相关寄存器的设置:
Linux驱动学习笔记----------IIC框架与流程(一)_第6张图片

理解这个图,了解整个机制
Linux驱动学习笔记----------IIC框架与流程(一)_第7张图片

i2c设备驱动层组件(i2c-dev.c)给用户提供调用接口,众所周知,用户实现策略,驱动实现的是机制。
i2c核心层起到承上启下的作用
Linux驱动学习笔记----------IIC框架与流程(一)_第8张图片

IIC子系统开发之核心层分析 i2c-core.c(注册流程以及一些重要的结构体):

Linux驱动学习笔记----------IIC框架与流程(一)_第9张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第10张图片

这里写图片描述

核心层,注册了i2c总线,以及驱动注册
Linux驱动学习笔记----------IIC框架与流程(一)_第11张图片

i2c-dev.c中重要的结构体
和宋宝华的书一样,这里也介绍了i2c.h中的重要结构体: i2c_driver,i2c_client,i2c_adapter
i2c_algorithm,i2c_msg,i2c_board_info。
Linux驱动学习笔记----------IIC框架与流程(一)_第12张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第13张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第14张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第15张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第16张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第17张图片

IIC子系统开发之设备驱动层分析(设备驱动层做的是/dev/i2c-x,应用层操作的接口)(跟着源码看看):
这里的相关操作函数,就是在供给应用传调用的!
在open函数中保存了设备是属于哪个适配器的信息(client->adapter = adap;/*指 定 设 备 属 于 那 个 适 配 器
file->private_data = client;/保 存 数 据 ,供 后 面 的 操 作 函 数 使 用 /)
Linux驱动学习笔记----------IIC框架与流程(一)_第18张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第19张图片

下面  创建了设备文件,这样就在/dev中创建了节点

Linux驱动学习笔记----------IIC框架与流程(一)_第20张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第21张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第22张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第23张图片

简要说明:
一些函数在接口的操作函数中使用
这里写图片描述

================================================================================
================================================================================

IIC应用程序的开发:

开始写程序前,内核要先配置下。根据我们分的层次知道,应该有三个地方需要配置。
三层,所以需要配置三个。
1.先到Makefile查看是否选上了文件
2.menuconfig中,依照Makefile 中的宏,进行配置。
Linux驱动学习笔记----------IIC框架与流程(一)_第24张图片

IIC设备驱动之系统流程分析:

/************* open*************************/
这里的相关操作函数,就是在供给应用传调用的!
在open函数中保存了设备是属于哪个适配器的信息(client->adapter = adap;/*指 定 设 备 属 于 那 个 适 配 器
file->private_data = client;/保 存 数 据 ,供 后 面 的 操 作 函 数 使 用 /)
所以说,open实际上做的就是一个绑定的工作,获取 设备, 通过设备获取 适配器, 然后分配空间 ,最后 将适配器绑定在这个设备上!已供后用!
Linux驱动学习笔记----------IIC框架与流程(一)_第25张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第26张图片

/************* ioctl ***************/

Linux驱动学习笔记----------IIC框架与流程(一)_第27张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第28张图片
指定设备地址。
Linux驱动学习笔记----------IIC框架与流程(一)_第29张图片
ioctl 实际上完成的就是指定 设备的地址.

/******************write********************/
Linux驱动学习笔记----------IIC框架与流程(一)_第30张图片

这里写图片描述

Linux驱动学习笔记----------IIC框架与流程(一)_第31张图片

目前为止,还是在设备驱动层的,
通过i2c_master_send(client,tmp,count);
就跳到 —-核心层— i2c-core.c !
Linux驱动学习笔记----------IIC框架与流程(一)_第32张图片

msg : 数据包
开始构建数据包,addr就是我们传进来的地址 0x50
Linux驱动学习笔记----------IIC框架与流程(一)_第33张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第34张图片

Linux驱动学习笔记----------IIC框架与流程(一)_第35张图片

通过i2c_transfer发送i2c数据包,从而通过调用函数调用i2c总线驱动

Linux驱动学习笔记----------IIC框架与流程(一)_第36张图片

这里写图片描述

Linux驱动学习笔记----------IIC框架与流程(一)_第37张图片

至此,我们已经成功把数据传到总线层,接下来就是要到资源层和我们的设备进行匹配了! 匹配过程有板卡信息的匹配以及platform_device的匹配两种方式。 具体匹配过程留到(二)再来。

你可能感兴趣的:(linux驱动)