После передачи через UART<->485 необходимо быстро переключить на приём 485 интефейс, но я не знаю когда байты выданые мной в буфер UARTа все уйдут. Комада tcdrain ожидающая конца передачи похоже квантована по 20 мс (срабатывает через 20,40,60 мс после начала передачи) - за это время отвечающее устройство уже давно выдаст ответ.
Мне надо чтоб после посленего байта почти сразу -1мс переключиться - как быть?
С самого начала не совсем совпадает содержимое драйверов
того что по ссылке и того что у меня
попробовал просто заменить весь файл - вот результат
rivers/tty/serial/imx.c: In function ‘imx_stop_tx’:
drivers/tty/serial/imx.c:372:10: error: ‘struct uart_port’ has no member named ‘rs485’
if (port->rs485.flags & SER_RS485_ENABLED &&
^
drivers/tty/serial/imx.c:375:11: error: ‘struct uart_port’ has no member named ‘rs485’
if (port->rs485.flags & SER_RS485_RTS_AFTER_SEND)
^
drivers/tty/serial/imx.c: In function ‘imx_start_tx’:
drivers/tty/serial/imx.c:578:10: error: ‘struct uart_port’ has no member named ‘rs485’
if (port->rs485.flags & SER_RS485_ENABLED) {
^
drivers/tty/serial/imx.c:581:11: error: ‘struct uart_port’ has no member named ‘rs485’
if (port->rs485.flags & SER_RS485_RTS_ON_SEND)
^
drivers/tty/serial/imx.c: In function ‘imx_set_mctrl’:
drivers/tty/serial/imx.c:819:12: error: ‘struct uart_port’ has no member named ‘rs485’
if (!(port->rs485.flags & SER_RS485_ENABLED)) {
^
drivers/tty/serial/imx.c: In function ‘imx_set_termios’:
drivers/tty/serial/imx.c:1301:12: error: ‘struct uart_port’ has no member named ‘rs485’
if (port->rs485.flags & SER_RS485_ENABLED)
^
drivers/tty/serial/imx.c:1307:15: error: ‘struct uart_port’ has no member named ‘rs485’
if (!(port->rs485.flags &
^
drivers/tty/serial/imx.c:1301:7: warning: suggest explicit braces to avoid ambiguous ‘else’ [-Wparentheses]
if (port->rs485.flags & SER_RS485_ENABLED)
^
drivers/tty/serial/imx.c:1316:17: error: ‘struct uart_port’ has no member named ‘rs485’
} else if (port->rs485.flags & SER_RS485_ENABLED)
^
drivers/tty/serial/imx.c:1318:13: error: ‘struct uart_port’ has no member named ‘rs485’
if (!(port->rs485.flags & SER_RS485_RTS_AFTER_SEND))
^
drivers/tty/serial/imx.c: In function ‘imx_rs485_config’:
drivers/tty/serial/imx.c:1568:6: error: ‘struct uart_port’ has no member named ‘rs485’
port->rs485 = *rs485conf;
^
drivers/tty/serial/imx.c: In function ‘serial_imx_probe’:
drivers/tty/serial/imx.c:1930:13: error: ‘struct uart_port’ has no member named ‘rs485_config’
sport->port.rs485_config = imx_rs485_config;
^
drivers/tty/serial/imx.c:1931:13: error: ‘struct uart_port’ has no member named ‘rs485’
sport->port.rs485.flags =
^
scripts/Makefile.build:308: recipe for target 'drivers/tty/serial/imx.o' failed
make[4]: *** [drivers/tty/serial/imx.o] Error 1
Мне бы просто узнать когда закончилась передача - говорят можно организовать loopback - типа получать на rx эхо того что выдаю на tx. Но можно ли такое без аппаратной доработки.
Хорошо бы конечно поправить драйвер, но как??
то как вы хотите сделать работать может и будет но крайне ненадежно, Linux не RTOS - нет никакой гарантии через какое время пользовательский код получает управление и неизвестно когда и на какое время его прерывает планировщик. Более-менее надежно переключать трансмиттер можно только в обработчике прерывания
Понятно.
Где бы тогда взять определение этой структуры.
И я не понимаю как драйверу сказать что я хочу переключиться на приём или передачу из пользовательского приложения?
Я же не могу писать в эту структуру напрямую ... или могу?
Или он автоматически переключается на прием когда буфер передачи пуст?
Ух ты скомпилировалось - в serial_core пришлось добавить 2 поля.
А как сказать драйверу чтоб он использовал определённый UART в режиме RS485 из пользовательского приложения?
Подскажите пожалуйста..