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

绵阳专业网站建设遂宁建设机械网站

绵阳专业网站建设,遂宁建设机械网站,宜昌市城市建设学校网站,广州网站公司建设网站引言:在嵌入式 Linux 系统中,I2C(Inter-Integrated Circuit)是一种常用的通信协议,用于连接低速设备(如传感器、显示器、存储器等)与主控制器。I2C 系统驱动程序模型通过层次化的设计&#xff0…

引言:在嵌入式 Linux 系统中,I2C(Inter-Integrated Circuit)是一种常用的通信协议,用于连接低速设备(如传感器、显示器、存储器等)与主控制器。I2C 系统驱动程序模型通过层次化的设计,使得 I2C 总线设备和驱动程序能够高效、灵活地进行通信和管理。

本分析旨在详细介绍 I2C 驱动程序框架,重点分析其核心组成部分,如 i2c_driveri2c_client,以及 I2C 总线、设备和驱动程序的交互关系。

目录

1. I2C驱动程序的层次

3. I2C总线-设备-驱动模型

2.1 i2c_driver

2.2 i2c_client


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设备的节点

      • 如果I2C设备节点的compatible属性跟of_match_table的某项兼容,则匹配成功

    • i2c_client.name跟某个of_match_table[i].compatible值相同,则匹配成功

  • 使用id_table来判断

    • i2c_client.name跟某个id_table[i].name值相同,则匹配成功

i2c_driver跟i2c_client匹配成功后,就调用i2c_driver.probe函数。

可以观察上述的代码内容,也就是通过match来实现配对的。

上述我们任意拿一个IIC设备当例子,我们也可以看出之前分析的匹配结构。

2.2 i2c_client

其次就是这个结构体,是非常重要的,如下所示:

之前位于驱动屏的IIC驱动一文也讲过,重点是这个设备树会自动解析成I2C设备,

&i2c1 {status = "okay";ts@5d {compatible = "goodix,gt9xx";reg = <0x5d>;tp-size = <89>;max-x = <1280>;max-y = <800>;touch-gpio = <&gpio1 RK_PA0 IRQ_TYPE_LEVEL_LOW>;//复位引脚reset-gpio = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>;};
};

上述代码就是在 Linux 内核中,I2C_client 是用来表示一个通过 I2C 总线连接的设备的结构体。设备树描述了硬件设备的信息,而 I2C_client 是内核中用于管理这些设备的关键数据结构。当设备树加载时,内核会解析其中的硬件描述,并与相应的驱动程序进行匹配,自动生成并管理 I2C_client 结构体。

详细解释:

  1. 设备树与 I2C_client:在你的设备树片段中,ts@5d 节点描述了一个 I2C 设备,并且设置了设备的 I2C 地址(reg = <0x5d>)。当 Linux 内核启动时,它会读取设备树并识别出这个 I2C 设备(ts@5d)。内核会根据这个设备树节点生成一个 I2C_client 结构体。

  2. I2C_driver 和匹配:内核通过设备树中的 compatible 字段(在这个例子中是 goodix,gt9xx)来选择相应的驱动程序。在这种情况下,内核会找到与 goodix,gt9xx 匹配的 I2C 驱动(通常是 goodix_gt9xx 驱动),然后由内核调用该驱动的 probe() 函数进行设备初始化。

  3. 设备树与 I2C_client 关联I2C_driver 中的 probe() 函数会接收到一个 I2C_client 参数,这个参数就是内核在启动时为该设备(ts@5d)生成的 I2C_client 结构体。在 probe() 函数中,你可以获取设备的详细信息,并使用该结构体进行设备的进一步操作。

  4. I2C_client 的作用I2C_client 结构体包含了与 I2C 设备相关的信息,如设备的 I2C 地址、设备的父设备(I2C 控制器)、设备的驱动程序等。通过这个结构体,驱动可以与硬件进行交互。

过程简述:

  1. 内核启动时解析设备树,发现 ts@5d 节点,并识别出该设备是通过 I2C 总线连接的设备。
  2. 内核根据 compatible = "goodix,gt9xx" 字段,匹配到相应的驱动程序(例如 goodix_gt9xx)。
  3. 驱动的 probe() 函数被调用,并且设备信息被封装到 I2C_client 结构体中。
  4. 驱动通过 I2C_client 与硬件设备进行通信,并进行初始化操作。

&i2c1 是 I2C 总线的标识符

设备树中定义的 &i2c1 是一个对 I2C 总线的引用,它代表着 I2C 控制器硬件设备。通常,在设备树中,i2c1 是指特定的 I2C 总线,而 &i2c1 是用来告诉内核这个设备连接到哪一个 I2C 总线。它是 I2C 设备连接的父节点。通常,&i2c1 这样的标识符指向一个 I2C 控制器的节点,这个控制器的硬件资源会在设备树中被描述出来(例如,I2C 控制器的基地址、时钟等配置)。

ts@5d 节点描述了一个 I2C 设备

在你提供的设备树片段中,ts@5d 是一个 I2C 设备的子节点。它的 @5d 表示该设备的 I2C 地址为 0x5d(即通过 reg = <0x5d> 字段指定)。这个节点描述了一个具体的 I2C 设备,它与 &i2c1 连接,ts@5d 代表的设备将会通过 I2C 总线进行通信。

  • compatible 字段compatible = "goodix,gt9xx" 字段指定了该设备是 goodix,gt9xx 类型的触摸屏设备。内核会使用这个 compatible 字段来匹配驱动程序。例如,在内核中可能已经有一个与 "goodix,gt9xx" 兼容的驱动程序。

  • reg 字段reg = <0x5d> 指定了 I2C 地址,这告诉内核这个设备应该使用地址 0x5d 来进行通信。

自动注册为 I2C_client

内核根据设备树的内容和驱动程序之间的匹配机制,自动注册设备并为其创建 I2C_client 结构体。这个过程是通过 I2C_driver 实现的,具体流程如下:

  • I2C 总线设备的驱动程序匹配:内核在启动时会通过 compatible 字段查找与设备树节点匹配的驱动程序。例如,如果你在内核中定义了一个 I2C_driver,它的 of_match_table 中包含 "goodix,gt9xx",那么这个驱动就会被选中与设备树中的 ts@5d 设备节点匹配。

  • 设备创建 I2C_client:在设备树中,当节点 ts@5d 被解析时,内核会自动为该设备创建一个 I2C_client 结构体。这个结构体包含设备的 I2C 地址(0x5d)和与其相关的其他信息。

  • 驱动 probe 函数调用:内核通过 I2C_driverprobe() 函数来初始化设备。在 probe() 函数中,内核将 I2C_client 结构体传递给驱动程序,驱动程序可以使用这个结构体进行设备的初始化和数据交互。

通过I2C bus number来创建

int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len);

