总线速度有三种模式 标准模式 100kbps 快速模式 400kbps 高速模式 3.4Mbps I2C子系统框架 I2C设备驱动层:drivers/i2c/i2c-dev.c (通用型) 或者为特定设备定制的设备驱动...I2C核心层 注册I2C总线 由内核开发人员编写的,不涉及具体硬件 给驱动编程人员提供编程接口 I2C总线驱动层 是I2C主机适配器的驱动程序 初始化I2C适配器(控制器) 实现操作方法:根据I2C操作时序进行操作...笔者会大体上对I2C子系统的源码进行分析,如若分析的有出入,还望指出。 I2C核心层 I2C核心层的实现位于drivers/i2c/i2c-core.c中,笔者从i2c_init函数开始分析。...= i2c_device_remove, .shutdown = i2c_device_shutdown, .pm = &i2c_device_pm_ops, }; 根据Linux...核心层分析可知,I2C总线是根据id_table进行匹配,所以这里并不会按照常规的Linux驱动模型进行match后probe,况且这个驱动里也没有probe方法。
其中,Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter。...Linux 内核使用的虚拟地址 i2c->base = devm_ioremap_resource(&pdev->dev, res); ........); //向 Linux 内核注册 i2c_adapter ret = i2c_add_numbered_adapter(&i2c->adap); platform_set_drvdata...adap); i2c_acpi_register_devices(adap); ..... } dev_set_name(&adap->dev, "i2c-%d", adap->nr) 会在 Linux...因此,对于 Linux 来讲,不区分 I2C 控制器和 I2C 从机设备,用的都是同一套东西,即【总线、设备、驱动】框架,都有 probe 函数。
3、I2C Transfer Definition of timing 想要深入探讨 I2C 协议,必须深刻理解各种时间的定义(F/S-mode) 标识符 定义 tf 信号下降时间 tr 信号上升时间...4、write data 5、read data 6、复合格式 7、I2C Transfer Regulation 以 START 条件开始 以 STOP 条件结束 传输的第一个字节为 7bit...repeated START 信号+另外一个设备地址,直接开始访问另外一个设备 8、10-bit addressing 解析如下: A9-A0 表示 10bits 地址 9、示波器波形图 10、补充 I2C
】由普通驱动工程师负责,【i2c 核心层】由 Linux 提供,【i2c 核心层】以下由芯片原厂负责。...I2C 子系统通过 i2c-core 将 i2c 设备驱动和 i2c 总线驱动进行了分离,从而使得 i2c 设备驱动中不用关心 i2c 总线传输细节,专注于 i2c 设备逻辑的实现。...其中,Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter,i2c_algorithm 只是一些 i2c 传输的实现函数合集。...在 Linux 系统中有如下节点: 2、I2C Data Structure 我们要搞懂一个 Linux 子系统,必须研究它的数据结构,搞懂每个结构体存储了什么东西,才能梳理清楚该子系统的架构。...I2C 子系统有几个主要的结构体: I2C 控制器:i2c_adapter、i2c_algorithm、mtk_i2c I2C 设备驱动:i2c_client、i2c_driver I2C 传输:i2c_msg
I2C 常见有两种错误:I2C ACK error、I2C timeout 1、I2C ACK error 在应该收到 ACK 信号的时候没有收到 ACK 信号,i2c controller 就会产生一个...4、检查 i2c device 信号电平是否与 AP 匹配。...I2C 读 主机从从机接收数据时,最后一个 Byte 数据时,主机不回应该从机,即 NACK. 2、I2C timeout 当 I2C 传输发生 timeout 时,一般 kernel log 会有类似如下打印...2)隐藏的 i2c address,即外设存在多个 i2c addr 或外设 HW bug,导致 i2c 通讯异常。...返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况: I2C 地址错误,解决方法是测量 I2C 波形,确认是否 I2C 设备地址错误; I2C
4、I2C Data Transfer I2C 数据传输主要有三个 API int i2c_master_send(const struct i2c_client *client,const char...*buf,int count) client:I2C 设备对应的 i2c_client。...msgs:I2C 要发送的一个或多个消息。 num:消息数量,也就是 msgs 的数量。 返回值:负值,失败,其他非负值,发送的 msgs 数量。...Linux 用 rt_mutex 来解决该问题,rt_mutex 是带优先级继承的互斥锁。...在 i2c_transfer 调用 __i2c_transfer 之前,就加了 rt_mutex,保证 I2C 传输尽快执行。
I2C 系列文章主要分为两个部分来写: 1、I2C spec:研究 I2C 协议本身,研究它的协议规范、传输机制。 2、I2C driver:研究 Linux I2C 驱动。...I2C 系列文章目录如下: I2C spec I2C Introduction I2C Architecture I2C Transfer I2C Synchronization And Arbitration...I2C Hs-mode I3C Introduction I3C Protocol I2C driver I2C SW Architecture I2C Data Structure I2C Register...Flow I2C Data Transfer 1、I2C Introduction I2C 历史 I2C:Inter-Integrated Circuit,集成电路总线。...I2C 是一种多主从架构总线 I2C 的读写均由 master 端发起。 I2C 通信的每一个 byte(8bits)都需要 slaver 端的回应 ACK/NACK 作为回应。
4、I2C Synchronization And Arbitration 本文讲解三个重要的 I2C 概念:时钟延展、同步、仲裁 Data and ACK/NACK 正常情况 主接收机必须向从机发送传输结束的信号...在 Hs 模式下,此握手功能只能在字节级别使用 I2C 主设备始终控制着时钟线 SCL,不论是往设备写还是从设备读。...这也是 I2C 通信系统中,从机唯一能控制总线的时候! 关键是很多 I2C 主机不支持 clock stretching 功能,所以,无法和带有 clock stretching 功能的从机通信!...要解决这种冲突,就要进行仲裁的判决,这就是 I2C 总线上的仲裁。 I2C 总线上的仲裁分两部分:SCL 线的同步和 SDA 线的仲裁,这两部分没有先后关系,同时进行。...SDA 线的仲裁可以保证 I2C 总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。
2、I2C Architecture I2C 采用的 GPIO 一般为开漏模式,支持线与功能,但是开漏模式无法输出高电平,所以需要外部上拉。...线与,是 I2C 协议的基础!线与:当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占用状态。 上拉电阻计算 1、上拉电阻过小,电流大,端口低电平 level 增大。...采用合适的电源电压和合适的上拉电阻,才会让你的 I2C 传输信号最优。上拉电阻选小了,会使得总线电流大,端口输出的低电平会变大(一般低电平不允许超过0.4V)。
5、I2C Hs-mode HS mode 为什么单独讲解?因为高速模式和其他模式有很多不一样的地方。 速度高达 3.4MHz。...连接到总线的外部上拉器件必须调整以适应快速模式 I2C 总线更短的最大允许上升时间。...的总线,每条总线的上拉器件可以是一个电阻;对于负载在 200pF~400pF 之间的总线,上拉器件可以是一个电流源(最大值 3mA)或者是一个开关电阻电路,如下图: 只有 Hs 模式器件的系统的物理 I2C...总线配置 (可选)串联电阻器 Rs 保护 I2C 总线设备的 I/O 免受总线上的高压尖峰影响,并将振铃和干扰降至最低。
对于 Linux 常用版本,kernel-4.14 和 kernel-4.19 并没有提供 I3C 驱动,kernel-5.10 有提供 I3C 驱动(从 kernel-5.0开始提供的) 如下可以在线查看...Linux 源码,目录/drivers/i3c/... https://elixir.bootlin.com/linux/latest/source Bus configuration I3C 不仅支持多个从设备...I3C 总线上可以支持的设备有: Main Master(当前主设备) Secondary master(辅助主设备) i3c Slave(i3c从设备) i2c Slave(i2c从设备) I3C...Role of I3C Slave 在分配动态地址之前,I3C从设备应作为I2C设备运行 I3C START 和 STOP 在信号方面与 I2C START 和 STOP 相同,但在时序上可能不同。...传统 i2c、spi、uart 设备接口中。 camera、touch panel。 i3c 向下兼容 i2c,可与传统 i2c 接口器件一起使用。
I2C 传输速度最高 3.4MHz,I3C 可以 12.5MHz +。 I3C 向下兼容 I2C,但不兼容 10bit 的 I2C 扩展地址。...I2C 设备的静态寻址 I3C 总线支持传统 I2C 通讯 类似 I2C 的单数据速率消息传输(SDR) I3C BASIC 不支持:可选的高数据速率消息模式(HDR) 多点功能 多主功能 带内中断支持...在程序和条件方面与 I2C 协议【NXP01】非常相似,因此 I3C 设备和许多传统 I2C 从设备(但不是 I2C 主设备)可以在同一 I3C 总线上共存。...对于 I3C 与 I2C 共享的程序和条件,SDR 模式严格遵循 I2C 规范中的定义。...所有 I3C 从机将正确忽略从 I3C 主机到 I2C 从机的 I2C 通信,因为 I3C 协议旨在允许 I2C 通信。
一文搞懂 | Linux 时钟子系统 Clock 时钟就是 SoC 中的脉搏,由它来控制各个部件按各自的节奏跳动。比如,CPU主频设置,串口的波特率设置,I2S的采样率设置,I2C的速率设置等等。
rtc 一般负责系统关机后计时、闹钟等,Linux 内核提供了一个 rtc 子系统,来支持所有的 rtc 设备。...rtc 设备本质上是一个字符设备,rtc 子系统在字符设备的基础上抽象与硬件无关的部分,并在这个基础上拓展 sysfs 和 proc 文件系统下的访问。...rx8010_set_alarm rx8010_set_time 软件逻辑就不在这里赘述了,大家可以参考下面链接 https://jasper1024.com/jasper/c089e4b/ 大家多看几个 Linux...子系统就会发现,基本上每个子系统都差不多,Linux 都会封装上中下 3 层,然后给你一些数据结构让你填充,就可以将这个子系统用起来了。
这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C/SPI 设备的时候,为此引入了 Regmap 子系统。...1、什么是 Regmap Linux 下大部分设备的驱动开发都是操作其内部寄存器,比如 I2C/SPI 设备的本质都是一样的,通过 I2C/SPI 接口读写芯片内部寄存器。...Linux 下使用 i2c_transfer 来读写 I2C 设备中的寄存器,SPI 接口的话使用 spi_write/spi_read等。...I2C/SPI 芯片又非常的多,因此 Linux 内核里面就会充斥了大量的 i2c_transfer 这类的冗余代码,再者,代码的复用性也会降低。...基于代码复用的原则,Linux 内核引入了 regmap 模型,regmap 将寄存器访问的共同逻辑抽象出来,驱动开发人员不需要再去纠结使用 SPI 或者 I2C 接口 API 函数,统一使用 regmapAPI
Linux 内核为了管理这些日益增多的 ADC 类传感器,特地推出了 IIO 子系统,我们学习如何使用 IIO 子系统来编写 ADC 类传感器驱动。...1、IIO 子系统简介 IIO 全称是 Industrial I/O,翻译过来就是工业 I/O,大家不要看到“工业”两个字就觉得 IIO 是只用于工业领域的。...大家一般在搜索 IIO 子系统的时候,会发现大多数讲的都是 ADC,这是因为 IIO 就是为 ADC 类传感器准备的,当然了 DAC 也是可以的。...1、iio_dev 结构体 IIO 子系统使用结构体 iio_dev 来描述一个具体 IIO 设备,此设备结构体定义在include/linux/iio/iio.h 文件中 2、iio_dev 申请与释放...Linux 内核使用 iio_chan_spec 结构体来描述通道,定义在 include/linux/iio/iio.h 文件中。
2、概述 led 子系统驱动框架: 所有 led 共性: 有和用户通信的设备节点 亮和灭 不同点: 有的 led 可能是接在 gpio 管脚上,不同的 led 有不同的 gpio 来控制 有的 led...可能由其他的芯片来控制(节约 cpu 的 pin,或者为了控制 led 的电流等) 可以设置亮度 可以闪烁 所以 Linux led 子系统把所有 led 的共性给实现了,把不同的地方留给驱动工程师去做...led 子系统核心文件: driver/leds/led-class.c driver/leds/led-core.c driver/leds/led-triggers.c include/linux/...led 子系统是一个简单的 Linux 子系统 ,在目录 /sys/class/leds 下展示该子系统设备,每个设备都有自己的属性: brightness:设置 LED 亮度,范围 0 ~ max_brightness...触发方式,如 heartbeat、mmc0、backlight、gpio delay_off、delay_on:trigger为timer时,LED亮灭的时间,单位ms kernel/include/linux
8)底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到。...1、CPUFreq 驱动 CPUFreq 子系统位于 drivers/cpufreq 目录下,负责进行运行过程中 CPU 频率和电压的动态调整,即 DVFS(Dynamic Voltage Frequency...6、Regulator 驱动 Regulator是Linux系统中电源管理的基础设施之一,用于稳压电源的管理,是各种驱动子系统中设置电压的标准接口。...Linux的Regulator子系统提供如下API以用于注册/注销一个稳压器: structregulator_dev * regulator_register(conststructregulator_desc...Linux运行时PM最早是在Linux2.6.32内核中被合并的。
今天分享一篇经典Linux协议栈文章,主要讲解Linux网络子系统,看完相信大家对协议栈又会加深不少,不光可以了解协议栈处理流程,方便定位问题,还可以学习一下怎么去设计一个可扩展的子系统,屏蔽不同层次的差异...目录 Linux网络子系统的分层 Linux网络子系统实现需要: 支持不同的协议族 ( INET, INET6, UNIX, NETLINK…) 支持不同的网络设备 支持统一的BSD socket API...中TCP,UDP协议包在网络子系统中的实现流程。...创建ksoftirqd内核线程 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用。...网络子系统的分层 Linux网络子系统实现需要: 支持不同的协议族 ( INET, INET6, UNIX, NETLINK…) 支持不同的网络设备 支持统一的BSD socket API 需要屏蔽协议
领取专属 10元无门槛券
手把手带您无忧上云