Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
Запускаю UART : tcdrain отрабатывает поздно
Wad1970
Добавлено 18.05.2015 15:27
0
Сообщение: 1
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
После передачи через UART<->485 необходимо быстро переключить на приём 485 интефейс, но я не знаю когда байты выданые мной в буфер UARTа все уйдут. Комада tcdrain ожидающая конца передачи похоже квантована по 20 мс (срабатывает через 20,40,60 мс после начала передачи) - за это время отвечающее устройство уже давно выдаст ответ.
Мне надо чтоб после посленего байта почти сразу -1мс переключиться - как быть?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 18.05.2015 19:11 Редактировалось 18.05.2015 19:29 Сообщение: 2
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Надо дописывать драйвер UART-а, посмотрите тут

https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/drivers/tty/serial/imx.c?id=17b8f2a
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 20.05.2015 14:40 Сообщение: 3
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
С самого начала не совсем совпадает содержимое драйверов
того что по ссылке и того что у меня
попробовал просто заменить весь файл - вот результат

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. Но можно ли такое без аппаратной доработки.
Хорошо бы конечно поправить драйвер, но как??
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 20.05.2015 14:51 Сообщение: 4
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
Кстати вариант (a) без 485 скомпилировался.
Надо видно где то структуру RS485 определить.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 20.05.2015 20:27 Редактировалось 20.05.2015 20:29 Сообщение: 5
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата

Мне бы просто узнать когда закончилась передача


то как вы хотите сделать работать может и будет но крайне ненадежно, Linux не RTOS - нет никакой гарантии через какое время пользовательский код получает управление и неизвестно когда и на какое время его прерывает планировщик. Более-менее надежно переключать трансмиттер можно только в обработчике прерывания
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 21.05.2015 07:28 Редактировалось 21.05.2015 07:35 Сообщение: 6
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
Понятно.
Где бы тогда взять определение этой структуры.
И я не понимаю как драйверу сказать что я хочу переключиться на приём или передачу из пользовательского приложения?
Я же не могу писать в эту структуру напрямую ... или могу?
Или он автоматически переключается на прием когда буфер передачи пуст?
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 22.05.2015 10:30 Сообщение: 7
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
Ух ты скомпилировалось - в serial_core пришлось добавить 2 поля.
А как сказать драйверу чтоб он использовал определённый UART в режиме RS485 из пользовательского приложения?
Подскажите пожалуйста..
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 22.05.2015 11:12 Редактировалось 22.05.2015 11:18 Сообщение: 8
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Напоминаю - в исходниках ядра есть документация и ее очень полезно смотреть в первую очередь

https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/Documentation/serial/serial-rs485.txt?id=17b8f2a

https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/Documentation/devicetree/bindings/serial/rs485.txt?id=17b8f2a

еще напомню на всякий случай - чтобы какой-то пин заработал, его надо прописать в DTS (по умолчанию RTS/CTS не используются на местных ядрах)
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 22.05.2015 13:09 Сообщение: 9
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
Спасибо, уже смотрю..
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 22.05.2015 13:38 Сообщение: 10
Wad1970
5

Пункты: 3734
Регистрация: 24.11.2014
Почти всё ясно.
Одно осталось.
В dtsi uart1 описан так:

uart1 {
pinctrl_uart1_oem: uart1-oem {
fsl,pins = <
MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
>;
};
};

...
...
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1_oem>;
status = "okay";
};

А где ему указать какую ногу дергать для передачи?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux