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,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...
随机推荐
- 有什么很好的软件是用 Qt 编写的?
作者:尘中远链接:http://www.zhihu.com/question/19630324/answer/19365369来源:知乎 一些出名的例子如下:(wiki搬运) 3DSlicer, a ...
- 2014 International Conference on Robotics and Computer Vision (ICRVC 2014)
2014机器人与计算机视觉国际会议ICRVC 与会地点:北京 与会时间:2014.10.24-26 截稿日期:2014-07-10 关于征稿: 语言:英文 主题: • Evolutionary Rob ...
- Android 蓝牙( Bluetooth)耳机连接分析及实现
Android 实现了对Headset 和Handsfree 两种profile 的支持.其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它. if ( ...
- scanf()常犯错误
------------------------------------------------------------------------ <> 本意:接收字符串. 写成代码:voi ...
- 自己用js写的两个日历控件
前一阵写了两个日历控件,做了简单的封装,发出来共朋友们参考. 第一个日历控件,条状的日历. (使用方法:调用initBarTime(id,evn),第一个参数是要渲染div的id,第二个参数是点击日期 ...
- SSH框架总结(框架分析+环境搭建+实例源码下载)(转)
首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
- 用PowerMockito来mock私有方法(转)
话说我们做的所谓的接口测试真的是不伦不类啊,测的是controller层,那叫接口木??!!可是老大们说写的是接口测试,那就接口吧! 自接手写这个接口测试不久,很多人,包括一个关系比较好的架构师就跟我 ...
- [置顶] android 自定义TextView
系统自带的控件TextView有时候没满一行就换行了,为了解决这个问题,自定义了一个TextView,只有一行显示不完全的情况下才会去换行显示,代码如下: package com.open.textv ...
- WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?
原文:WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果? 我们想对WCF具有一定了解的人都会知道:在客户端通过服务调用进行服务调用过程中,服务代理应该及时关闭.但是如果服务的代理不等得到及时的 ...
- 《WCF技术剖析》博文系列汇总[持续更新中]
原文:<WCF技术剖析>博文系列汇总[持续更新中] 近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析(卷1)>的写作,一直无暇管理自己的Blog.在<WCF技术剖 ...