嵌入式Linux 设备树 GPIO详解 示例分析 三星 NXP RK

ops/2024/12/14 22:43:00/

GPIO设备树用于在Linux内核中定义与GPIO相关的硬件资源,它使操作系统可以识别、配置和使用GPIO引脚。设备树中通常会指定GPIO控制器的基地址、GPIO引脚的中断配置、时钟和其他相关信息。

目录

RK相关案例代码

NXP相关案例代码

三星相关案例代码

设备树中,GPI0控制器需要以下属性:

  1. gpio-controller 表示该节点是GPIO控制器。
  2. #gpio-cells 指定该控制器使用的cell数量。
  3. data-gpios 属性用于指定具体的GPIO引脚,如 <&gpio1 12 0>,表示选择GPIO1的第12个引脚,并设定特定的标志。

如下就是案例代码:

gpio0: gpio@fdd60e00 {compatible = "rockchip,gpio-bank";   // GPIO 控制器的兼容性字符串reg = <0xfdd66000 0x1000>;           // GPIO 控制器寄存器的基地址和大小interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; // GPIO中断配置,GIC_SPI代表中断类型clocks = <&pclk_gpio>, <&spnucru_dbclk_gpio9>; // 时钟源gpio-controller;                     // 声明这是一个GPIO控制器#gpio-cells = <2>;                   // 每个GPIO需要两个参数:第一个是GPIO编号,第二个是GPIO配置interrupt-controller;                // 该控制器是中断控制器#interrupt-cells = <2>;              // 每个中断需要两个参数:第一个是中断编号,第二个是中断配置pinctrl-names = "default";           // 引脚控制名称,通常为"default"pinctrl-0 = <&pinctrl_gpio0>;        // 引脚控制节点,指定哪些引脚属于该控制器
};pinctrl_gpio0: pinctrl@fdd60e00 {compatible = "rockchip,pinctrl";reg = <0xfdd60e00 0x1000>;          // 引脚控制器的寄存器地址pins = "gpio0", "gpio1", "gpio2";   // GPIO引脚function = "gpio";                  // 引脚的功能模式bias-pull-up;                       // 上拉电阻配置
};

RK相关案例代码

如下为BSP工程师提供的相关代码:

gpio0: qpio@fdd60e00 {compatible = "rockchip,gpio-bank";reg = <0xfdd66000 0x1000>;interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;clocks = <&pclk_gpio_g>, <&spnucru_dbclk_gpio9>;gpio-controller;#gpio-cells = <2>;gpios = <&pinctrl0032>;interrupt-controller;#interrupt-cells = <2>;
};
  • gpio0: qpio@fdd60e00

    • gpio0设备树节点的名称,用来表示该节点是 GPIO 控制器的配置。
    • qpio@fdd60e00 是该节点的设备地址(基地址),@ 后面是设备的物理地址或映射地址。这里表示的是 GPIO 控制器的寄存器区域,位于地址 0xfdd60e00
  • compatible = "rockchip,gpio-bank";

    • 这表示该硬件平台使用的是 Rockchip 的 GPIO 控制器,并且该节点与 Rockchip 的 gpio-bank 驱动兼容。这个字段帮助内核匹配适合的驱动程序。
  • reg = <0xfdd66000 0x1000>;

    • reg 定义了设备的寄存器基地址和大小,表示 GPIO 控制器的寄存器映射。
    • 0xfdd66000 是 GPIO 控制器寄存器的基地址,0x1000 是寄存器区块的大小,意味着这个区域的大小是 4KB。
  • interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了中断相关信息,指示设备如何通过中断进行通知。
    • GIC_SPI 33 表示这是一个来自 GIC (通用中断控制器) 的 SPI 类型中断,编号为 33。
    • IRQ_TYPE_LEVEL_HIGH 表示该中断是一个高电平触发的中断。
  • clocks = <&pclk_gpio_g>, <&spnucru_dbclk_gpio9>;

    • clocks 定义了该设备所需的时钟源,<&pclk_gpio_g><&spnucru_dbclk_gpio9>设备树中时钟节点的引用。具体的时钟节点需要在设备树的其他地方定义。
    • &pclk_gpio_g&spnucru_dbclk_gpio9 表示用于该 GPIO 控制器的时钟资源,它们通常会在其他设备树节点中定义。
  • gpio-controller;

    • 这个标识符声明该节点为一个 GPIO 控制器。它告诉内核该设备是用来控制 GPIO 引脚的。
  • #gpio-cells = <2>;

    • #gpio-cells 定义了每个 GPIO 引脚配置所需要的参数个数。这里 2 表示每个 GPIO 配置有两个单元:第一个是 GPIO 编号,第二个是引脚的配置(例如方向或电平)。
  • gpios = <&pinctrl0032>;

    • gpios 引用引脚控制器(pinctrl)的节点,<&pinctrl0032> 表示该 GPIO 控制器与 pinctrl0032 节点关联。
    • pinctrl 节点通常包含有关引脚的设置和配置(如电平、功能、方向等)。
  • interrupt-controller;

    • 该标识符表明该 GPIO 控制器节点不仅是 GPIO 控制器,还管理中断。即该控制器处理 GPIO 相关的中断。
  • #interrupt-cells = <2>;

    • #interrupt-cells 定义了中断配置所需的单元数。这里 2 表示每个中断配置需要两个参数:第一个是中断编号,第二个是中断配置(如触发方式)。

