以下内容源于朱有鹏《物联网大讲堂》课程的学习,如有侵权,请告知删除。

1、I2C总线汇总概览

(1)三根通信线:SCL、SDA、GND;

(2)同步、串行、电平、低速(几百k)、近距离;

(3)总线式结构:支持多个设备挂接在同一条总线上

(4)主从式结构:通信双方必须一个为主(master)一个为从(slave),主设备掌握每次通信的主动权,从设备按照主设备的节奏被动响应。

  • 每个从设备在总线中有唯一的地址(slave address),主设备通过从地址找到自己要通信的从设备(本质是广播)。

(5)I2C主要用途就是主SoC和外围设备之间的通信,最大优势是支持在总线上扩展多个外围设备。

  • 常见的各种物联网传感器芯片(如gsensor、温度、湿度、光强度、酸碱度、烟雾浓度、压力等)均使用I2C接口和主SoC进行连接。

(6)电容触摸屏芯片的多个引脚构成2个接口。http://blog.csdn.net/oqqhutu12345678/article/details/65445338

  • 一个接口是I2C的,负责和主SoC连接(本身作为从设备)。主SoC通过该接口初始化及控制电容触摸屏芯片,而芯片通过该接口向SoC汇报触摸事件的信息(触摸坐标等),我们使用电容触摸屏时重点关注的是这个接口;
  • 另一个接口是电容触摸板的管理接口,电容触摸屏芯片通过该接口来控制触摸板硬件。该接口是电容触摸屏公司关心的,他们的触摸屏芯片内部固件编程要处理这部分,我们使用电容触摸屏的人并不关心这里。

2、linux内核的I2C驱动框架总览

(1)I2C驱动框架的主要目标

  • 让驱动开发者可以在内核中方便的添加自己的I2C设备的驱动程序,从而可以更容易的在linux下驱动自己的I2C接口硬件。

(2)源码中I2C相关的驱动均位于:drivers/i2c目录下。

(3)linux系统提供2种I2C驱动实现方法。

  • 第一种叫i2c-dev,对应drivers/i2c/i2c-dev.c。
  • 这种方法只是封装了主机(I2C master,一般是SoC中内置的I2C控制器)的I2C基本操作,并且向应用层提供相应的操作接口,应用层代码需要自己去实现对slave的控制和操作,所以这种I2C驱动相当于只是提供给应用层可以访问slave硬件设备的接口,本身并未对硬件做任何操作,应用需要实现对硬件的操作,因此写应用的人必须对硬件非常了解,其实相当于传统的驱动中干的活儿丢给应用去做了,所以这种I2C驱动又叫做“应用层驱动”。
  • 这种方式并不主流,它的优势是把差异化都放在应用中,这样在设备比较难缠(尤其是slave是非标准I2C时)时不用修改驱动,而只需要修改应用就可以实现对各种设备的驱动。这种驱动在驱动层很简单(就是i2c-dev.c),我们就不分析了。
  • 第二种I2C驱动是所有的代码都放在驱动层实现,直接向应用层提供最终结果。应用层甚至不需要知道这里面有I2C存在,譬如电容式触摸屏驱动,直接向应用层提供/dev/input/event1的操作接口,应用层编程的人根本不知道event1中涉及到了I2C。这种是我们后续分析的重点。

linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览相关推荐

  1. linux内核管道pipe实现详解

    linux内核管道pipe实现详解 (文件系统暂时不是很了解,文件系统部分暂时不做解释,此文仅解释关键流程,系统调用部分请参考前面已经发布的文章,这里不做展开) 1.管道系统调用(SyS_pipe) ...

  2. linux内核I2C子系统详解

    1.I2C通信协议 参考博客:<I2C通信协议详解和通信流程分析>:https://csdnimg.cn/release/blogv2/dist/pc/themesSkin/skin3-t ...

  3. ARM Linux内核Input输入子系统浅解

    --以触摸屏驱动为例 第一章.了解linux input子系统       Linux输入设备总类繁杂,常见的包括有按键.键盘.触摸屏.鼠标.摇杆等等,他们本身就是字符设备,而linux内核将这些设备 ...

  4. linux内核的I2C子系统详解2——关键结构体、关键文件

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 3.I2C子系统的4个关键结构体 (1)struct i2c_adapter :I2C适配器 用来描述I2C控制器的, ...

  5. 内核I2C子系统详解

    1.1 I2C总线知识 1.1.1  I2C总线物理拓扑结构       I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA ...

  6. Linux内核中sk_buff结构详解

    目录 1.sk_buff结构体 1.1 sk_buff在内核中的结构 1.2 重要的长度len的解析 2. sk_buff数据区 2.1 线性数据区 2.2 非线性数据区 -------------- ...

  7. linux 内核编译 Kconfig文件详解

    Kconfig的格式 下面截取/drivers/net下的Kconfig文件中的部分内容, # Network device configuration menuconfig NETDEVICESde ...

  8. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  9. Linux内核线程kernel thread详解--Linux进程的管理与调度

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

最新文章

  1. vue组件定义、组件的切换、组件的通信、渲染组件的几种方式(标签、路由、render)...
  2. 马斯克:我有一个大胆的想法!给红绿灯加个AI视觉「外挂」
  3. CMake添加-g编译选项
  4. SSH-Auditor:一款SSH弱密码探测工具
  5. 从零单排学Redis【青铜】
  6. linux内核驱动开发 培训,嵌入式Linux驱动开发培训 - 华清远见教育集团官网
  7. 函数调用过程(栈桢)
  8. docker daemon 配置文件
  9. 马云生气了 mysql_“马云生气了”之增删改查
  10. php验证码显示碎图片,我的验证码只显示破碎的小图片
  11. Android广播机制(2)
  12. 微信小程序登录方法,授权登陆及获取微信用户手机号
  13. 闪电世界源码-闪电世界系统开发功能介绍
  14. API ,批量添加
  15. The Preliminary Contest for ICPC Asia Xuzhou 2019
  16. mysql 在当前时间上加几小时
  17. 一个可直接使用的轻量级博客开源系统
  18. Typora收费了,再找找免费的Markdown编辑器吗?
  19. VS2005 项目怎样添加“依赖”、“库目录”和“包含目录”
  20. 谷歌语言设置_如何设置您的Google主页以使用两种语言

热门文章

  1. Python 字符串查找子串的方法之 index() 和 find()
  2. nginx的脚本引擎(一)
  3. 1.3 使用电脑测试MC20的电话语音功能
  4. 网页“console”输出图文信息
  5. ==与equal在java中应用的感悟
  6. 第五节 CImage和CBmp(二)
  7. 微软正在考虑将Windows默认浏览器改为Chromium
  8. 数据中心传输需求成以太网市场巨大推动力
  9. SQL Server-数据类型(七)
  10. Chrome英文版离线安装包下载