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

    I2C具体内容参考资料 https blog csdn net sternlycore article details 85600668 https blog csdn net qq 43460068 article details 122
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • I2C驱动体系结构一:驱动软件概念与对应硬件的关系

    一 概念 xff1a 1 设备 xff1a struct device xff1a 该数据结构是对物理设备的软件抽象 xff0c 比如I2C slave xff08 对应i2c client xff09 和I2C 适配器 xff08 对应i
  • 基于I2C/SPI的温湿度采集与OLED显示

    基于I2C SPI的温湿度采集与OLED显示 一 AHT20温湿度采集1 I2C2 温湿度采集代码效果 二 OLED显示1 显示学号姓名2 诗句显示 三 总结四 参考 一 AHT20温湿度采集 1 I2C 解释什么是 软件I2C 和 硬件I
  • STM32 I2C_OLED显示汉字及屏幕滚动

    STM32 I2C OLED显示汉字及屏幕滚动 文章目录 STM32 I2C OLED显示汉字及屏幕滚动一 I2C以及AHT20温湿度传感器介绍二 用0 96寸OLED屏幕显示数据1 OLED介绍2 样例测试 三 汉字编码原理编码排序A0A
  • I2C调试工具

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

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • linux内核I2C子系统详解——看这一篇就够了

    1 I2C通信协议 参考博客 I2C通信协议详解和通信流程分析 2 通过KXTF9 2050芯片分析I2C协议 参考博客 通过KXTF9 2050芯片分析I2C协议 3 I2C子系统框架 1 I2C子系统分为三层 I2C核心层 I2C适配器
  • STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo

    STM32基础 BH1750 硬件 IIC 驱动程序 测试demo STM32CudeMx MDK ARM BH1750 简介 产品介绍 产品特点 测量程序步骤 指令集合结构 从 写指示 到 读出测量结果 的测量时序实例 STM32Cube
  • EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)

    1 前言 1 本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法 包含底层时序和读写的代码 2 大部分代码是EEPROM芯片通用的 但是其中关于某些时间的要求 是和具体芯片相关的 和主控芯片和外设芯片都有关系 需要具体分析
  • BH1750 传感器实战教学 —— 驱动移植篇

    前言 上一篇 BH1750 的实战教学我们说明的实际应用中传感器的硬件设计 BH1750 传感器实战教学 硬件设计篇 我们提到过在本次使用的芯片为 51 内核 I2C 通讯驱动实现与 STM32 上还是有很大区别的 对于我们来说 已经掌握了
  • 尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

    我遇到了问题 在启动通过 I2C 从 Arduino 请求数据的脚本时 python 有时会在我的 raspberry pi 3 上抛出这个 IOError 电气连接是完美的 所以这不是问题 此外 我在使用 i2cget y 1 0x04
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • docker 容器内的 I2C

    我正在尝试在 docker 容器内的树莓派上使用 i2c 引脚 我使用 RUN 安装所有模块 但是当我使用 CMD 运行我的 python 程序时 我收到一条错误消息 Trackback most recent call last file
  • 在 U-Boot 中使用 I2C 读取多个字节

    我的 Freescale p1022tw 板的 I2C 驱动程序有问题 U Boot 的控制台上有一个从 I2C 设备读取的命令 i2c md chip address 0 1 2 of objects 当我从 id 为 0x60 地址为
  • ADXL345 与 ESP32 I2C 垃圾值问题

    我已根据以下教程使用 I2C 接口将 ESP32 与 ADXL345 连接起来Tutorial http www esp32learning com code esp32 and adxl345 sensor example php 但是
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • 读取时不返回写入 I2C 的缓冲区

    我试图在写入后从 I2C 总线上的内存位置读取一个值 当我在终端中运行它时 我得到奇怪的输出 这是我的程序 include
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些

随机推荐