如下为开发人员所编写的设备树代码:

15x66: edl_ft5306@38 {status = "disabled";compatible = "edl,edl-ft5306";reg = <0x38>;touchscreen-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>;interrupts = <&gpio0 RK_PB6 IRQ_TYPE_LEVEL_HIGH>;reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;touchscreen-size-x = <8>;touchscreen-size-y = <1280>;touch-type = <1>;
};
  • 15x66: edl_ft5306@38

    • 15x66设备树节点的标签,通常是设备的名称或标识符,这里假设是硬件设备的标识。设备树标签用于内核和其他设备访问。
    • edl_ft5306@38 表示该设备是 edl-ft5306 触摸屏控制器,@38 是设备的地址,指示触摸屏控制器的地址为 0x38
  • status = "disabled";

    • status 设置为 "disabled",这意味着该设备当前是禁用的。若要启用设备,需要将其改为 "enabled"
  • compatible = "edl,edl-ft5306";

    • compatible 指定设备的兼容性标识符。内核通过该字段来匹配合适的驱动程序来支持此设备。这里 edl,edl-ft5306 是触摸屏控制器的标识符,意味着该设备使用 edl-ft5306 驱动。
  • reg = <0x38>;

    • reg 表示设备的寄存器地址,<0x38> 表示设备的地址为 0x38。这通常是设备的I2C或SPI地址。
  • touchscreen-gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>;

    • touchscreen-gpio 配置触摸屏的 GPIO 引脚。<&gpio0 RK_PB3 GPIO_ACTIVE_LOW> 表示该 GPIO 控制器 (gpio0) 的引脚 RK_PB3 被用于触摸屏操作,并且设置为 GPIO_ACTIVE_LOW,即低电平有效。
  • interrupts = <&gpio0 RK_PB6 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了设备的中断信息,指定触摸屏的中断由 gpio0 控制器的 RK_PB6 引脚提供,并且触发类型为 IRQ_TYPE_LEVEL_HIGH,即高电平触发中断。
  • reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>;

    • reset-gpios 配置了用于复位触摸屏的 GPIO 引脚。与触摸屏 GPIO 引脚相同,复位引脚 RK_PB6 设置为 GPIO_ACTIVE_LOW,即低电平有效。
  • touchscreen-size-x = <8>;

    • touchscreen-size-x 配置了触摸屏的 X 轴分辨率。在这里设置为 8,可能表示触摸屏横向的某些特定参数,通常是像素数或配置值(但通常触摸屏的分辨率应为更高的值,可能需要确认是否符合实际需求)。
  • touchscreen-size-y = <1280>;

    • touchscreen-size-y 配置了触摸屏的 Y 轴分辨率,设置为 1280,通常表示触摸屏纵向的像素数。
  • touch-type = <1>;

    • touch-type 设置为 1,这可能表示触摸屏的类型,例如:1 可能代表电容式触摸屏,其他值可能代表其他类型(如电阻式触摸屏)。具体值需根据硬件规格确认。

