Не удалось использовать pinctrl/pinmux при мультиплексировании портов

Вопрос или проблема

Я работаю над встраиваемой системой Linux (ядро-5.10.24) и теперь хочу настроить UART-порт (с RXD/TXD/RTS/CTS) из 2 групп GPIO.

DTS настроен следующим образом,

&pinctrl {
    uart0_pin: uart0-pin {
        uart0_test_porta: uart0-test-porta {
            rvsoc,pinmux = <&gpio_a 3 4>;
            rvsoc,pinmux-funcsel = <PINCTL_FUNC1>;
        };
        uart0_test_portc: uart0-test-portc {
            rvsoc,pinmux = <&gpio_c 0 1>;
            rvsoc,pinmux-funcsel = <PINCTL_FUNC1>;
        };
    };
};

&uart0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_test_porta>;
    pinctrl-1 = <&uart0_test_portc>;
};

С вышеуказанными настройками я обнаружил, что только PORTA настроен для работы в режиме UART, но PORTC не настроен соответственно.

Есть ли что-то неправильное в моем DTS, и как я могу заставить PORTA и PORTC работать вместе как один 4-проводной UART?

Ответ или решение

Настройка интерфейсов UART в системах встраиваемого Linux, особенно при использовании таких версий, как ядро 5.10.24, может быть непростой задачей, особенно если вы пытаетесь объединить пины из разных групп GPIO. Вы описали ситуацию, в которой только PORTA успешно работает в режиме UART, тогда как PORTC не конфигурируется должным образом. Давайте рассмотрим возможные причины и шаги для решения проблемы.

Анализ описания устройства (DTS)

Ваша текущая конфигурация DTS может содержать синтаксическую ошибку или проблему с настройкой функциональности пинов, вследствие чего PORTC некорректно конфигурируется. Ваш DTS включает следующие разделы:

&pinctrl {
    uart0_pin: uart0-pin {
        uart0_test_porta: uart0-test-porta {
            rvsoc,pinmux = <&gpio_a 3 4>;
            rvsoc,pinmux-funcsel = <PINCTL_FUNC1>;
        };
        uart0_test_portc: uart0-test-portc {
            rvsoc,pinmux = <&gpio_c 0 1>;
            rvsoc,pinmux-funcsel = <PINCTL_FUNC1>;
        };
    };
};

&uart0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_test_porta>;
    pinctrl-1 = <&uart0_test_portc>;
};

Основная проблема заключается в том, что вы определили два буфера pinctrl для интерфейса UART, но в вашем &uart0 секции вы присвоили первым использованием pinctrl-0, а затем pinctrl-1. Обычной практикой является использование единственного буфера pinctrl, который комбинирует все необходимые пины для UART.

Рекомендации по решению проблемы

  • Объединение Пинов: В создаваемом вами pinctrl узле определите один набор пинов для всех используемых GPIO. Это может выглядеть так:
&pinctrl {
    uart0_pin: uart0-pin {
        uart0_combined_port: uart0-combined-port {
            rvsoc,pinmux = <&gpio_a 3>, <&gpio_a 4>, <&gpio_c 0>, <&gpio_c 1>;
            rvsoc,pinmux-funcsel = <PINCTL_FUNC1>;
        };
    };
};

&uart0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart0_combined_port>;
};
  • Проверка совместимости функций: Убедитесь, что выбранные GPIO-пины поддерживают необходимую функциональность UART. Это можно проверить в технических характеристиках вашего маршрутизатора или чипа.
  • Журнал ошибок UART: Проверьте вывод журнала системы с использованием dmesg на наличие сообщений об ошибках, связанных с UART, которые могут дать больше подсказок о проблеме.
  • Документация по для вашей платформы: Необходимо ознакомиться с документацией по вашей платформе, так как требования к настройке пин может различаться в зависимости от модели и сборки.

Располагая этой информацией, вы сможете сделать значительные шаги к успешной конфигурации UHDART интерфейса через комбинированные GPIO-пины. Убедитесь, что все модификации DTS тщательно проверены, чтобы убедиться в правильности конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...