Всем привет !
Имеется плата на Allwinner A40i на которой на uart4 подключеа микросхема rs485. Для переключения приема и передачи (RTS) используется отдельный пин процессора. Столкнулся со странным поведением uart приём происходит нормально, но при передаче первая отправка работает, пин автоматически поднимается, но после отправки не опускается. При этом порт виснет, ни приём ни передача не происходят. Если перезапустить приложение через которое отправляю данные, состояние rts не меняется, но можно отправлять данные, но так же один раз, а потом виснет. Долгое копание в исходниках драйвера порта и попытки отловить где проблема, привели к функции прерывания serial8250_handle_irq в файле linux/drivers/tty/serial/8250/8250_port.c. Если именно в начале или в конце прерывания вставить вывод в консоль любого текста, dev_err(port->dev, «Hello \n»); например, то все работает отлично, только консоль и логи забиваются сообщениями. Никак не могу понять в чем проблема. Зависание происходит в прерывании из-за функции spin_lock_irqsave(&port->lock, flags); Она почему-то уходит в deadlock. Вот настройка порта в dts.
&uart4 {
compatible = "snps,dw-apb-uart";
pinctrl-names = "default";
pinctrl-0 = <&uart4_ph_pins>;
status = "okay";
rts-gpios = <PH 13 GPIO_ACTIVE_HIGH>;
rs485-rts-delay = <0 0>;
rs485-rts-active-high;
linux,rs485-enabled-at-boot-time;
};
Ядро пробовал 6.0, 6.2, 6.4 сейчас 6.5.8. Не отсылайте в гугл, я был на его последней странице по данному вопросу, ничего не принесло результатов. Подскажите в чем проблема и как ее решить ?!