NXP相关案例代码

如下为BSP工程师的代码:

gpio1: gpiog8209ce00f {compatible = "fsl,imx6ul-gpio", "fsl,imx3s-gpio";reg = <0xe209c000 0x4000>;interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;gpio-controller;#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;
};
  • gpio1: gpiog8209ce00f

    • gpio1 是该设备节点的名称,表示这是一个名为 gpio1 的 GPIO 控制器节点。
    • gpiog8209ce00f 是设备的标签,通常表示硬件资源的描述或地址。这个标签不一定是常规的设备命名,具体可能依据硬件平台的实现来命名。您可能需要根据实际硬件进行调整。
  • compatible = "fsl,imx6ul-gpio", "fsl,imx3s-gpio";

    • compatible 字段指示该设备与哪些驱动程序兼容。在此,设备支持 Freescale (现 NXP) 的 imx6ul-gpioimx3s-gpio 驱动。这两个平台都使用类似的 GPIO 控制器,因此该字段包括两个兼容性标识符。
  • reg = <0xe209c000 0x4000>;

    • reg 表示设备的寄存器基地址及大小。这里基地址为 0xe209c000,寄存器大小为 0x4000,即 16KB。该设备的 GPIO 控制器寄存器区域映射到这个内存地址范围。
  • interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了与该 GPIO 控制器相关的中断。这里有两个中断,分别由 GIC (通用中断控制器) 的 SPI (共享外部中断) 66 和 67 触发。
    • IRQ_TYPE_LEVEL_HIGH 表示这些中断是高电平触发的。
  • gpio-controller;

    • 该节点表示一个 GPIO 控制器,表明这是一个控制 GPIO 引脚的硬件设备。
  • #gpio-cells = <2>;

    • #gpio-cells 定义了每个 GPIO 配置所需要的单元数。这里的值 2 表示每个 GPIO 配置需要两个参数:一个是 GPIO 编号,另一个是该 GPIO 的配置(如方向或电平)。
  • interrupt-controller;

    • 该节点声明自己也是一个中断控制器。意味着该 GPIO 控制器不仅控制 GPIO 引脚,还负责管理这些引脚的中断。
  • #interrupt-cells = <2>;

    • #interrupt-cells 定义了与中断相关的参数个数。这里的值 2 表示每个中断配置需要两个参数:一个是中断号,另一个是中断配置(例如触发类型)。

如下为开发工程师的代码编写:

