Linux设备树帮助(GPIO控制器/中断)

nig*_*udy 8 linux linux-device-driver linux-kernel gpio device-tree

我一直在学习Linux设备树,我们一直在尝试开始移植一些旧的代码来使用它们.我在使用gpio控制器节点时遇到了一些麻烦:

gpio1: gpio-controller@c00 {
    #gpio-cells = <2>;
    compatible = "cavium,octeon-3860-gpio";
    reg = <0xc00 0x100>;
    gpio-controller;
    /* Interrupts are specified by two parts:
     * 1) GPIO pin number (0..15)
     * 2) Triggering (1 - edge rising
     *                2 - edge falling
     *                4 - level active high
     *                8 - level active low)
     */
    interrupt-controller;
    interrupt-cells = <2>;
    interrupts = <0 24>, <1 25>, <2 26>, <3 27>;
Run Code Online (Sandbox Code Playgroud)

};

我正在尝试将某些IRQ映射到GPIO引脚,但是,看起来它只是将第一个<0 24> IRQ 24映射到gpio引脚0.我查看了源代码并且看起来它似乎无法进行交互'中断',虽然设备树绑定文本文件似乎暗示它将(devicetree/bindings/gpio/cavium-octeon-gpio.txt).有谁知道我如何将一些中断映射到不同的gpio引脚?

Jos*_*ton 5

平台之间的gpio处理仍然不是100%相同,因此,我将为您提供要点,您可能需要适应您的平台(查找使用相同或相似SoC的dts)。我的平台是Freescale imx.6这是它的要旨:

第一:单独保留gpio1节点。(它可能是在您从上游供应商处获得的dtsi中正确设置的)

第二:如果您希望.eg gpio 1 15成为中断,要消耗gpio中断的设备节点中为高电平有效,请添加

interrupt-parent = <&gpio1>;
interrupts = <15 IRQ_TYPE_LEVEL_HIGH>;
Run Code Online (Sandbox Code Playgroud)

例如:从arch / arm / boot / dts / imx6qdl-gw52xx.dtsi

touchscreen: egalax_ts@04 {
        compatible = "eeti,egalax_ts";
        reg = <0x04>;
        interrupt-parent = <&gpio7>;
        interrupts = <12 2>;
        wakeup-gpios = <&gpio7 12 GPIO_ACTIVE_LOW>;
};
Run Code Online (Sandbox Code Playgroud)


小智 1

我不熟悉你的机器,但如果你看这里:

https://elinux.org/Device_Tree_Usage#How_Interrupts_Work

您将看到中断说明符是针对定义它们的节点的中断控制器(即父中断控制器)的,而不是针对节点本身的。

由于您甚至没有显示在何处以及是否实际启用了中断(引脚、触发器),所以我假设您不知道这一点。

那么gpio1的中断控制器节点是什么样的呢?

它真的希望以(pin,irq)的形式从同一源接收多个中断吗?

例如,在 am335x 上,gpio1 上的所有中断都映射到 OMAP35 INTC 控制器上的特定索引,这意味着 gpio1 节点中仅定义了 1 个中断,向 INTC 发送 gpio1 上是否发生中断的信号。