Android 驱动(二) IIC简单介绍
一、 I2C简单介绍
I2C(Inter-Integrated Circuit)总线是一种由 Philips 公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C 总线最基本的长处就是简单性和有效性,简单体如今接线简单,仅仅有两根线数据线(SCL)和时钟线(SDA),并且 控制简单。所以一些封装较小的器件多使用I2C总线,常见的使用I2C总线的设备有EEPROM、RTC及一些传感器。这里我们介绍下基于linux的I2C设备驱动的编写。
- I2C设备驱动的编写有多种方式
一种是直接操作CPU的I2C控制器,正对于某一个设备写一个字符驱动,这样的驱动相对来说比較直接,不须要太依赖于内核相关配置,可是这类设备驱动依赖CPU,可移植性较差。
一种是基于linux内核I2C子系统完毕设备驱动的编写,一般内核会继承相关CPU的控制器驱动即使没有也能够通过技术支持能够获得,所以我们仅仅须要使用linux下I2C子系统提供的相关接口来构建我们的设备驱动即可了。这样我们的设备驱动并不依赖于某一个特定的CPU,可移植性较好。
- I2C总线工作原理
I2C 总线是由数据线 SDA 和时钟 SCL 构成的串行总线,各种被控制器件均
并联在这条总线上,每一个器件都有一个唯一的地址识别,能够作为总线上的一个
发送器件或接收器件(详细由器件的功能决定)。I2C 总线的接口电路结构如图 1所看到的
- I2C 总线的几种信号状态
1. 空暇状态:SDA 和 SCL 都为高电平。
2. 開始条件(S):SCL 为高电平时,SDA 由高电平向低电平跳变,開始传送数据。
3. 结束条件(P):SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
4. 数据有效:在 SCL 的高电平期间,SDA 保持稳定,数据有效。SDA 的改变仅仅能发生在 SCL 的低电平期间。
5. ACK 信号:传输数据的过程中,接收器件每接收一个字节数据要产生一个 ACK 信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。
- I2C 总线基本操作
I2C 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL),同一时候控制总线的传输方向,并产生開始和停止条件。
传输数据中,首先由主器件产生開始条件,随后是器件的控制字节(前七位是从器件的地址,最后一位为读写位)。接下来是读写操作的数据,以及 ACK响应信号。传输数据结束时,主器件产生停止条件。详细的过程如图 2 所看到的。
- I2C驱动层次结构
- I2C 核心(I2C core)
I2C adapter 中实现),主要应用在 I2C 设备驱动中。
- I2C 控制器驱动(I2C adapter)
- I2C 设备驱动(I2C driver)
89 的字符类型设备。I2C driver 实现用户层对 I2C 设备的訪问,包含 open,read,write,ioctl,release 等常规文件操作,能够通过 open 函数打开 I2C 设备文件,通过 ioctl 函数设定要訪问 I2C 设备的地址,然后就能够通过 read 和 write 函数完毕对 I2C 设备的读写操作。通过 I2C driver 提供的通用方法能够訪问不论什么一个 I2C 的设备,可是当中实 现的 read,write 及 ioctl 等功能全然是基于一般设备的实现,全部的操作数据都是基于字节流,没有明白的格式和意义。为了更方便和有效地使用
I2C 设备,可 以为一个详细的 I2C 设备开发特定的 I2C 设备驱动程序,在驱动中完毕对特定的数据格式的解释以及实现一些专用的功能。
- I2C 驱动源代码结构
- I2C 设备驱动一般结构
的控制器能 够被驱动探測。
- 经常使用数据结构解析
struct module *owner; /* 所属模块 */unsigned int id; /* algorithm 的类型,定义于 i2c-id.h,以 I2C_ALGO_開始 */unsigned int class;const struct i2c_algorithm *algo; /* 总线通信方法结构体指针 */void *algo_data; /* algorithm 数据 */struct rt_mutex bus_lock;int timeout; /* 超时时间,以 jiffies 为单位 */int retries; /* 重试次数 */struct device dev; /* 控制器设备 */int nr;char name[48]; /* 控制器名称 */struct completion dev_released; /* 用于同步 */struct mutex userspace_clients_lock;struct list_head userspace_clients;
/* I2C 传输函数指针 */int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);/* smbus 传输函数指针 */int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 command, int size, union i2c_smbus_data *data);/* 返回控制器支持的功能 */u32 (*functionality) (struct i2c_adapter *);
__u16 addr; /* 从设备地址 */__u16 flags; /* 消息类型 */__u16 len; /* 消息长度 */__u8 *buf; /* 消息数据 */
unsigned short flags; /* 标志 */unsigned short addr; /* 低 7 位的芯片地址 */char name[I2C_NAME_SIZE]; /* 设备名称 */struct i2c_adapter *adapter; /* 依附的 i2c_adapter */struct i2c_driver *driver; /* 依附的 i2c_driver */struct device dev;int irq; /* 设备使用的中断号 */struct list_head detected;
unsigned int class;int (*attach_adapter)(struct i2c_adapter *); /* 依附 i2c_adapter 函数指针 */int (*detach_adapter)(struct i2c_adapter *); /* 脱离 i2c_adapter 函数指针 */int (*probe)(struct i2c_client *, const struct i2c_device_id *);int (*remove)(struct i2c_client *);void (*shutdown)(struct i2c_client *);int (*suspend)(struct i2c_client *, pm_message_t mesg);int (*resume)(struct i2c_client *);void (*alert)(struct i2c_client *, unsigned int data);int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);struct device_driver driver;const struct i2c_device_id *id_table; /* 该驱动所支持的设备 ID 表 */int (*detect)(struct i2c_client *, struct i2c_board_info *); /* 设备探測函数 */const unsigned short *address_list; /* 驱动支持的设备地址 */struct list_head clients; /* 挂接探測到的支持的设备 */
的关系是一对多,一个 i2c_driver 上能够支持多个同等类型的 i2c_client。
Android 驱动(二) IIC简单介绍的更多相关文章
- NDK中android.mk文件的简单介绍和第三方库的调用
先贴一个样例,然后解释一下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mydjvuapi SRC_FILE_ ...
- Android 懒加载简单介绍
1.懒加载介绍 1.1.效果预览 1.2.效果讲解 当页面可见的时候,才加载当前页面. 没有打开的页面,就不会预加载. 说白了,懒加载就是可见的时候才去请求数据. 1.3.懒加载文章传送门 参考文章: ...
- 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...
- Android Studio使用心得 - 简单介绍与环境配置
FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/38544823,未经本人允许请勿用于商业用途.感谢支持! 关 ...
- 开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍
When developing applications for Android, one often facesthe problem of displaying some graphical ...
- Android中Fragment的简单介绍
Android是在Android 3.0 (API level 11)引入了Fragment的,中文翻译是片段或者成为碎片(个人理解),可以把Fragment当成Activity中的模块,这个模块有自 ...
- Android驱动调试利器Busybox之初体验
工欲善其事必先利其器,之前做WinCE开发时,经常写一些小工具以提高开发调试的效率,如WinCE驱动调试助手.WinCE串口调试助手.WinCE6.0寄存器访问工具.WinCE远程桌面助手和S3C24 ...
- salesforce lightning零基础学习(一) lightning简单介绍以及org开启lightning
lightning对于开发salesforce人员来说并不陌生,即使没有做过lightning开发,这个名字肯定也是耳熟能详.原来的博客基本都是基于classic基于配置以及开发,后期博客会以ligh ...
- Android项目开发全程(二)--Afinal用法简单介绍
本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...
随机推荐
- cocos2dx进阶学习之CCObject
继承关系 CCObject -> CCCopying 类定义 class CC_DLL CCObject : public CCCopying { public: // object id, C ...
- 基于visual Studio2013解决算法导论之021单向循环链表
题目 单向循环链表的操作 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...
- Zabbix Step 1 : Install CentOS6.5 and Configration
[root@myzabbix Desktop]#rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2- ...
- android JB2连拍降速原理介绍
1.HAL层 (1)alps\mediatek\platform\mt6589\hardware\camera\core\camshot\MultiShot\MultiShot.cpp sleep实现 ...
- Ubuntu下ssh免password登录安装
1.首先在本机安装openssh-server和openssh-client. 命令:sudo apt-get install openssh-server openssh-client 2.在检查当 ...
- 异常configure: *** apu library not found.
安装modsecurity时,出现"configure: *** apu library not found.". 解决方法: yum install apr-util- ...
- javascript操作元素的css样式
我们经常要使用Javascript来改变页面元素的样式.当中一种办法是改变页面元素的CSS类(Class),这在传统的Javascript里,我们一般是通过处理HTML Dom的classname特性 ...
- NET 2016
.NET 2016 阅读目录 初识 .NET 2016 使用 .NET Framework 4.6 编译应用程序 使用 .NET Core CLI 编译应用程序 小结 厚积薄发这个词是高三英语老师 ...
- boost操作xml 5分钟官方教程
Five Minute Tutorial This tutorial uses XML. Note that the library is not specifically bound to XML, ...
- [置顶] RFS的web自动化验收测试——常见问题指引
引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面. ( @齐涛-道长 新浪微博) 下面的内容还没整理好,先发个问题解决机制吧 ...