edt_ft5x05838: edt-ft5x058@38 {compatible = "edt,edt-ft5366", "edt,edt-ft5xB6", "edt,edt-ft5406";pinctrl-names = "default";pinctrl-0 = <&pinctrl_scefault>;interrupt-parent = <&gpio1>;interrupts = <9 0 IRQ_TYPE_LEVEL_HIGH>;reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;status = "disabled";
};
  • edt_ft5x05838: edt-ft5x058@38

    • edt_ft5x05838 是该设备节点的标签,它表示一个触摸屏控制器。
    • edt-ft5x058@38 表示该设备的名称和地址,@38 表示设备的地址为 0x38,该地址通常是 I2C 或 SPI 总线上的地址。
  • compatible = "edt,edt-ft5366", "edt,edt-ft5xB6", "edt,edt-ft5406";

    • compatible 字段表示该设备兼容的驱动程序。这里列出了三个兼容的驱动程序(edt-ft5366, edt-ft5xB6, 和 edt-ft5406),它们代表了不同型号的触摸屏。
  • pinctrl-names = "default";

    • pinctrl-names 用来指定该设备使用的引脚控制配置的名称。"default" 表示使用默认的引脚控制配置。
  • pinctrl-0 = <&pinctrl_scefault>;

    • pinctrl-0 指定设备的引脚控制配置。&pinctrl_scefault 应该是指向一个引脚控制配置的引用,这个引用在设备树的其他地方定义。根据您的设备,它可能是某个预定义的引脚配置(例如触摸屏数据线的配置)。
  • interrupt-parent = <&gpio1>;

    • interrupt-parent 字段指定该设备中断的父控制器,这里是 gpio1,即通过 GPIO 控制器 1 触发中断。
  • interrupts = <9 0 IRQ_TYPE_LEVEL_HIGH>;

    • interrupts 配置了设备的中断信息。<9 0 IRQ_TYPE_LEVEL_HIGH> 表示设备的中断由 gpio1 控制器的 GPIO 引脚 9 提供,且触发方式为 IRQ_TYPE_LEVEL_HIGH,即高电平触发。
  • reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;

    • reset-gpios 配置了设备的复位引脚。这里设置了复位引脚为 gpio5 控制器的 GPIO 引脚 0,并且设置为 GPIO_ACTIVE_LOW,表示低电平有效。
  • irq-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;

    • irq-gpios 配置了设备的中断 GPIO 引脚。这里设置为 gpio1 控制器的 GPIO 引脚 9,且设置为 GPIO_ACTIVE_LOW,即低电平有效。
  • status = "disabled";

    • status = "disabled" 表示该设备当前被禁用。如果希望启用该设备,应将其更改为 enabled

三星相关案例代码

如下为BSP工程师相关代码:

gpio_c: gpioc {gpio-controller;#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;
};
  • gpio_c: gpioc

    • gpio_c 是该设备节点的标签,用于标识 GPIO 控制器。
    • gpioc 是设备的节点名称,表示这是一个 GPIO 控制器设备。
  • gpio-controller;

    • gpio-controller 表示这是一个 GPIO 控制器,负责管理 GPIO 引脚的输入输出。
  • #gpio-cells = <2>;

    • #gpio-cells 定义了每个 GPIO 配置所需要的单元数。这里的 2 表示每个 GPIO 配置需要两个参数:
      1. 一个是 GPIO 引脚编号。
      2. 另一个是该 GPIO 的配置(例如方向、激活电平等)。
  • interrupt-controller;

    • interrupt-controller 表示该节点同时也充当中断控制器的角色,管理 GPIO 引脚的中断。
  • #interrupt-cells = <2>;

    • #interrupt-cells 定义了每个中断配置所需要的单元数。这里的 2 表示每个中断配置需要两个参数:
      1. 一个是中断号。
      2. 另一个是中断配置(例如触发方式)。

如下为开发工程师编写的代码;

