TP驱动——I2C驱动,细节分析——dts设备树

这篇具有很好参考价值的文章主要介绍了TP驱动——I2C驱动,细节分析——dts设备树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.小序

TP驱动程序,是指带屏幕设备的触屏功能调用的驱动程序。TP外设与主板之间的关系如下框图:
TP驱动——I2C驱动,细节分析——dts设备树
产品常用的屏幕单元为液晶显示屏幕,TP的触摸功能也是一同集成到一起的,通过控制芯片以及外围电路、i2c总线与主板进行通信。

TP驱动的功能逻辑:

  • 当有触点发生时,TP芯片向主板传递中断信号
  • 驱动在收到中断后,调用驱动的中断处理函数
  • 中断处理函数中,唤醒触点处理线程
  • 处理线程通过 i2c 读取TP-IC内寄存器里的数据并处理

2.module_init之后的流程

TP驱动——I2C驱动,细节分析——dts设备树
此处在添加TP-I2C驱动,通过driver来匹配device中的 compatible 来识别dts 设备树中的节点。
我们通过一段地址跟踪来看TP-I2C driver的添加过程。
TP驱动——I2C驱动,细节分析——dts设备树
通过 i2c_add_driver() 函数调用到 i2c 驱动中 i2c_register_driver() ,使用的是TP外设中定义的tpd_i2c_driver->driver,在添加 i2c 驱动过程中match对应的device

static struct i2c_driver tpd_i2c_driver = {
	.driver = {
 		.name = "gt9xx",
#ifdef CONFIG_OF
        .of_match_table = of_match_ptr(gt9xx_dt_match),
#endif
     },
	.probe = tpd_i2c_probe,
    .remove = tpd_i2c_remove,
    .detect = tpd_i2c_detect,
    .id_table = tpd_i2c_id,
    .address_list = (const unsigned short *) forces,
};

tpd_i2c_driver->driver中的 “.of_match_table = of_match_ptr(gt9xx_dt_match), ” 这一行根据驱动中的定义

static const struct of_device_id gt9xx_dt_match[] = { {.compatible = “mediatek,goodix_touch”}, {},};

对应dts中i2c节点内子节点的 compatiable 信息。

3 获取对应pin信息

