10

私は 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 ピンにマップしようとしていますが、最初の <0 24> IRQ 24 を gpio ピン 0 にマップするのはこれまでだけのようです。ただし、デバイス ツリー バインディング テキスト ファイルは、それが行われることを示唆しているようです (devicetree/bindings/gpio/cavium-octeon-gpio.txt)。少数の割り込みを異なるgpioピンにマップする方法を知っている人はいますか?

4

2 に答える 2

6

gpio の処理はプラットフォーム間でまだ 100% 同じではないため、要点を説明します。プラットフォームに適応する必要がある場合があります (同じまたは類似の SoC を使用する dts を見つけてください)。私のプラットフォームは Freescale imx.6 です。

最初: gpio1 ノードをそのままにしておきます。(アップストリーム ベンダーから取得した dtsi で正しく設定されている可能性があります)

2 番目: .eg gpio 1 15 を割り込みにしたい場合は、gpio 割り込みを消費したいデバイス ノードでアクティブ ハイを追加します。

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

例: 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>;
};
于 2015-01-05T18:05:47.360 に答える
1

私はあなたのマシンに詳しくありませんが、ここを見れば:

https://elinux.org/Device_Tree_Usage#How_Interrupts_Work

割り込み指定子は、それらが定義されているノード (つまり、親割り込みコントローラー) の割り込みコントローラー用であり、ノード自体用ではないことがわかります。

割り込み(ピン、トリガー)を実際に有効にする場所と場合も示していないため、これを知らなかったと思います。

では、gpio1 の割り込みコントローラー ノードはどのようなものでしょうか?

(pin、irq) の形式で同じソースから複数の割り込みを受け取ることを本当に期待していますか?

たとえば、am335x では、gpio1 のすべての割り込みが OMAP35 INTC コントローラーの特定のインデックスにマップされます。つまり、gpio1 ノードで 1 つの割り込みのみが定義され、gpio1 で割り込みが発生したかどうかを INTC に通知します。

于 2014-06-25T14:04:39.720 に答える