I2C驱动体系结构一:驱动软件概念与对应硬件的关系

2023-05-16

一、概念:

1、设备:struct device:该数据结构是对物理设备的软件抽象,比如I2C slave(对应i2c_client)和I2C 适配器(对应i2c_adapter)都是对应物理设备的软件表达;

2、驱动:struct device_driver:该数据结构是对设备驱动的表达,从该数据结构的命名来看,它表达的意思是设备的驱动,从其回调函数成员变量来看,它实际是对struct device的管理(包括检测、电源管理);但是并不包括对设备的功能性操作。可以说struct device_driver使用struct device实现了对具体物理设备的管理。

3、总线:struct bus_type:这个数据结构从名字看似乎很容易理解,总线,但是在计算机体系里,总线这个词本身就很抽象,到底什么是计算机体系的总线,struct bus_type能否表达计算机系统中的总线呢?从kernel的注释上看,struct bus_type是表示处理器与一个或多个设备之间的通道。从设备模型上看,所有设备都是通过“总线”进行连接。

* A bus is a channel between the processor and one or more devices. For the
 * purposes of the device model, all devices are connected via a bus, even if
 * it is an internal, virtual, "platform" bus. Buses can plug into each other.
 * A USB controller is usually a PCI device, for example. The device model
 * represents the actual connections between buses and the devices they control.
 * A bus is represented by the bus_type structure. It contains the name, the
 * default attributes, the bus' methods, PM operations, and the driver core's
 * private data.
 */

但是这里如果完全把struct bus_type理解成物理意义上的连接关系会十分费解,因为从物理上看,“总线”和“适配器”往往是说的一个意思;“物理设备”挂在到“适配器”下,从这个角度上看,“适配器”作为“总线”的实际物理设备是合适的;但是从设备模型驱动上看,控制器往往是作为一个“struct device”(如 struct i2c_adapter),并且也是挂在到“struct bus_type”下,所以从这个角度看,“struct bus_type”不能完全对应适配器,那么"struct bus_type"到底怎么理解呢?我认为可以按照如下的角度理解:

1、将“适配器”作为“总线”和“设备”两种角色的集合;

2、"struct bus_type"的角色承担上述“总线”的功能,包括对外提供probe、match等接口从总线的角度实现设备的检测;

3、"struct bus_type"的角色还承担"容器"的功能,"容纳"了向该bus注册的device及device_driver,至于device与device_driver的对应关系,由device和device_driver自身管理

二、is_a or has_a

C语言的语法并不完整清晰支持面向对象的设计,但是通过上下文理解和数据结构的组成形式,也可以从对象的角度进行一定程度的抽象分析。比如:

struct i2c_adapter/i2c_client {

......

struct device dev;

};

我们可以将struct i2c_adapter,struct i2c_client与struct device的关系理解为 is_a 的关系,即,struct i2c_adapter/i2c_client是struct device的子类

struct bus_type:可以看到该数据结构的主体成员是多个回调函数成员,我们可以认为struct bus_type是一个抽象结构,struct bus_type i2c_bus_type可以认为是struct bus_type的实现类,因此也可以认为 i2c_bus_type这个变量是struct bus_type的子类

struct bus_type中有一个struct subsys_private的指针结构,这是一个“容器”,记录了“挂载”在该"bus"上的struct device及struct device_driver,在这个地方,可以认为struct bus_type与struct device/struct device_driver是has_a的关系。

上图是I2C设备模型数据结构纯软件上的关系图

三、物理连接

I2C子系统,在物理上的连接实际十分明显,如下:

上图是硬件连接示意图。

从上述两个图看,一个是软件上的关系图,一个是硬件上的关系图,两者很难和谐的统一起来。

设备模型软件上的关系图如何与硬件上的连接图相映射,下一章再进行讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

