当前位置: 首页 > news >正文

linux内核中的I2C

0、说明

        介绍I2C基本协议,以及在linux内核中I2C驱动程序框架。

        I2C驱动基于标准了总线设备驱动模型,因此本文仅示意分析I2C驱动框架,驱动实现细节按照总线设备驱动模型来实现,不做过多分析。

1、I2C基础

        只有两脚

  • SCK
  • SDA

        根据引脚可以推断,一个数据脚为半双工,且数据脚方向为双向。没有片选信号,因此数据通信需要带有地址信息。

开始和结束信号

        时钟为高电平期间,数据线从高变低是开始,从低变高是结束。

数据信号

        时钟为高器件,数据线不允许变化,变化就是开始和结束。时钟为低电平器件,数据bit进行变化传输。

 ACK

        通信完成一个字节后,从设备或者主设备主动将SDA拉低从而产生一个ACK信号给对方,默认情况下被外部上拉置位高电平。

读写时序

 2、内核中的I2C驱动

架构

        遵循总线设备驱动模型。总线驱动在设置config支持i2c后在内核启动阶段被注册。与SPI总线类似,设备树中描述控制器及其下的设备,被转换为控制器及i2c_client设备。并注册不同类型的设备驱动,完成匹配。

        i2c_bus_type(总线)、i2c_adpater(控制器)、i2c_client(设备)、驱动(i2c_driver)

设备树控制器描述

i2c1: i2c@021a0000 {
    #address-cells = <1>;
    #size-cells = <0>;
    compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
    reg = <0x021a0000 0x4000>;
    interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&clks IMX6UL_CLK_I2C1>;
    status = "disabled";
};    

&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";

    mag3110@0e {
        compatible = "fsl,mag3110";
        reg = <0x0e>;
        position = <2>;
    };

    fxls8471@1e {
        compatible = "fsl,fxls8471";
        reg = <0x1e>;
        position = <0>;
        interrupt-parent = <&gpio5>;
        interrupts = <0 8>;
    };
};

总线驱动

 

 控制器驱动

 

 设备驱动

总结

        与SPI驱动类似,I2C完全符合总线设备驱动模型。I2C通信只有2根型号,可产生开始信号,停止信号,数据传输,ACK反馈等。

相关文章:

  • 【Java面试】如何系统准备秋招?献上一份超硬核Java学习路线图+学习资源,拿走不谢!!
  • 面试分析:你懂不懂threadlocal?
  • ESP8266-Arduino编程实例-CCS811数字气体传感器驱动
  • 【C++编程语言】之类和对象---对象初始化和清除
  • Task05|joyfulpandas|变形
  • 【SpringBoot】yaml配置文件语法—总结回顾
  • jenkins 发布项目到k8s tomcat
  • 基于ssm(非maven)学生考勤管理系统
  • C++11新特性(一)
  • WebRTC源码之摄像头视频数据采集源码分析
  • stm32f4xx-PWM输出
  • 【博客474】为什么k8s控制面pod使用的ip是node ip,而非pod cidr中的ip
  • 2022 华为 Java 高级面试题及答案
  • SpringCloud集成RocketMQ
  • 计算机java毕业设计选题汇总(2022)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • android 一些 utils
  • Java教程_软件开发基础
  • Java精华积累:初学者都应该搞懂的问题
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mysql innodb 索引使用指南
  • Vue ES6 Jade Scss Webpack Gulp
  • vue中实现单选
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊directory traversal attack
  • 嵌入式文件系统
  • 如何设计一个比特币钱包服务
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 原生js练习题---第五课
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​学习一下,什么是预包装食品?​
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (多级缓存)缓存同步
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)LINQ之路
  • (转)德国人的记事本
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET业务框架的构建
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [.net] 如何在mail的加入正文显示图片
  • [<死锁专题>]
  • [100天算法】-不同路径 III(day 73)
  • [2016.7.Test1] T1 三进制异或
  • [51nod1610]路径计数
  • [Android] 修改设备访问权限
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [CDOJ 1343] 卿学姐失恋了
  • [CSS]CSS 字体属性