Справка по дереву устройств Linux (контроллер GPIO / прерывания)

Я изучаю деревья устройств 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?


person nigp4w rudy    schedule 06.05.2014    source источник


Ответы (2)


Обработка gpio по-прежнему не на 100% одинакова для разных платформ, поэтому я дам вам ее суть, и вам, возможно, придется адаптироваться к вашей платформе (найдите dts, который использует такой же или аналогичный SoC). Моя платформа - Freescale imx.6 Вот ее суть:

Во-первых: оставьте узел gpio1 в покое. (Вероятно, он правильно настроен в dtsi, который вы получили от поставщика восходящего потока)

Во-вторых: если вы хотите. 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>;
};
person Joshua Clayton    schedule 05.01.2015

Я не знаком с вашей машиной, но если вы посмотрите сюда:

https://elinux.org/Device_Tree_Usage#How_Interrupts_Work

вы увидите, что спецификаторы прерывания предназначены для контроллера прерываний узла, в котором они определены (то есть родительского контроллера прерываний), а не для самого узла.

Поскольку вы даже не показываете, где и если вы действительно включаете прерывание (вывод, триггер), я предполагаю, что вы этого не знали.

Так как же выглядит узел контроллера прерывания gpio1?

Действительно ли ожидается получение нескольких прерываний от одного и того же источника в форме (pin, irq)?

Например, на am335x все прерывания на gpio1 отображаются на определенный индекс на контроллере OMAP35 INTC, что означает, что в узле gpio1 определено только 1 прерывание, сигнализирующее INTC о том, произошло ли прерывание на gpio1.

person user3760778    schedule 25.06.2014