I2C驱动体系结构一:驱动软件概念与对应硬件的关系 的相关文章

  • i2c信号的ACK与NACK

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp 我们平时在调试I2C的时候可能很少去关注NACK信号 只知道如果Master发送数据 MSB先发 LSB后发 连续发送一个字节 8个bit 之后Slave会回复一个ACK
  • I2C总线和触摸屏驱动移植实战-linux驱动开发第9部分-朱有鹏-专题视频课程

    I2C总线和触摸屏驱动移植实战 linux驱动开发第9部分 9306人已学习 课程介绍 本课程是linux驱动开发的第9个课程 xff0c 主要内容是linux的I2C子系统以及电容触摸屏驱动的移植 学习本课程的核心点在于I2C子系统 xf
  • 模拟I2C

    I2C具体内容参考资料 https blog csdn net sternlycore article details 85600668 https blog csdn net qq 43460068 article details 122
  • [STM32学习]——一文搞懂I2C总线

    目录 I2C总线的概念 I2C最重要的功能包括 xff1a I2C的物理层 I2C主要特点 xff1a I2C的高阻态 I2C物理层总结 xff1a I2C的协议层 初始 xff08 空闲 xff09 状态 开始信号 xff1a 停止信号
  • mt6762/mt6765平台i2c驱动能力修改与波形优化

    mt6762在连接一些外设时 xff0c i2c在低电平会拉不低的情况 xff0c 最低电平在0 4V左右 xff0e 这时需要去掉外设的上拉电阻或调整硬件i2c的驱动电流 xff0e 修改文件路径 xff1a vendor mediate
  • PX4代码中LIDAR-Lite v3激光测距仪I2C驱动

    调试LIDAR Lite v3激光测距仪 xff0c 通读了PX4代码中驱动相关的部分 在这里做一下记录 飞控硬件是pixhawk1 xff0c PX4软件版本为1 7 3 按照官方教程进行接线和配置 xff0c 链接为 https doc
  • I2C的 SCL和SDA为什么要上拉

    因为允许把多个I2C总线器件连接到总线上 xff0c 连接到I2C总线上的器件是漏极开路或集电极开路的 xff0c 可以实现线与功能 同时 xff0c 因为接了上拉电阻 xff0c 在总线空闲期间 xff0c SDA和SCL都是高电平 xf
  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • I2C总线基础知识及操作详解

    I2C总线是一种简单的双向两线式同步串行总线 xff0c 最初由Philips公司开发 xff0c 后又经过几次发展和完善 xff0c 目前已被业界厂商广泛采用 xff0c 成为最常用的板级通信总线之一 xff0c 大量应用于处理器与外围设
  • I2C—读写EEPROM

    1 I2C协议简介 I2C通讯协议 Inter xff0d IntegratedCircuit 是由Phiilps公司开发的 xff0c 由于它引脚少 xff0c 硬件实现简单 xff0c 可扩展性强 xff0c 不需要USART CAN等
  • I2C调试工具

    1 I2C调试工具 i2c tools工具是开源I2C调试工具 xff0c 具有获取I2C总线挂载的设备列表及设备地址 xff0c 可对指定设备指定寄存器进行读写的功能 ubuntu安装 xff1a apt get install libi
  • I2C总线

    目录 1 硬件概述 1 1 常用器件 1 2 总线结构 1 3 工作原理 2 协议概述 2 1 传输格式 2 2 传输特点 2 3 读和写 2 4 时钟同步和总线仲裁 3 转换器概述 4 缓存器概述 1 硬件概述 1 1 常用器件
  • STM32设置为I2C从机

    硬件平台 STM32F401 编辑器 keil 5 18 操作系统 win7 一 I2C协议 在传输数据的时候 SDA线必须在时钟的高电平周期保持稳定 SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 起始和停止条件 SC
  • ESP8266如何使用u8g2(I2C)驱动SH1106的OLED

    u8g2是一款单色图形库 非常适合12864之类的显示屏 基本上支持了市面上的主流显示控制器 可是偏偏对SH1106不是那么友好 使用起来不是很方便 打开IDE的示例程序可以看到对SH1106列出来的几乎都SPI通信方式 仅仅只有一条是使用
  • Linux下CH452数码管芯片驱动调试(GPIO模拟I2C)

    1 设备连接 主控板处理器为Cortex A5处理器 内核4 9 0 主控板和CH452引脚定义如下表1 1所示 表1 1 主控板和CH452引脚定义 序号 CH452引脚定义 主控板引脚定义 1 SDA PB29 2 SCL PB30 3
  • 如何在 QEMU x86 上模拟 i2c 设备?

    我正在研究 QEMU 1 5 1 6 但还没有看到任何在 i2c 总线上添加设备的文档 有人可以帮忙吗 Thanks 好吧 没人对这个问题感兴趣 我发布我自己的解决方案 由于 QEMU 不支持 I2C 总线级数据传输 因此在将多点触摸数据从
  • 在 Raspberry Pi 上使用 Python smbus - 与语法混淆

    我正在尝试在 Raspberry Pi 上使用 python smbus 使用 I2C 与 MMA7660 加速计芯片进行通信 在下面的代码中 我正在读取芯片的寄存器 0x 00 0x01 0x02 和 0x03 并且我得到的值完全相同 查
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT

随机推荐