ft5x06: ft5x66838 {compatible = "cdt,edt-ft5406";reg = <0x30>;pinctrl-names = "default";pinctrl-0 = <&tsc2007 0>;interrupt-parent = <&gpio_c>;interrupts = <26 IRQ_TYPE_EDGE_FALLING>;#ifdef CONFIG_RGB1024X690pinctrl-0 = <&gt911>;interrupt-parent = <&gpio_b>;interrupts = <29 IRQ_TYPE_EDGE_FALLING>;#endif#ifdef CONFIG_LVDS_1024X768pinctrl-0 = <&gt911>;interrupt-parent = <&gpio_b>;interrupts = <29 IRQ_TYPE_EDGE_FALLING>;#endifreset-gpios = <&gpio_e 36 GPIO_ACTIVE_LOW>;
};
  • ft5x06: ft5x66838

    • ft5x06 是设备节点的标签。
    • ft5x66838 是设备的名称,表示该设备是 ft5x66838 型号的触摸屏控制器。
  • compatible = "cdt,edt-ft5406";

    • compatible 字段指示设备与哪些驱动程序兼容。这里指示设备支持 edt-ft5406 驱动。
  • reg = <0x30>;

    • reg 字段定义了设备的地址。此处 0x30 是设备的 I2C 地址。
  • pinctrl-names = "default";

    • pinctrl-names 字段指定设备的引脚控制名称,这里使用了 default
  • pinctrl-0 = <&tsc2007 0>;

    • pinctrl-0 配置了该设备的引脚控制。这里的 <&tsc2007 0> 是指向一个引脚控制配置的引用,这个引用可能在设备树的其他地方定义。
  • interrupt-parent = <&gpio_c>;

    • interrupt-parent 指定了中断的父控制器,这里为 gpio_c,即通过 GPIO 控制器 C 来管理中断。
  • interrupts = <26 IRQ_TYPE_EDGE_FALLING>;

    • interrupts 配置了设备的中断信息。26 是中断号,IRQ_TYPE_EDGE_FALLING 表示该中断是边缘触发,且是下降沿触发。
  • #ifdef CONFIG_RGB1024X690#endif

    • 这是条件编译指令,表示只有在配置中启用了 RGB1024X690 时,才会启用该部分的设备树配置。
    • 该部分配置了触摸屏的引脚控制和中断,且中断号为 29,触发方式是下降沿。
  • #ifdef CONFIG_LVDS_1024X768#endif

    • 同样是条件编译指令,表示只有在配置中启用了 LVDS_1024X768 时,才会启用该部分的设备树配置。
    • 该部分与 RGB1024X690 配置类似,设置了相同的引脚控制和中断。
  • reset-gpios = <&gpio_e 36 GPIO_ACTIVE_LOW>;

    • reset-gpios 配置了设备的复位引脚。这里使用 gpio_e 控制器的 GPIO 36 引脚,并且该引脚是低电平有效。


http://www.ppmy.cn/ops/141929.html

相关文章

【docker】12. Docker Volume(存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。 在宿主机上…

初识Linux · 网络基础

目录 前言&#xff1a; 初识协议 再识协议 局域网 跨网络传输 前言&#xff1a; 本文作为Linux网络学习的第一篇文章&#xff0c;相对来说概念还是偏多的&#xff0c;甚至于概念让人觉得晦涩&#xff0c;这是非常正常的&#xff0c;那么进入网络部分之前&#xff0c;我们…

2024年12月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 下列二进制表示的十进制数值分别是( ) [10000011]原=( ) [10000011]补=&#x

【Redis】redis的单线程模型为什么快?

Redis的单线程模型 对于redis来说&#xff0c;它最大的特点无非就是快&#xff0c;而我们又知道&#xff0c;redis是单线程模型&#xff0c;那么它为什么会快呢&#xff1f;首先我们说它快&#xff0c;肯定是有参照物的&#xff0c;这里一般是拿关系型数据库来进行对比&#xf…

springboot集成h2数据库并使用多数据源

前言 为了满足客户的需求&#xff0c;我们计划将项目中使用的MySQL数据库迁移至H2数据库。虽然项目已经集成了多数据源&#xff0c;理论上可以正常运作&#xff0c;但在实际操作过程中&#xff0c;我们发现项目启动时无法自动创建表。我们将对此问题进行深入分析&#xff0c;并…

Jenkins参数化构建详解(This project is parameterized)

本文详细介绍了Jenkins中不同类型的参数化构建方法&#xff0c;包括字符串、选项、多行文本、布尔值和git分支参数的配置&#xff0c;以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…

SpringBoot【十一】mybatis-plus实现多数据源配置,开箱即用!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 正常情况下我们在开发系统的时候都是使用一个数据源&#xff0c;但是由于有些项目同步数据的时候不想造成数据库io消耗压力过大&#xff0c;便会一个项目对应多个数据源…

CentOS7 安装Selenium(使用webdriver_manager自动安装ChromeDriver)

在 CentOS 7 上安装 Selenium 通常涉及几个步骤&#xff0c;包括安装 Python、安装 Selenium 库、安装 WebDriver 以及配置环境。以下是详细的步骤&#xff1a; 1. 安装 Python 和 pip 如果你的系统中还没有安装 Python 和 pip&#xff0c;可以使用以下命令进行安装&#xff…