Интерфейс RS485 на модулях с процессором iMX6UL(iMX6ULL)

Ядро 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.c
index 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