devm_pinctrl_get() 是Linux内获取对应节点内pin信息的函数,通过打印日志可以看到,在添加外设的 i2c_driver 时,触发此函数获取dits中的pin信息。调用函数如日志中一般,详细过程可跟Linux源码分析,此处详细说一下与dts有关的设置。
首先看一下dts中的内容,以下是 第 一 种 情 况 \color{#FF3030}{第一种情况}

&i2c0 {
    status = "okay";
    goodix_touch@5d {
        pinctrl-names = "default", "sleep";
	    pinctrl-0 = <&i2c0_pins>;
	    pinctrl-1 = <&i2c0_pins_sleep>;
        compatible = "mediatek,goodix_touch";
        reg = <0x5d>;
        status = "okay" ;
        interrupt-parent = <&pio>;
        interrupts = <0 IRQ_TYPE_EDGE_FALLING 0 0>;
        int-gpio = <&pio 0 0>;
        rst-gpio = <&pio 174 0>;
    };
};

这些pin信息
pinctrl-names = “default”, “sleep”;
pinctrl-0 = <&i2c0_pins>;
pinctrl-1 = <&i2c0_pins_sleep>;
是定义在对应外设TP节点内部,因此在外设添加 i2c_driver 时,匹配到对应 device 后,打印出 dev_name 信息为 0-005d。
内核的 i2c 驱动加载时,i2c0总线打印的dev_name 则为11007000@i2c0

以下是 第 二 种 情 况 \color{#FF3030}{第二种情况}

&i2c0 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&i2c0_pins>;
    pinctrl-1 = <&i2c0_pins_sleep>;
    status = "okay";
    goodix_touch@5d {
        compatible = "mediatek,goodix_touch";
        reg = <0x5d>;
        status = "okay" ;
        interrupt-parent = <&pio>;
        interrupts = <0 IRQ_TYPE_EDGE_FALLING 0 0>;
        int-gpio = <&pio 0 0>;
        rst-gpio = <&pio 174 0>;
    };
};

pinctrl-names = “default”, “sleep”;
pinctrl-0 = <&i2c0_pins>;
pinctrl-1 = <&i2c0_pins_sleep>;
这些pin信息的定义是在 i2c0节点下的,因此在 i2c 驱动加载时,匹配i2c的compatible信息获取此处的pinctrl信息。打印的log如下
TP驱动——I2C驱动,细节分析——dts设备树
1、是i2c驱动的入口处;
2、是i2c驱动的driver地址,对照6处,i2c-0和i2c-1是先后加载到内核中的,他们在dts中有一样的compatible;
3、依次匹配的device节点,dev_name是设备树节点的name;
4、把dts中,i2c0节点下的 pinctrl 信息绑定到此处,此处可以用作对i2c0总线的操作;如果某外设要自身操作,参考上面第一种情况。
5、由于绑定的是总线driver,直接调用drv->probe。如果是外设添加driver,则首先调用总线probe,再调用drv->probe。

3.1 小注

Q:通过dts添加的pinctrl信息,将i2c的SDA和SCL两根线上下电
A:在dts中添加pinctrl信息后,如果采用第二种情况,对i2c总线整体操作,效果不生效,可能是probe中没有将pinctrl信息获取。是否欠缺此处代码。
TP驱动——I2C驱动,细节分析——dts设备树文章来源地址https://www.toymoban.com/news/detail-442127.html

到了这里,关于TP驱动——I2C驱动,细节分析——dts设备树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux i2c驱动开发之最简单入门:设备树与驱动的匹配

    1在设备树中声明我们的模拟I2C设备: i2c的设备加入是必须放在某个i2c的总线下面的,我们这里是放在 i2c7下面。 可以直接在设备树搜索i2c7,然后把status 修改为okay,然后再加入设备信息. 这里我们指定和驱动匹配的字符串是 myi2c-dev,在bus segment 上分配的地址是 0x70 。 当然这

    2024年02月16日
    浏览(49)
  • linux-2.6.22.6内核i2c驱动框架源码分析

    i2c是常见的通信协议,协议比较简单,只有数据和时钟两条线(SDA和SCL),i2c的通信分为主机和从机,主机一般占主导地位,从机可以有多个。 i2c通信的数据格式为(SDA上的数据):开始的7位里面指定了设备地址(因为有多个从机),第8位是读或写信号,表示此次传输是读还

    2024年02月11日
    浏览(52)
  • I2C知识大全系列四 —— I2C驱动之Linux下的I2C

    Linux 系统定义了 I2C 驱动体系结构。在 Linux 系统中, I2C 驱动由三部分组成,即 I2C 核心 、 I2C 总线驱动 和 I2C 设备驱动 。这三部分相互协作,形成了非常通用、可适应性很强的 I2C 框架。 I2C核心 I2C 核心提供了 I2C 总线驱动 和 设备驱动 的 注册 、 注销方法 , I2C 通信方法

    2024年02月07日
    浏览(58)
  • 设备树解析 & i2c设备模型

    目录 1、基础概念 1、总线 2、手机启动流程 1、MTK启动流程 2、高通启动流程的差别 3、设备树解析 1、设备树相关 2、设备树解析 4、 i2c 设备初始化流程 1、总线 总线是连接多个设备或者接入点的数据传输通路。 老的电脑主机的都有PCI插槽类似现在的内存条,可以插声卡、网

    2024年02月03日
    浏览(37)
  • 详解UART、I2C、SPI常用通信协议(全是细节)

            UART、I2C和SPI是我们在嵌入式开发中比较常见的通信协议了,没有最好的通信协议,每个通信协议都有自己的优缺点。如果想要通信速度快,SPI 将是理想的选择;如果用户想要连接多个设备而不是过于复杂,I2C 将是理想的选择,因为它最多可以连接 127 个设备并且易

    2024年02月15日
    浏览(40)
  • I2C总线驱动

    SOC芯片平台的外设分为: 一级外设:外设控制器集成在SOC芯片内部 二级外设:外设控制器由另一块芯片负责,通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit: 字面意思是用于“集成电路之间”的通信总线,简写:IIC(或者I2C) i2c传输的要点就是: 传输一个字节 后面必然

    2024年02月15日
    浏览(42)
  • 什么是I2C,I2C怎么用,从实例波形分析I2C读写

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 今天分享的主题是I2C通信。接下来从I2C是什么,怎么用,以及以时钟外设读写作为实例进行分析。 I2C(Inter-Integrated Circuit) ,也可以叫IIC、I2C,译作集成电路总线,是 两线式串行通信总线 ,用于设备

    2024年01月19日
    浏览(58)
  • Linux I2C 驱动实验

    目录 一、Linux I2C 驱动简介 1、I2C 总线驱动 2、I2C 设备驱动 1、 i2c_client 结构体 2、 i2c_driver 结构体 二、硬件分析 三、设备树编写 1、pinctrl_i2c1 2、在 i2c1 节点追加 ap3216c 子节点 3、验证 四、 代码编写 1、makefile 2、ap3216c.h  3、ap3216c.c ①、头文件 ②、驱动出入口  ③、 i2c驱动

    2024年02月08日
    浏览(54)
  • alsa音频pcm设备之i2c调试

    i2cdetect 列举 I2C bus i2cdetect -l ls /dev/i2c* 列出I2C bus i2c-7 上面连接的所有设备,并得到i2c设备地址 i2cdetect -y 7 发现i2c设备的位置显示为UU或表示设备地址的数值,UU表示设备在driver中被使用. I2cdump i2c设备大量register的值 i2cdump -y 7 0x40 I2cset设置i2c设备某个register的值 i2cset -y 7 0x40 0x0

    2024年02月08日
    浏览(39)
  • Hi3861 硬件 i2c 驱动 oled

    最近想用 3861 做个有意思的东西,记录一下开发过程。今天使用 3861 的硬件 i2c 驱动 oled。 硬件平台:Bearpi-Nano 软件SDK:润和sdk 我之前写过一篇基于 stm32cubemx 快速使用 iic 接口 oled 的过程,里面有现成的 oled 接口,我们只要直接拿过来替换掉底层接口就行。  STM32CubeMX驱动4脚

    2023年04月23日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包