通过设备树来创建

	i2c1: i2c@400a0000 {/* ... master properties skipped ... */clock-frequency = <100000>;flash@50 {compatible = "atmel,24c256";reg = <0x50>;};pca9532: gpio@60 {compatible = "nxp,pca9532";gpio-controller;#gpio-cells = <2>;reg = <0x60>;};};

方法2 有时候无法知道该设备挂载哪个I2C bus下,无法知道它对应的I2C bus number。 但是可以通过其他方法知道对应的i2c_adapter结构体。 可以使用下面两个函数来创建i2c_client:

  • i2c_new_device

  static struct i2c_board_info sfe4001_hwmon_info = {I2C_BOARD_INFO("max6647", 0x4e),};int sfe4001_init(struct efx_nic *efx){(...)efx->board_info.hwmon_client =i2c_new_device(&efx->i2c_adap, &sfe4001_hwmon_info);(...)}

i2c_new_probed_device

  static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };static int usb_hcd_nxp_probe(struct platform_device *pdev){(...)struct i2c_adapter *i2c_adap;struct i2c_board_info i2c_info;(...)i2c_adap = i2c_get_adapter(2);memset(&i2c_info, 0, sizeof(struct i2c_board_info));strscpy(i2c_info.type, "isp1301_nxp", sizeof(i2c_info.type));isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info,normal_i2c, NULL);i2c_put_adapter(i2c_adap);(...)}

差别:

  • i2c_new_device:会创建i2c_client,即使该设备并不存在

  • i2c_new_probed_device:

    • 它成功的话,会创建i2c_client,并且表示这个设备肯定存在

    • I2C设备的地址可能发生变化,比如AT24C02的引脚A2A1A0电平不一样时,设备地址就不一样

    • 可以罗列出可能的地址

    • i2c_new_probed_device使用这些地址判断设备是否存在

  • 方法3(不推荐):由i2c_driver.detect函数来判断是否有对应的I2C设备并生成i2c_client

  • 方法4:通过用户空间(user-space)生成 调试时、或者不方便通过代码明确地生成i2c_client时,可以通过用户空间来生成。

  // 创建一个i2c_client, .name = "eeprom", .addr=0x50, .adapter是i2c-3# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device// 删除一个i2c_client# echo 0x50 > /sys/bus/i2c/devices/i2c-3/delete_device
http://www.yayakq.cn/news/646413/

相关文章:

  • 广东建设工程信息网站6怎么推广淘宝店铺
  • 网站建设要域名和什么科目网站做淘客
  • 学校网站建设的流程交友app开发多少钱
  • 进入网站后台代码网站怎么添加广告代码
  • 外包做网站哪家好wordpress内容模版文件在哪个目录
  • 江西省建设监理网站网站建设的活怎么接
  • 工程信息网站有哪些广州黄埔网站建设公司
  • 做商城的网站程序如何自己创建网站
  • asp网站建设技术方案企业网站开发的公司
  • 网站制作怎么把网站交付专门制作小程序的公司
  • 摄影logo设计外贸seo推广方法
  • 网站ipv6改造怎么做 网页代码中国建设网官网首页
  • jsp网站开发与数据库连接免费做二维码网站
  • 旅行社网站建设规划山东省住房和建设厅注册中心网站
  • 找在家做的兼职上什么网站好北京搭建工厂
  • 饮料网站建设价格免费制作海报的app
  • asp网站开发国内外现状微信微博网站建设意见书
  • 北京怎样在社保网站上做减员把自己做的网站进行app封包
  • 机电建设有限公司网站乐陵森大
  • 上海网站开发学校有哪些阳江房产网签数据
  • 快速seo整站优化排行网页版攻速传奇
  • wordpress 截断插件站群seo技巧
  • 哪些外国购物网站可以做中铁建设集团有限公司招标网
  • 广州网站建设小程序做物流哪个网站推广效果好
  • 网站开发背景意义技术支持 中山网站建设
  • 网站动效是代码做的吗标准网站建设价格
  • 重庆做网站微信的公司动画设计专业大学排名国内
  • 移动端网站开发软件wordpress 小米主题制作
  • 红河北京网站建设商城网站结算页面怎么做
  • 2021国内最好用免费建站系统wordpress页面缓慢