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

时间:2014-05-06 12:28:47

标签: linux linux-kernel linux-device-driver 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>;

};

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

2 个答案:

答案 0 :(得分:4)

gpio处理在平台之间仍然不是100%相同,所以我将给出你的要点,你可能需要适应你的平台(找到使用相同或类似SoC的dts)。 我的平台是飞思卡尔imx.6 这是它的要点:

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

第二: 如果你想要.e.g。 gpio 1 15是一个中断,高电平有效 在要使用gpio中断的设备节点中,添加

interrupt-parent = <&gpio1>;
interrupts = <15 IRQ_TYPE_LEVEL_HIGH>;

例如:from 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>;
};

答案 1 :(得分:1)

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

http://www.devicetree.org/Device_Tree_Usage#How_Interrupts_Work

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

由于您甚至没有显示实际启用中断的位置(引脚,触发器), 我假设你不知道这一点。

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

它真的希望从表格(pin,irq)中的同一来源接收多个中断吗?

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