Вопрос или проблема
Я работаю над встраиваемой системой 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 тщательно проверены, чтобы убедиться в правильности конфигурации.