<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>i.MX ProcessorsのトピックRe: Configure UART for 2-wire RS485</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169201#M163628</link>
    <description>&lt;P&gt;Hi&amp;nbsp;okwaj&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;one&amp;nbsp; can look at rs485 examples on boundary devices boards:&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;&lt;A href="https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.14.x_2.0.0_ga/arch/arm/boot/dts/imx6ull-rta.dts" target="_blank"&gt;https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.14.x_2.0.0_ga/arch/arm/boot/dts/imx6ull-rta.dts&lt;/A&gt;&lt;BR /&gt;&lt;A href="https://github.com/boundarydevices/u-boot-imx6/blob/boundary-v2018.07/board/boundary/rta/rta.c" target="_blank"&gt;https://github.com/boundarydevices/u-boot-imx6/blob/boundary-v2018.07/board/boundary/rta/rta.c&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;/P&gt;</description>
    <pubDate>Mon, 19 Oct 2020 00:06:11 GMT</pubDate>
    <dc:creator>igorpadykov</dc:creator>
    <dc:date>2020-10-19T00:06:11Z</dc:date>
    <item>
      <title>Configure UART for 2-wire RS485</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169120#M163615</link>
      <description>&lt;P&gt;Hi All,&lt;/P&gt;&lt;P&gt;I want to use UART7 and UART8 on iMX6UL for RS485.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;The schematic of RS485 is as below. I want to use DE/RE_485_2 to control the transmit or receive direction.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="okwaj_1-1602927862558.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/127659i6EEFC95CAE42BF65/image-size/medium?v=v2&amp;amp;px=400" role="button" title="okwaj_1-1602927862558.png" alt="okwaj_1-1602927862558.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;I used this &lt;A href="https://community.nxp.com/t5/i-MX-Processors/How-to-configure-RS-485-2-wire-in-dts/m-p/1168922#M163589" target="_self"&gt;post&lt;/A&gt; to configure my dts.&lt;/P&gt;&lt;P&gt;My dts is :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="c"&gt;		pinctrl_uart7: uart7grp //Interface RS485
		{
			fsl,pins = &amp;lt;
					MX6UL_PAD_LCD_DATA17__UART7_DCE_RX 0x1b0b1 //485_RX_1
					MX6UL_PAD_LCD_DATA16__UART7_DCE_TX 0x1b0b1 //485_TX_1
					MX6UL_PAD_GPIO1_IO05__GPIO1_IO05	0x1b0b1 //DE/RE_485_1
			&amp;gt;;
		};

		pinctrl_uart8: uart8grp //Interface RS485
		{
			fsl,pins = &amp;lt;
				MX6UL_PAD_LCD_DATA20__UART8_DCE_TX 0x1b0b1 //485_TX_2
				MX6UL_PAD_LCD_DATA21__UART8_DCE_RX 0x1b0b1 //485_RX_2
				MX6UL_PAD_GPIO1_IO04__GPIO1_IO04   0x1b0b1 //DE/RE_485_2
			&amp;gt;;
		};

&amp;amp;uart7
{
	pinctrl-names = "default";
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_uart7&amp;gt;;
	status = "okay";
	rts-gpio = &amp;lt;&amp;amp;gpio1 5 GPIO_ACTIVE_HIGH&amp;gt;;
	rs485-rts-active-high;
	rs485-rx-during-tx;
	rs485-rts-delay = &amp;lt;1 1&amp;gt;;
	linux,rs485-enabled-at-boot-time;
};

