Ядро 4.1.15, вендорское в составе Buildroot.
Упрощенная схема (не показаны преобразователи уровня 3.3V <-> 5V)
В *.dts файле соответствующей платы
&uart2 {pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
fsl,uart-has-rtscts;
linux,rs485-enabled-at-boot-time;
status = "okay";
};
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_UART2_CTS_B__UART2_DCE_CTS 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1
>;
1. То что сигнал RTS не объявлен, не страшно, он нам не нужен и может быть использован для любых других нужд (как GPIO, например)
2. Порт в режиме DCE
И наложить патч:
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.cindex 63110b1..83cdb64 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1938,6 +1938,9 @@ static int serial_imx_probe_dt(struct imx_port *sport,
if (of_get_property(np, "fsl,dte-mode", NULL))
sport->dte_mode = 1;
+ if (of_property_read_bool(np, "linux,rs485-enabled-at-boot-time"))
+ sport->port.rs485.flags |= SER_RS485_ENABLED;
+
sport->devdata = of_id->data;
return 0;
@@ -2001,7 +2004,7 @@ static int serial_imx_probe(struct platform_device *pdev)
sport->port.fifosize = 32;
sport->port.ops = &imx_pops;
sport->port.rs485_config = imx_rs485_config;
- sport->port.rs485.flags =
+ sport->port.rs485.flags |=
SER_RS485_RTS_ON_SEND | SER_RS485_RX_DURING_TX;
sport->port.flags = UPF_BOOT_AUTOCONF;
init_timer(&sport->timer);
Проверка работоспособности:
Открываем два окна minicom, в настройках указываем нужный порт и нажимаем кнопки клавиатуры. Ниже приведена настройка интерфейса ttymxc1 (UART2)
A - Serial Device : /dev/ttymxc1
B - Lockfile Location : /var/lock
C - Callin Program :
D - Callout Program :
E - Bps/Par/Bits : 115200 8N1
F - Hardware Flow Control : No
G - Software Flow Control : No