Параметр прерывания: конфигурация дерева устройств? - PullRequest
0 голосов
/ 05 ноября 2019

В настоящее время я пишу узел дерева устройств для настройки Двухканальный UART SCISIS752 с I2C, который подключен к адресу подчиненного устройства 0x4d . Я также использую часы 1,8432 МГц. Вывод IRQ SCISIS752 подключен к IO Expander GPIO, который в моем случае представляет собой gpiopin 456. Я использую Yocto для создания дистрибутива Linux. Моя версия ядра Linux 4.18.25-yocto-standard Моя конфигурация dts:

/dts-v1/;

#include "am33xx.dtsi"
#include "am335x-bone-common.dtsi"
#include "am335x-boneblack-common.dtsi"

/ {
model = "TI AM335x BeagleBone Black";
compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
};

&am33xx_pinmux {
    pinctrl-0 = <&gpio_pins>;
    i2c1_pins_default: i2c1_pins_default {
    pinctrl-single,pins = <
        AM33XX_IOPAD(0x984, PIN_INPUT_PULLUP | MUX_MODE3) /* (D15) uart1_txd.I2C1_SCL */
        AM33XX_IOPAD(0x980, PIN_INPUT_PULLUP | MUX_MODE3) /* (D16) uart1_rxd.I2C1_SDA */
    >;};

&i2c1 {
    pinctrl-names = "default";
    pinctrl-0 = <&i2c1_pins_default>;
    status = "okay";
    clock-frequency = <400000>;

pcf8574a_38: pcf8574a@38 {
    compatible = "nxp,pcf8574a";
    reg = <0x38>;
    gpio-controller;            
    #gpio-cells = <2>;         
    };
sc16is752@4d {
    compatible = "nxp,sc16is752";
    reg = <0x4d>; 
    clocks = <&sc16is752_clk>;
    interrupt-parent = <&gpio3>;
    interrupts = <7 2>; 
    gpio-controller;
    #gpio-cells = <2>;

    sc16is752_clk: sc16is752_clk {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <1843200>;
    };};
};

Я запутался в установке значений interrupt-parent и прерываний, чтобы эта конфигурация работала.

1 Ответ

1 голос
/ 06 ноября 2019

Я не вижу все ваше дерево устройств и не знаю, какое ядро ​​вы используете ... поэтому я не могу указать, где именно ваша проблема. Но я могу дать некоторые рекомендации по устранению неполадок ...

Во-первых, кажется, что вы скопировали свой узел из документации ядра в Documentation/devicetree/bindings/serial/nxp,sc16is7xx.txt. Это точка отсчета, но она просто предназначена для иллюстрации.

В дереве устройств нет ничего волшебного. Он анализируется драйверами в ядре для описания электрической конфигурации. Это означает, что в любое время, когда вы не уверены, как что-то работает, все, что вам нужно сделать, - это посмотреть на драйвер, чтобы увидеть, как он его анализирует.

У меня есть исходный код 4.19.0. Я нашел ваш драйвер NXP в drivers/tty/serial/sc16is7xx.c. Через совместимый список я подтвердил, что он поддерживает nxp,sc16is752.

Начните с зонда sc16is7xx_i2c_probe(), где вводится драйвер, и вы сразу увидите, что значение IRQ передается через структуру i2c_clientа затем установить с помощью вызова на devm_request_irq() в sc16is7xx_probe(). Это означает, что свойства DT прерывания не обрабатываются в этом драйвере. Они передаются ему.

Затем вам нужно прочитать: https://www.kernel.org/doc/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt, чтобы понять, как работают контроллеры прерываний. Ваш &gpio3 соответствует требованиям? Это настроено как контроллер прерывания? Это вообще существует?

...