&amp;amp;uart8
{
	pinctrl-names = "default";
	pinctrl-0 = &amp;lt;&amp;amp;pinctrl_uart8&amp;gt;;
	status = "okay";
	rts-gpio = &amp;lt;&amp;amp;gpio1 4 GPIO_ACTIVE_HIGH&amp;gt;;
	rs485-rts-active-high;
	rs485-rx-during-tx;
	rs485-rts-delay = &amp;lt;1 1&amp;gt;;
	linux,rs485-enabled-at-boot-time;
};&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When I "echo "something" &amp;gt; /dev/ttymxc&amp;lt;6_7&amp;gt;", I see the data but the DE/RE doesn't change its state.&lt;BR /&gt;&lt;BR /&gt;I enabled the "Debug GPIO calls" in the make menuconfig and I don't see the DE/RE pins configured during startup and their initial state is not as declared in my dts...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Do you see any issue in my dts ?&lt;/P&gt;</description>
      <pubDate>Sat, 17 Oct 2020 09:57:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169120#M163615</guid>
      <dc:creator>okwaj</dc:creator>
      <dc:date>2020-10-17T09:57:20Z</dc:date>
    </item>
    <item>
      <title>Re: Configure UART for 2-wire RS485</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169201#M163628</link>
      <description>&lt;P&gt;Hi&amp;nbsp;okwaj&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;one&amp;nbsp; can look at rs485 examples on boundary devices boards:&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;&lt;A href="https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.14.x_2.0.0_ga/arch/arm/boot/dts/imx6ull-rta.dts" target="_blank"&gt;https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.14.x_2.0.0_ga/arch/arm/boot/dts/imx6ull-rta.dts&lt;/A&gt;&lt;BR /&gt;&lt;A href="https://github.com/boundarydevices/u-boot-imx6/blob/boundary-v2018.07/board/boundary/rta/rta.c" target="_blank"&gt;https://github.com/boundarydevices/u-boot-imx6/blob/boundary-v2018.07/board/boundary/rta/rta.c&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;/P&gt;</description>
      <pubDate>Mon, 19 Oct 2020 00:06:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169201#M163628</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2020-10-19T00:06:11Z</dc:date>
    </item>
    <item>
      <title>Re: Configure UART for 2-wire RS485</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169381#M163653</link>
      <description>&lt;P&gt;Thank you for your answer,&lt;/P&gt;&lt;P&gt;I tried the same thing as uart4 and 5 of&amp;nbsp;&lt;A href="https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.14.x_2.0.0_ga/arch/arm/boot/dts/imx6ull-rta.dts" target="_blank"&gt;https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.14.x_2.0.0_ga/arch/arm/boot/dts/imx6ull-rta.dts&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;But still nothing on the DE/RE...&lt;/P&gt;&lt;P&gt;I noticed that I use a GPIO for this signal whereas in the example, it is an RTS/CTS GPIO, does it change anything ?&lt;BR /&gt;&lt;BR /&gt;I also saw this &lt;A href="https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/Add-support-RS485-half-duplex/ta-p/1128042" target="_self"&gt;post&lt;/A&gt; but there is no example provided.&lt;/P&gt;</description>
      <pubDate>Mon, 19 Oct 2020 07:03:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1169381#M163653</guid>
      <dc:creator>okwaj</dc:creator>
      <dc:date>2020-10-19T07:03:15Z</dc:date>
    </item>
    <item>
      <title>Re: Configure UART for 2-wire RS485</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1172950#M164022</link>
      <description>&lt;P&gt;I don't have any driver developpement knowledge and I didn't have time so I fixed it in an ugly way.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;I modified imx.c under drivers/tty/serial like that (this is ugly and only working for my specific case but It can help so I share it ...):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;index c9bd603d395b..7cf00d3f1c4b 100644&lt;BR /&gt;--- a/drivers/tty/serial/imx.c&lt;BR /&gt;+++ b/drivers/tty/serial/imx.c&lt;BR /&gt;@@ -39,6 +39,7 @@&lt;BR /&gt;#include &amp;lt;linux/of_device.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/io.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/dma-mapping.h&amp;gt;&lt;BR /&gt;+#include &amp;lt;linux/gpio.h&amp;gt;&lt;BR /&gt;&lt;BR /&gt;#include &amp;lt;asm/irq.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/platform_data/serial-imx.h&amp;gt;&lt;BR /&gt;@@ -330,6 +331,11 @@ static void imx_port_ucrs_restore(struct uart_port *port,&lt;BR /&gt;}&lt;BR /&gt;#endif&lt;BR /&gt;&lt;BR /&gt;+static void rs485_init(void);&lt;BR /&gt;+static void rs485_free(void);&lt;BR /&gt;+static void rs485_start_tx(struct imx_port *sport);&lt;BR /&gt;+static void rs485_stop_tx(struct imx_port *sport);&lt;BR /&gt;+&lt;BR /&gt;/*&lt;BR /&gt;* Handle any change of modem status signal since we were last called.&lt;BR /&gt;*/&lt;BR /&gt;@@ -382,7 +388,7 @@ static void imx_stop_tx(struct uart_port *port)&lt;BR /&gt;{&lt;BR /&gt;struct imx_port *sport = (struct imx_port *)port;&lt;BR /&gt;unsigned long temp;&lt;BR /&gt;-&lt;BR /&gt;+ // rs485_stop_tx(sport);&lt;BR /&gt;/*&lt;BR /&gt;* We are maybe in the SMP context, so if the DMA TX thread is running&lt;BR /&gt;* on other cpu, we have to wait for it to finish.&lt;BR /&gt;@@ -595,6 +601,7 @@ static void imx_start_tx(struct uart_port *port)&lt;BR /&gt;struct imx_port *sport = (struct imx_port *)port;&lt;BR /&gt;unsigned long temp;&lt;BR /&gt;&lt;BR /&gt;+ rs485_start_tx(sport);&lt;BR /&gt;if (port-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED) {&lt;BR /&gt;/* enable transmitter and shifter empty irq */&lt;BR /&gt;temp = readl(port-&amp;gt;membase + UCR2);&lt;BR /&gt;@@ -732,9 +739,16 @@ static irqreturn_t imx_int(int irq, void *dev_id)&lt;BR /&gt;struct imx_port *sport = dev_id;&lt;BR /&gt;unsigned int sts;&lt;BR /&gt;unsigned int sts2;&lt;BR /&gt;+ unsigned int cr4;&lt;BR /&gt;&lt;BR /&gt;sts = readl(sport-&amp;gt;port.membase + USR1);&lt;BR /&gt;sts2 = readl(sport-&amp;gt;port.membase + USR2);&lt;BR /&gt;+ cr4 = readl(sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+&lt;BR /&gt;+ if ((cr4 &amp;amp; UCR4_TCEN) &amp;amp;&amp;amp; (sts2 &amp;amp; USR2_TXDC))&lt;BR /&gt;+ {&lt;BR /&gt;+ rs485_stop_tx(sport);&lt;BR /&gt;+ }&lt;BR /&gt;&lt;BR /&gt;if ((sts &amp;amp; USR1_RRDY || sts &amp;amp; USR1_AGTIM) &amp;amp;&amp;amp;&lt;BR /&gt;!sport-&amp;gt;dma_is_enabled) {&lt;BR /&gt;@@ -746,7 +760,7 @@ static irqreturn_t imx_int(int irq, void *dev_id)&lt;BR /&gt;if ((sts &amp;amp; USR1_TRDY &amp;amp;&amp;amp;&lt;BR /&gt;readl(sport-&amp;gt;port.membase + UCR1) &amp;amp; UCR1_TXMPTYEN) ||&lt;BR /&gt;(sts2 &amp;amp; USR2_TXDC &amp;amp;&amp;amp;&lt;BR /&gt;- readl(sport-&amp;gt;port.membase + UCR4) &amp;amp; UCR4_TCEN))&lt;BR /&gt;+ cr4 &amp;amp; UCR4_TCEN))&lt;BR /&gt;imx_txint(irq, dev_id);&lt;BR /&gt;&lt;BR /&gt;if (sts &amp;amp; USR1_RTSD)&lt;BR /&gt;@@ -1122,6 +1136,7 @@ static int imx_startup(struct uart_port *port)&lt;BR /&gt;return retval;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;+ rs485_init();&lt;BR /&gt;imx_setup_ufcr(sport, 0);&lt;BR /&gt;&lt;BR /&gt;/* disable the DREN bit (Data Ready interrupt enable) before&lt;BR /&gt;@@ -1222,6 +1237,7 @@ static void imx_shutdown(struct uart_port *port)&lt;BR /&gt;imx_disable_dma(sport);&lt;BR /&gt;spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);&lt;BR /&gt;imx_uart_dma_exit(sport);&lt;BR /&gt;+ rs485_free();&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;spin_lock_irqsave(&amp;amp;sport-&amp;gt;port.lock, flags);&lt;BR /&gt;@@ -1966,6 +1982,78 @@ static void serial_imx_probe_pdata(struct imx_port *sport,&lt;BR /&gt;sport-&amp;gt;have_rtscts = 1;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;+/*&lt;BR /&gt;+ Init the GPIO for DE/RE communication for UART7 and UART8&lt;BR /&gt;+*/&lt;BR /&gt;+static void rs485_init(void)&lt;BR /&gt;+{&lt;BR /&gt;+ static int done;&lt;BR /&gt;+ if (done == 0)&lt;BR /&gt;+ {&lt;BR /&gt;+ gpio_request(4, "DERE_485_2");&lt;BR /&gt;+ gpio_request(5, "DERE_485_1");&lt;BR /&gt;+ gpio_direction_output(4, 1);&lt;BR /&gt;+ gpio_direction_output(5, 1);&lt;BR /&gt;+ done = 1;&lt;BR /&gt;+ }&lt;BR /&gt;+}&lt;BR /&gt;+&lt;BR /&gt;+/*&lt;BR /&gt;+ Free the GPIOs used for DE/RE com on UART7/8&lt;BR /&gt;+*/&lt;BR /&gt;+static void rs485_free(void)&lt;BR /&gt;+{&lt;BR /&gt;+ static int done;&lt;BR /&gt;+ if (done == 0)&lt;BR /&gt;+ {&lt;BR /&gt;+ gpio_free(4);&lt;BR /&gt;+ gpio_free(5);&lt;BR /&gt;+ done = 1;&lt;BR /&gt;+ }&lt;BR /&gt;+}&lt;BR /&gt;+&lt;BR /&gt;+/*&lt;BR /&gt;+ Activate the corresponding gpio for UART7/8&lt;BR /&gt;+*/&lt;BR /&gt;+static void rs485_start_tx(struct imx_port *sport)&lt;BR /&gt;+{&lt;BR /&gt;+ if (sport == imx_ports[6])&lt;BR /&gt;+ {&lt;BR /&gt;+ unsigned long temp;&lt;BR /&gt;+ gpio_set_value(5, 1);&lt;BR /&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ writel(temp | UCR4_TCEN, sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ }&lt;BR /&gt;+ else if (sport == imx_ports[7])&lt;BR /&gt;+ {&lt;BR /&gt;+ unsigned long temp;&lt;BR /&gt;+ gpio_set_value(4, 1);&lt;BR /&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ writel(temp | UCR4_TCEN, sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ }&lt;BR /&gt;+}&lt;BR /&gt;+&lt;BR /&gt;+/*&lt;BR /&gt;+ Deactivate the corresponding gpio for UART7/8&lt;BR /&gt;+*/&lt;BR /&gt;+static void rs485_stop_tx(struct imx_port *sport)&lt;BR /&gt;+{&lt;BR /&gt;+ if (sport == imx_ports[6])&lt;BR /&gt;+ {&lt;BR /&gt;+ unsigned long temp;&lt;BR /&gt;+ gpio_set_value(5, 0);&lt;BR /&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ writel(temp &amp;amp; ~UCR4_TCEN, sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ }&lt;BR /&gt;+ else if (sport == imx_ports[7])&lt;BR /&gt;+ {&lt;BR /&gt;+ unsigned long temp;&lt;BR /&gt;+ gpio_set_value(4, 0);&lt;BR /&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ writel(temp &amp;amp; ~UCR4_TCEN, sport-&amp;gt;port.membase + UCR4);&lt;BR /&gt;+ }&lt;BR /&gt;+}&lt;BR /&gt;+&lt;BR /&gt;static int serial_imx_probe(struct platform_device *pdev)&lt;BR /&gt;{&lt;BR /&gt;struct imx_port *sport;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 26 Oct 2020 08:20:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Configure-UART-for-2-wire-RS485/m-p/1172950#M164022</guid>
      <dc:creator>okwaj</dc:creator>
      <dc:date>2020-10-26T08:20:13Z</dc:date>
    </item>
  </channel>
</rss>

