首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Rice嵌入式

    《rt-thread驱动框架分析》-i2c驱动

    这一篇文章我们来分析rt-thread的I2C设备驱动框架,I2C也是我们经常使用到总线。 I2C驱动框架我准备基于我的开源硬件《GND studio 开发板》来做实验。 通过硬件I2C和软件I2C分别来驱动一个OLED。 《rt-thread驱动框架分析》专辑回顾: 《rt-thread驱动框架分析》-pin驱动 驱动分析 I2C设备驱动框架图: 我们先RT-Thread的I2C框架图(这是我自己理解的框架图,如果不对的地方 驱动层:分为硬件I2C驱动和软件I2C驱动。 核心层: ①其中bit_ops是RTT为软件I2C提供的中间层,它的作用:为底层模拟I2C驱动提供回调接口,为核心层提供统一I2C通信接口。 driver 层: RT-Thread的I2C驱动,分为两种类型:硬件I2C和软件I2C

    2.4K32编辑于 2022-05-10
  • 来自专栏韦东山嵌入式

    Linux系统驱动I2C协议

    I2C协议 参考资料: i2c_spec.pdf 1. 硬件连接 I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。 2. 下图:白色背景表示"主→从",灰色背景表示"从→主" 3.3 I2C信号 I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。 举例:主设备发送(8bit)给从设备 前8个clk 从设备不要影响SDA,从设备不驱动三极管 主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管 第9个clk,由从设备决定数据 当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。 对于IIC协议它只能规定怎么传输数据,数据是什么含义由从设备决定。

    3.6K20编辑于 2021-12-08
  • 来自专栏混说Linux

    Linux I2C驱动入门,建议收藏!

    Linux内核将 I2C 驱动分为两部分: I2C 总线驱动I2C总线驱动就是SOC的 I2C控制器驱动,也叫做 I2C适配器驱动I2C 设备驱动I2C设备驱动就是针对具体的 I2C设备而编写的驱动I2C总线协议详解请参考:IIC通信协议,搞懂这篇就够了 I2C框架下的几个重要成员 1. 小结 I2C驱动有4个重要的东西:I2C总线、I2C驱动I2C设备、I2C设备器。 I2C总线:维护着两个链表(I2C驱动I2C设备),管理I2C设备和I2C驱动的匹配和删除等。 I2C驱动:对应的就是I2C设备的驱动程序。 I2C设备:是具体硬件设备的一个抽象。 I2C适配器:用于I2C驱动I2C设备间的通用,是SOC上I2C控制器的一个抽象。 因此 I2C 总线驱动对于 SOC使用者来说是被屏蔽掉的,我们只要专注于 I2C 设备驱动即可。除非你是在半导体公司上班,工作内容就是写 I2C 适配器驱动

    4K20编辑于 2022-07-14
  • 来自专栏韦东山嵌入式

    Linux系统驱动I2C系统驱动程序模型

    I2C系统驱动程序模型 参考资料: Linux内核文档: Documentation\i2c\instantiating-devices.rst Documentation\i2c\writing-clients.rst Linux内核驱动程序示例: drivers/eeprom/at24.c 1. I2C驱动程序的层次 I2C Core就是I2C核心层,它的作用: 提供统一的访问函数,比如i2c_transfer、i2c_smbus_xfer等 实现I2C总线-设备-驱动模型,管理:I2C设备( i2c_client)、I2C设备驱动(i2c_driver)、I2C控制器(i2c_adapter) 2. I2C总线-设备-驱动模型 2.1 i2c_driver i2c_driver表明能支持哪些设备: 使用of_match_table来判断 设备树中,某个I2C控制器节点下可以创建I2C设备的节点

    3.2K40编辑于 2021-12-08
  • 来自专栏韦东山嵌入式

    Linux系统驱动I2C视频介绍

    I2C软件框架 以I2C接口的存储设备AT24C02为例: APP: 提出要求:把字符串"www.100ask.net"写入AT24C02地址16开始的地方 它是大爷,不关心底层实现的细节 它只需要调用设备驱动程序提供的接口 I2C控制器驱动 它根据I2C协议发出各类信号:I2C设备地址、I2C存储地址、数据 它根据I2C协议判断 3. 我们讲什么 3.1 对于Linux 从上到下: 先讲I2C协议 APP可以通过两类驱动程序访问设备 I2C设备自己的驱动程序 内核自带的i2c-dev.c驱动程序,它是i2c控制器驱动程序暴露给用户空间的驱动程序 (i2c-dev.c) I2C Device Driver I2C设备自己的驱动程序 内核自带的i2c-dev.c驱动程序,它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c) I2C Controller Driver 芯片I2C控制器的驱动程序(称为adapter) 使用GPIO模拟的I2C控制器驱动程序(i2c-gpio.c) 3.2 对于单片机/裸机 从上到下

    3K40编辑于 2021-12-08
  • 来自专栏开源519

    I2C总线架构 之 总线驱动

    架构设计 在Linux设计中,将I2C代码框架分为三个部分:I2C总线、I2C核心、I2C驱动。 「I2C核心(i2c-core):」 主要定义i2c驱动所用到的通用API,高内聚的代码会放到i2c-core.c。 「I2C总线驱动i2c adapter):」 根据平台定制的i2c驱动,其中包含i2c传输的算法设计。 「I2C设备驱动i2c client driver):」 驱动I2C设备的代码。I2C设备驱动定义了外设的交互方式,与不同的I2C外设需要不同的设备驱动I2C设备驱动对上和用户应用程序打交道,对下和I2C核心对接。 ? 本篇主要对IIC总线驱动的总结。

    1.9K30发布于 2020-08-28
  • 来自专栏混说Linux

    Linux I2C 驱动入门,建议收藏!!!

    第一时间看干货文章 1 Linux内核将 I2C 驱动分为两部分: I2C 总线驱动I2C总线驱动就是SOC的 I2C控制器驱动,也叫做 I2C适配器驱动I2C 设备驱动I2C设备驱动就是针对具体的 I2C设备而编写的驱动I2C框架下的几个重要成员 1. 小结 I2C驱动有4个重要的东西:I2C总线、I2C驱动I2C设备、I2C设备器。 I2C总线:维护着两个链表(I2C驱动I2C设备),管理I2C设备和I2C驱动的匹配和删除等。 I2C驱动:对应的就是I2C设备的驱动程序。 I2C设备:是具体硬件设备的一个抽象。 I2C适配器:用于I2C驱动I2C设备间的通用,是SOC上I2C控制器的一个抽象。 因此 I2C 总线驱动对于 SOC使用者来说是被屏蔽掉的,我们只要专注于 I2C 设备驱动即可。除非你是在半导体公司上班,工作内容就是写 I2C 适配器驱动

    3.7K20编辑于 2023-02-24
  • 来自专栏嵌入式iot

    Linux的I2C驱动框架分析

    I2C总线上连接的I2C从设备都有一个标识自己的设备地址,由这个设备地址来确定主设备发过来的命令是否该由它来响应。 驱动 简单的说驱动代表着操作设备的方式和流程。 总线的作用就是在软件层面上对设备和驱动进行管理,设备要让系统感知到自己的存在,所以需要向总线去注册设备,驱动同样也要向总线去注册。对于总线,有I2C总线,Platform总线等等。 3.Linux下I2C驱动程序的体系结构 ---- 对于Linux下的I2C驱动,其体系结构的组成主要分为三个部分 (1)I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法 (2)I2C总线驱动I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。 (3)I2C设备驱动I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。 ?

    6.1K11发布于 2020-03-17
  • 来自专栏开源519

    I2C总线架构 之 设备驱动

    引言 I2C设备驱动I2C框架中最接近应用层的,其上接应用层,下接I2C核心。也是驱动开发人员需要实现的代码,在此驱动中我们只需负责以下步骤(以ap3216c为例): a. 搭建驱动框架 c. 构建i2c_driver,并注册到linux i2c中 d. 注册字符设备 e. 向应用层提供i2c设备操作接口 f. 注销i2c设备 本篇文章会按照以上六个阶段展开解析。 (具体实现放在I2C核心文章分析) e. 向应用层提供i2c设备操作接口 成功进入probe函数后,就说明i2c驱动配置基本成功。接下来在probe中需要实现字符驱动的注册,以及实现对外的读写接口。 注销i2c设备 注销操作:在字符驱动出口函数中,卸载掉注册的i2c设备。这里调用i2c_del_driver即可实现,与i2c_add_driver是对应的。 由于Linux内部的实现较为复杂,本篇主要以设备驱动的角度来分析整个驱动的代码走向,涉及到内部API的实现,本篇只大概介绍其功能,剩余部分会放在i2c核心继续分析。

    2.5K70发布于 2020-08-17
  • 来自专栏嵌入式与Linux那些事

    28.3.4.2内核下的I2C驱动(三)

    下面我们自己编写I2C总线驱动,先看下内核的总线驱动怎么写的。 参考内核自带的适配器adapter,搜索配置文件 ? s3c24xx_i2c_probe static int s3c24xx_i2c_probe(struct platform_device *pdev) { struct s3c24xx_i2c *i2c /*分配设置构造I2C adap*/ strlcpy(i2c->adap.name, "s3c2410-i2c", sizeof(i2c->adap.name)); i2c->adap.owner 传输,接收到下一数据时无ACK } else { s3c2440_i2c_regs->iiccon = 0xaf; // 恢复I2C传输,接收到下一数据时发出ACK 装载驱动成功 ? 读写测试 ?

    90230发布于 2021-05-20
  • 来自专栏嵌入式与Linux那些事

    27.3.4.2内核下的I2C驱动(二)

    用户态直接访问,使用内核提供的驱动程序 dev-interface ? ? ? ? 驱动程序编译进内核才有效,I2c-dev.c依赖于那些配置项,查看makefile ? makemenuconfig,搜索CONFIG_I2C_CHARDEV ? ? ?

    1.1K40发布于 2021-05-20
  • MS1112驱动开发(i2c框架)

    MS1112驱动开发(i2c框架) MS1112芯片数据手手册下载:MS1112 ms1112驱动代码及测试程序在ms1112驱动,如有需要自行下载 1.不带sysfs 1.1 时序图 根据MS1112 数据芯片手册的写时序和读时序,编写MS1112驱动 1.2 驱动函数 写函数: /* * @description : 向ms1112多个寄存器写入数据 * @param - dev: ms1112 i2c_msg msg; struct i2c_client *client = (struct i2c_client *)dev->private_data; printk("write I2C 是我驱动程序写的不规范,导致的,具体原因: 驱动程序的读adc函数,返回的是0,并没有对错误做处理,导致测试程序read()函数返回0,直接执行,这是不符合系统调用read函数规范的 我做了如下修改: 最终,测试程序的adc值与驱动相符。

    14810编辑于 2026-02-02
  • 来自专栏嵌入式与Linux那些事

    26.3.4.2内核下的I2C驱动(一)

    1.硬件协议 1.1mini2440 I2C设备如图所示 ? 1.2 I2C协议如下: ? 1.3启动和停止信号如下图 ? 1.4 I2C总线数据传输时序: ? 注意:I2C设备读之前先写! ? 2.软件框架 2.1总线-设备-驱动模型如下图所示   把某个结构体,左右的放入链表,一一比较,匹配调用probe函数   设备链表 driver链表, 总线提供了match函数 ? 2.4第四种 从I2C总线上分辨出某个设备 ?   前面的3种方法都要事先确定适配器(I2C总线,I2C控制器)    如果我事先并不知道这个I2C设备在哪个适配器上,怎么办? 驱动不太一样 之前是构造了两个i2c_msg来进行读写 copy_to_user(buf, &data, 1); return 1; } /* buf[0] : addr * buf[1] :

    1.5K20发布于 2021-05-20
  • 来自专栏菜菜的技术博客

    Linux驱动I2C子系统剖析

    (比如E2PROM驱动I2C核心层: drivers/i2c/i2c-coere.c I2C总线驱动层(主机控制器驱动层):drivers/i2c/busses/i2c-s3c2410.c I2C设备驱动层 是I2C从机的驱动程序 给用户提供调用接口 内核提供两种方式来实现设备驱动: 第一种是内核默认实现的通用型的I2C设备驱动,位于drivers/i2c/i2c-dev.c中。 I2C核心层 注册I2C总线 由内核开发人员编写的,不涉及具体硬件 给驱动编程人员提供编程接口 I2C总线驱动层 是I2C主机适配器的驱动程序 初始化I2C适配器(控制器) 实现操作方法:根据I2C操作时序进行操作 I2C设备驱动层 笔者先从内核提供的通用驱动开始分析,最后在文末给出特定驱动的分析。 内核提供了一个通用于所有设备的I2C设备驱动,用户可以在应用层实现对I2C驱动,其实现位于drivers/i2c/i2c-dev.c中。

    7.7K20编辑于 2022-11-15
  • 来自专栏物联网思考

    【玩转ESP32】6、驱动i2c设备

    前言:在上文中聊了i2c-tools,主要使用命令行,本文使用代码驱动设备。 本文以驱动oled展开,关于oled的详细说明,可查看一文彻底了解SSD1306驱动0.96寸OLED,在这里只聊esp32的i2c如何使用。 1、初始化 (1)配置i2c:指定i2c的引脚、模式、速率等; (2)安装i2c驱动:设置发送、接收缓冲,指定中断等; 这个代码基本是固定的,当做主机的时候都可以使用以下代码来初始化 static esp_err_t (1)创建一个句柄 (2)产生起始信号 (3)写设备地址 (4)写数据 (5)结束信号 (6)主机发送命令,通知阻塞任务 (7)删除句柄 其中2、3、4、5属于标准i2c的流程,1、6、7属于esp32 4、驱动oled 0.96 oled只需要写数据即可,参考上面的主机写流程,对oled写代码如下: void I2C_WriteByte(uint8_t addr,uint8_t data) {

    2.7K20发布于 2021-04-16
  • 来自专栏韦东山嵌入式

    Linux系统驱动之使用GPIO模拟I2C驱动程序分析

    使用GPIO模拟I2C驱动程序分析 参考资料: i2c_spec.pdf Linux文档 Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yaml Linux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt Linux驱动源码 Linux-5.4\drivers\i2c\ 回顾I2C协议 1.1 硬件连接 I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。 当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。 2. I2C-GPIO驱动层次 2. 传输函数分析 看视频分析i2c_outb函数:drivers\i2c\algos\i2c-algo-bit.c 4.

    4.2K32编辑于 2021-12-08
  • 来自专栏韦东山嵌入式

    Linux系统驱动I2C系统的重要结构体

    必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git 视频观看 百问网驱动大全 I2C系统的重要结构体 参考资料: Linux驱动程序: drivers/i2c/i2c-dev.c I2CTools: https://mirrors.edge.kernel.org/pub/software I2C硬件框架 2. I2C传输协议 写操作 读操作 3. Linux软件框架 4. 重要结构体 使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。 即可 使用i2c_adapter表示一个I2C BUS,或称为I2C Controller 里面有2个重要的成员: nr:第几个I2C BUS(I2C Controller) i2c_algorithm

    2.3K20编辑于 2021-12-08
  • 来自专栏小锋学长生活大爆炸

    【教程】ESP32-CAM使用I2C驱动0.91寸OLED

    // OLED display width, in pixels#define SCREEN_HEIGHT 32 // OLED display height, in pixels// Define I2C Pins#define I2C_SDA 14#define I2C_SCL 15// Declaration for an SSD1306 display connected to I2C (SDA, Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);void setup() { // Initialize with the I2C for ESP32-CAM#define I2C_SDA 14#define I2C_SCL 15// Declaration for an SSD1306 display connected to I2C display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Use the correct I2C address here (commonly 0x3C or 0x3D

    1.5K00编辑于 2024-02-23
  • 来自专栏小锋学长生活大爆炸

    【教程】ESP32-CAM使用I2C驱动0.91寸OLED

    OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels // Define I2C Pins #define I2C_SDA 14 #define I2C_SCL 15 // Declaration for an SSD1306 display connected to I2C in pixels // WiFi credentials const char* ssid = "xxxx"; const char* password = "xxxx"; // Define I2C ESP32-CAM #define I2C_SDA 14 #define I2C_SCL 15 // Declaration for an SSD1306 display connected to I2C SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { Serial.begin(115200); // Initialize I2C

    3.1K00编辑于 2024-05-25
  • 来自专栏Linux知识

    i.MX283开发板I2C驱动——DS2460

    Linux上I2C架构可以分为I2C核心、I2C总线驱动I2C设备驱动三个部分: I2C核心:主要为总线驱动和设备驱动提供各种API,比如设备探测、注册、注销,设备和驱动匹配等函数。 它在I2C架构中处于中间的位置。 I2C总线驱动I2C总线驱动维护了I2C适配器数据结构(i2c_adapter)和适配器的通信方法数据结构(i2c_algorithm)。 I2C设备驱动I2C设备驱动主要负责和用户层交互,此处的设备是一个抽象的概念,并非真实的物理设备,它是挂在I2C适配器上,通过I2C适配器与真实的物理设备通信。 下图是整个I2C驱动框架: 实际上,Linux经过这么多年的发展,已经形成了一套完善的I2C驱动框架,现在编写I2C驱动,我们只需要完成上面所说的I2C设备驱动部分就可以,其他的芯片厂商已经为我们做好了 下面推荐几篇写的比较好的Linux I2C驱动框架文章: Linux I2C驱动框架(超详细) Linux3.5下I2C设备驱动程序 linux下I2C驱动架构全面分析

    56300编辑于 2025-02-19
领券