<?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: i.MX6 UART Driver and RS485 Support</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246895#M21600</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Paul, could you please reply to Pushi's inquery? If your issue does not exists, please click Correct Answer/Helpful Answer.&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Yixing&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 30 Sep 2013 03:57:59 GMT</pubDate>
    <dc:creator>YixingKong</dc:creator>
    <dc:date>2013-09-30T03:57:59Z</dc:date>
    <item>
      <title>i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246891#M21596</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am currently attempting to use RS-485 mode on a custom device based on the i.MX6Q. I am altering the imx.c driver found in ltib/rpm/BUILD/Linux/drivers/tty/serial. Using the assistance found in the 'RS485 Serial Communications' documentation, I have made the following changes to the driver. Unfortunately this has not helped. The signal CTS which I am using to control the direction of the RS-485 driver is never enabled so the device can never transmit. Anybody have any experience with RS-485 and this part? Should I be using the RS-485 mode by enabling the MDEN bit in the UMCR register?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Index: imx.c&lt;/P&gt;&lt;P&gt;===================================================================&lt;/P&gt;&lt;P&gt;--- imx.c (revision 34)&lt;/P&gt;&lt;P&gt;+++ imx.c (working copy)&lt;/P&gt;&lt;P&gt;@@ -46,6 +46,7 @@&lt;/P&gt;&lt;P&gt; #include &amp;lt;linux/rational.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;linux/slab.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;linux/dma-mapping.h&amp;gt;&lt;/P&gt;&lt;P&gt;+#include &amp;lt;linux/uaccess.h&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;asm/io.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;asm/irq.h&amp;gt;&lt;/P&gt;&lt;P&gt;@@ -213,6 +214,9 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int&amp;nbsp; dma_tx_nents;&lt;/P&gt;&lt;P&gt;&amp;nbsp; bool&amp;nbsp;&amp;nbsp; dma_is_rxing;&lt;/P&gt;&lt;P&gt;&amp;nbsp; wait_queue_head_t dma_wait;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // RS485 Support&lt;/P&gt;&lt;P&gt;+ struct serial_rs485 rs485;&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; struct imx_port_ucrs {&lt;/P&gt;&lt;P&gt;@@ -227,6 +231,33 @@&lt;/P&gt;&lt;P&gt; #define USE_IRDA(sport) (0)&lt;/P&gt;&lt;P&gt; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+static inline struct imx_port *&lt;/P&gt;&lt;P&gt;+to_imx_uart_port(struct uart_port *uart)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+ return container_of(uart, struct imx_port, port);&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+/* Enable or disable the rs485 support */&lt;/P&gt;&lt;P&gt;+void imx_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+ struct imx_port *imx_port = to_imx_uart_port(port);&lt;/P&gt;&lt;P&gt;+ //unsigned int mode;&lt;/P&gt;&lt;P&gt;+ unsigned long flags;&lt;/P&gt;&lt;P&gt;+ //unsigned long temp;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ spin_lock_irqsave(&amp;amp;port-&amp;gt;lock, flags);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ imx_port-&amp;gt;rs485 = *rs485conf;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ if (rs485conf-&amp;gt;flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp; dev_dbg(port-&amp;gt;dev, "Setting UART to RS485\n");&lt;/P&gt;&lt;P&gt;+ } else {&lt;/P&gt;&lt;P&gt;+&amp;nbsp; dev_dbg(port-&amp;gt;dev, "Setting UART to RS232\n");&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ spin_unlock_irqrestore(&amp;amp;port-&amp;gt;lock, flags);&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp; * Save and restore functions for UCR1, UCR2 and UCR3 registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;@@ -345,6 +376,13 @@&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(temp &amp;amp; ~UCR1_TXMPTYEN, sport-&amp;gt;port.membase + UCR1);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // disable CTS if rs485&lt;/P&gt;&lt;P&gt;+ if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+&amp;nbsp; temp &amp;amp;= ~(UCR2_CTS);&lt;/P&gt;&lt;P&gt;+&amp;nbsp; writel(temp, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; /*&lt;/P&gt;&lt;P&gt;@@ -477,6 +515,13 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct imx_port *sport = (struct imx_port *)port;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned long temp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+ // enable CTS if rs485&lt;/P&gt;&lt;P&gt;+ if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+&amp;nbsp; temp |= UCR2_CTS;&lt;/P&gt;&lt;P&gt;+&amp;nbsp; writel(temp, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (USE_IRDA(sport)) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; /* half duplex in IrDA mode; have to disable receive mode */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR4);&lt;/P&gt;&lt;P&gt;@@ -1446,6 +1491,36 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; return ret;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+static int imx_ioctl(struct uart_port *port,&lt;/P&gt;&lt;P&gt;+ unsigned int cmd,&lt;/P&gt;&lt;P&gt;+ unsigned long arg)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+ struct serial_rs485 rs485conf;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ switch (cmd) {&lt;/P&gt;&lt;P&gt;+ case TIOCSRS485:&lt;/P&gt;&lt;P&gt;+&amp;nbsp; if (copy_from_user(&amp;amp;rs485conf,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp; (struct serial_rs485 *) arg,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp; sizeof(rs485conf)))&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EFAULT;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp; imx_config_rs485(port, &amp;amp;rs485conf);&lt;/P&gt;&lt;P&gt;+&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ case TIOCGRS485:&lt;/P&gt;&lt;P&gt;+&amp;nbsp; if (copy_to_user((struct serial_rs485 *) arg,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp; &amp;amp;(to_imx_uart_port(port)-&amp;gt;rs485),&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp; sizeof(rs485conf)))&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EFAULT;&lt;/P&gt;&lt;P&gt;+&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOIOCTLCMD;&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ return 0;&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; #if defined(CONFIG_CONSOLE_POLL)&lt;/P&gt;&lt;P&gt; static int imx_poll_get_char(struct uart_port *port)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;@@ -1527,6 +1602,8 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; .request_port = imx_request_port,&lt;/P&gt;&lt;P&gt;&amp;nbsp; .config_port = imx_config_port,&lt;/P&gt;&lt;P&gt;&amp;nbsp; .verify_port = imx_verify_port,&lt;/P&gt;&lt;P&gt;+ // rs485 support&lt;/P&gt;&lt;P&gt;+ .ioctl&amp;nbsp; = imx_ioctl,&lt;/P&gt;&lt;P&gt; #if defined(CONFIG_CONSOLE_POLL)&lt;/P&gt;&lt;P&gt;&amp;nbsp; .poll_get_char&amp;nbsp; = imx_poll_get_char,&lt;/P&gt;&lt;P&gt;&amp;nbsp; .poll_put_char&amp;nbsp; = imx_poll_put_char,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 23 Sep 2013 21:16:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246891#M21596</guid>
      <dc:creator>PaulDeMetrotion</dc:creator>
      <dc:date>2013-09-23T21:16:10Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246892#M21597</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,anyway,do you have saved the problem?However,&lt;SPAN class="hps"&gt;I&lt;/SPAN&gt; &lt;SPAN class="hps"&gt;encountered the same&lt;/SPAN&gt; &lt;SPAN class="hps"&gt;problem in my project even though I use the RS485 mode by enabling the MDEN bit int the UMCR register.Can you help me?&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 24 Sep 2013 02:32:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246892#M21597</guid>
      <dc:creator>方圆张</dc:creator>
      <dc:date>2013-09-24T02:32:18Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246893#M21598</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I believe I have made progress through additional changes to the imx.c serial driver. I still cannot transfer a file but I do see the CTS signal being enabled properly when I attempt to transmit. When I attempt to send or receive, I get the following errors. I have not found much on the internet about these errors. Anybody familiar with them?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="mailto:root@winsys-ubuntu-desktop"&gt;root@winsys-ubuntu-desktop&lt;/A&gt;:~# rz -vv -b &amp;lt; /dev/ttymxc3 &amp;gt; /dev/ttymxc3&lt;/P&gt;&lt;P&gt;rz waiting to receive.got ZRINIT&lt;/P&gt;&lt;P&gt;Transfer incomplete&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="mailto:root@winsys-ubuntu-desktop:/usr/src/rs485"&gt;root@winsys-ubuntu-desktop:/usr/src/rs485&lt;/A&gt;# sz -vv -b rs485.c &amp;gt; /dev/ttymxc2 &amp;lt; /dev/ttymxc2&lt;BR /&gt;Retry 0: Got ZNAK&lt;BR /&gt;Retry 0: Got ZNAK&lt;BR /&gt;Retry 0: Got ZNAK&lt;BR /&gt;Retry 0: Got ZNAK&lt;BR /&gt;Retry 0: Got ZNAK&lt;BR /&gt;Retry 0: Got ZNAK&lt;/P&gt;&lt;P&gt;Transfer incomplete&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Patch file for imx.c:&lt;/P&gt;&lt;P&gt;Index: imx.c&lt;/P&gt;&lt;P&gt;===================================================================&lt;/P&gt;&lt;P&gt;--- imx.c (revision 34)&lt;/P&gt;&lt;P&gt;+++ imx.c (working copy)&lt;/P&gt;&lt;P&gt;@@ -46,6 +46,7 @@&lt;/P&gt;&lt;P&gt; #include &amp;lt;linux/rational.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;linux/slab.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;linux/dma-mapping.h&amp;gt;&lt;/P&gt;&lt;P&gt;+#include &amp;lt;linux/uaccess.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;asm/io.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;asm/irq.h&amp;gt;&lt;/P&gt;&lt;P&gt;@@ -213,6 +214,9 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int dma_tx_nents;&lt;/P&gt;&lt;P&gt;&amp;nbsp; bool dma_is_rxing;&lt;/P&gt;&lt;P&gt;&amp;nbsp; wait_queue_head_t dma_wait;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // RS485 Support&lt;/P&gt;&lt;P&gt;+ struct serial_rs485 rs485;&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt; struct imx_port_ucrs {&lt;/P&gt;&lt;P&gt;@@ -227,6 +231,39 @@&lt;/P&gt;&lt;P&gt; #define USE_IRDA(sport) (0)&lt;/P&gt;&lt;P&gt; #endif&lt;/P&gt;&lt;P&gt;+static inline struct imx_port *&lt;/P&gt;&lt;P&gt;+to_imx_uart_port(struct uart_port *uart)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+ return container_of(uart, struct imx_port, port);&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+/* Enable or disable the rs485 support */&lt;/P&gt;&lt;P&gt;+void imx_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+ struct imx_port *imx_port = to_imx_uart_port(port);&lt;/P&gt;&lt;P&gt;+ struct imx_port *sport = (struct imx_port *)port;&lt;/P&gt;&lt;P&gt;+ unsigned long flags;&lt;/P&gt;&lt;P&gt;+ unsigned long temp;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ spin_lock_irqsave(&amp;amp;port-&amp;gt;lock, flags);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // copy rs485 structure&lt;/P&gt;&lt;P&gt;+ imx_port-&amp;gt;rs485 = *rs485conf;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ if (rs485conf-&amp;gt;flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+ dev_dbg(port-&amp;gt;dev, "Setting UART to RS485\n");&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // disable CTS - it is set by mctrl&lt;/P&gt;&lt;P&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ temp &amp;amp;= ~(UCR2_CTS);&lt;/P&gt;&lt;P&gt;+ writel(temp, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ } else {&lt;/P&gt;&lt;P&gt;+ dev_dbg(port-&amp;gt;dev, "Setting UART to RS232\n");&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ spin_unlock_irqrestore(&amp;amp;port-&amp;gt;lock, flags);&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp; * Save and restore functions for UCR1, UCR2 and UCR3 registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;@@ -345,6 +382,21 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(temp &amp;amp; ~UCR1_TXMPTYEN, sport-&amp;gt;port.membase + UCR1);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // disable CTS if rs485&lt;/P&gt;&lt;P&gt;+ if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+ // wait for transmit to complete&lt;/P&gt;&lt;P&gt;+ n = 256;&lt;/P&gt;&lt;P&gt;+ while ((--n &amp;gt; 0) &amp;amp;&amp;amp; !(readl(sport-&amp;gt;port.membase + USR2) &amp;amp; USR2_TXDC)) {&lt;/P&gt;&lt;P&gt;+ udelay(5);&lt;/P&gt;&lt;P&gt;+ //barrier();&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ // disable CTS&lt;/P&gt;&lt;P&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ temp &amp;amp;= ~(UCR2_CTS);&lt;/P&gt;&lt;P&gt;+ writel(temp, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt; /*&lt;/P&gt;&lt;P&gt;@@ -477,6 +529,13 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; struct imx_port *sport = (struct imx_port *)port;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned long temp;&lt;/P&gt;&lt;P&gt;+ // enable CTS if rs485&lt;/P&gt;&lt;P&gt;+ if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+ temp = readl(sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ temp |= UCR2_CTS;&lt;/P&gt;&lt;P&gt;+ writel(temp, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (USE_IRDA(sport)) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* half duplex in IrDA mode; have to disable receive mode */&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR4);&lt;/P&gt;&lt;P&gt;@@ -710,8 +769,9 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp = readl(sport-&amp;gt;port.membase + UCR2) &amp;amp; ~UCR2_CTS;&lt;/P&gt;&lt;P&gt;- if (mctrl &amp;amp; TIOCM_RTS)&lt;/P&gt;&lt;P&gt;- temp |= UCR2_CTS;&lt;/P&gt;&lt;P&gt;+ if (!(sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED))&lt;/P&gt;&lt;P&gt;+ if (mctrl &amp;amp; TIOCM_RTS)&lt;/P&gt;&lt;P&gt;+ temp |= UCR2_CTS;&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(temp, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;@@ -1446,6 +1506,36 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; return ret;&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;+static int imx_ioctl(struct uart_port *port,&lt;/P&gt;&lt;P&gt;+ unsigned int cmd,&lt;/P&gt;&lt;P&gt;+ unsigned long arg)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+ struct serial_rs485 rs485conf;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ switch (cmd) {&lt;/P&gt;&lt;P&gt;+ case TIOCSRS485:&lt;/P&gt;&lt;P&gt;+ if (copy_from_user(&amp;amp;rs485conf,&lt;/P&gt;&lt;P&gt;+ (struct serial_rs485 *) arg,&lt;/P&gt;&lt;P&gt;+ sizeof(rs485conf)))&lt;/P&gt;&lt;P&gt;+ return -EFAULT;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ imx_config_rs485(port, &amp;amp;rs485conf);&lt;/P&gt;&lt;P&gt;+ break;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ case TIOCGRS485:&lt;/P&gt;&lt;P&gt;+ if (copy_to_user((struct serial_rs485 *) arg,&lt;/P&gt;&lt;P&gt;+ &amp;amp;(to_imx_uart_port(port)-&amp;gt;rs485),&lt;/P&gt;&lt;P&gt;+ sizeof(rs485conf)))&lt;/P&gt;&lt;P&gt;+ return -EFAULT;&lt;/P&gt;&lt;P&gt;+ break;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOIOCTLCMD;&lt;/P&gt;&lt;P&gt;+ }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+ return 0;&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; #if defined(CONFIG_CONSOLE_POLL)&lt;/P&gt;&lt;P&gt; static int imx_poll_get_char(struct uart_port *port)&lt;/P&gt;&lt;P&gt; {&lt;/P&gt;&lt;P&gt;@@ -1527,6 +1617,8 @@&lt;/P&gt;&lt;P&gt;&amp;nbsp; .request_port = imx_request_port,&lt;/P&gt;&lt;P&gt;&amp;nbsp; .config_port = imx_config_port,&lt;/P&gt;&lt;P&gt;&amp;nbsp; .verify_port = imx_verify_port,&lt;/P&gt;&lt;P&gt;+ // rs485 support&lt;/P&gt;&lt;P&gt;+ .ioctl = imx_ioctl,&lt;/P&gt;&lt;P&gt; #if defined(CONFIG_CONSOLE_POLL)&lt;/P&gt;&lt;P&gt;&amp;nbsp; .poll_get_char&amp;nbsp; = imx_poll_get_char,&lt;/P&gt;&lt;P&gt;&amp;nbsp; .poll_put_char&amp;nbsp; = imx_poll_put_char,&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 12pt; font-family: Calibri;"&gt;&lt;SPAN lang=""&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 26 Sep 2013 22:13:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246893#M21598</guid>
      <dc:creator>PaulDeMetrotion</dc:creator>
      <dc:date>2013-09-26T22:13:34Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246894#M21599</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am not sure do you change code of&amp;nbsp; receive and transfer RS-485 data&amp;nbsp; follow the&amp;nbsp; RM section 64.7.2 Transmit 9-bit RS-485 frames and 64.7.3 Receive 9-bit RS-485 frames. And please check&amp;nbsp; RM section 64.13.2 Programming the UART in 9-bit RS-485 mode. &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 30 Sep 2013 02:17:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246894#M21599</guid>
      <dc:creator>fushi_peng</dc:creator>
      <dc:date>2013-09-30T02:17:36Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246895#M21600</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Paul, could you please reply to Pushi's inquery? If your issue does not exists, please click Correct Answer/Helpful Answer.&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Yixing&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 30 Sep 2013 03:57:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246895#M21600</guid>
      <dc:creator>YixingKong</dc:creator>
      <dc:date>2013-09-30T03:57:59Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246896#M21601</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi &lt;A class="jx-jive-macro-user" href="https://community.nxp.com/people/PaulDeMetrotion"&gt;PaulDeMetrotion&lt;/A&gt;,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Did you managed to solve that issue? whats it your current progress. I will follow your steps and i am afraid that i will end up in the same situation. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;F.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 07 Oct 2013 19:48:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246896#M21601</guid>
      <dc:creator>felipezimmerle</dc:creator>
      <dc:date>2013-10-07T19:48:11Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246897#M21602</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I have done a similar modification. the key is...&lt;/P&gt;&lt;P&gt;in imx_start_tx(), enable TCEN (in UCR4).&lt;/P&gt;&lt;P&gt;in imx_stop_tx(), check TXDC (in USR2).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;this is my full patch.&lt;/P&gt;&lt;P&gt;====================================================&lt;/P&gt;&lt;P&gt;---&lt;/P&gt;&lt;P&gt; drivers/tty/serial/imx.c |&amp;nbsp;&amp;nbsp; 69 ++++++++++++++++++++++++++++++++++++++++++++++&lt;/P&gt;&lt;P&gt; 1 files changed, 69 insertions(+), 0 deletions(-)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c&lt;/P&gt;&lt;P&gt;index a512a76..66081e1 100644&lt;/P&gt;&lt;P&gt;--- a/drivers/tty/serial/imx.c&lt;/P&gt;&lt;P&gt;+++ b/drivers/tty/serial/imx.c&lt;/P&gt;&lt;P&gt;@@ -49,6 +49,7 @@&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;asm/io.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;asm/irq.h&amp;gt;&lt;/P&gt;&lt;P&gt;+#include &amp;lt;asm/uaccess.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;mach/dma.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;mach/hardware.h&amp;gt;&lt;/P&gt;&lt;P&gt; #include &amp;lt;mach/imx-uart.h&amp;gt;&lt;/P&gt;&lt;P&gt;@@ -213,6 +214,8 @@ struct imx_port {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_tx_nents;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_is_rxing;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wait_queue_head_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_wait;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct serial_rs485&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs485;&lt;/P&gt;&lt;P&gt; };&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; struct imx_port_ucrs {&lt;/P&gt;&lt;P&gt;@@ -227,6 +230,25 @@ struct imx_port_ucrs {&lt;/P&gt;&lt;P&gt; #define USE_IRDA(sport)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0)&lt;/P&gt;&lt;P&gt; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+static inline void imx_rs485_switch_to_tx(struct imx_port *sport) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writel(readl(sport-&amp;gt;port.membase + UCR2) &amp;amp; ~UCR2_CTS,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+static inline void imx_rs485_switch_to_rx(struct imx_port *sport) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writel(readl(sport-&amp;gt;port.membase + UCR2) | UCR2_CTS,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+static inline void imx_rs485_config(struct imx_port *sport) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sport-&amp;gt;have_rtscts) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writel(readl(sport-&amp;gt;port.membase + UCR2) &amp;amp; ~UCR2_CTSC,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_rs485_switch_to_rx(sport);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sport-&amp;gt;rs485.flags &amp;amp;= ~SER_RS485_ENABLED;&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp; * Save and restore functions for UCR1, UCR2 and UCR3 registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;@@ -301,6 +323,13 @@ static void imx_stop_tx(struct uart_port *port)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct imx_port *sport = (struct imx_port *)port;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned long temp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (readl(sport-&amp;gt;port.membase + USR2) &amp;amp; USR2_TXDC) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED)&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_rs485_switch_to_rx(sport);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writel(readl(sport-&amp;gt;port.membase + UCR4) &amp;amp; ~UCR4_TCEN,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sport-&amp;gt;port.membase + UCR4);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (USE_IRDA(sport)) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* half duplex - wait for end of transmission */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n = 256;&lt;/P&gt;&lt;P&gt;@@ -508,6 +537,12 @@ static void imx_start_tx(struct uart_port *port)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writel(readl(sport-&amp;gt;port.membase + UCR4) | UCR4_TCEN,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sport-&amp;gt;port.membase + UCR4);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_rs485_switch_to_tx(sport);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (readl(sport-&amp;gt;port.membase + UTS) &amp;amp; UTS_TXEMPTY)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_transmit_buffer(sport);&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt;@@ -651,6 +686,11 @@ static irqreturn_t imx_int(int irq, void *dev_id)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct imx_port *sport = dev_id;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int sts;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (readl(sport-&amp;gt;port.membase + USR2) &amp;amp; USR2_TXDC &amp;amp;&amp;amp;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readl(sport-&amp;gt;port.membase + UCR4) &amp;amp; UCR4_TCEN) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_txint(irq, dev_id);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sts = readl(sport-&amp;gt;port.membase + USR1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sts &amp;amp; USR1_RRDY) {&lt;/P&gt;&lt;P&gt;@@ -1361,6 +1401,9 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* set the parity, stop bits and data size */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writel(ucr2 | old_txrxen, sport-&amp;gt;port.membase + UCR2);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED)&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_rs485_config(sport);&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; spin_unlock_irqrestore(&amp;amp;sport-&amp;gt;port.lock, flags);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (UART_ENABLE_MS(&amp;amp;sport-&amp;gt;port, termios-&amp;gt;c_cflag))&lt;/P&gt;&lt;P&gt;@@ -1510,6 +1553,31 @@ static void imx_poll_put_char(struct uart_port *port, unsigned char c)&lt;/P&gt;&lt;P&gt; }&lt;/P&gt;&lt;P&gt; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;+static int imx_ioctl(struct uart_port *port, unsigned int cmd, unsigned long arg)&lt;/P&gt;&lt;P&gt;+{&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct imx_port *sport = (struct imx_port *)port;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (cmd) {&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TIOCSRS485:&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (copy_from_user(&amp;amp;(sport-&amp;gt;rs485), (struct serial_rs485 *) arg,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(struct serial_rs485)))&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EFAULT;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sport-&amp;gt;rs485.flags &amp;amp; SER_RS485_ENABLED)&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imx_rs485_config(sport);&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TIOCGRS485:&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (copy_to_user((struct serial_rs485 *) arg, &amp;amp;(sport-&amp;gt;rs485),&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(struct serial_rs485)))&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -EFAULT;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOIOCTLCMD;&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;+}&lt;/P&gt;&lt;P&gt;+&lt;/P&gt;&lt;P&gt; static struct uart_ops imx_pops = {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tx_empty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_tx_empty,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .set_mctrl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_set_mctrl,&lt;/P&gt;&lt;P&gt;@@ -1521,6 +1589,7 @@ static struct uart_ops imx_pops = {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .break_ctl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_break_ctl,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .startup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_startup,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .shutdown&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_shutdown,&lt;/P&gt;&lt;P&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ioctl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_ioctl,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .set_termios&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_set_termios,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = imx_type,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .release_port&amp;nbsp;&amp;nbsp; = imx_release_port,&lt;/P&gt;&lt;P&gt;--&lt;/P&gt;&lt;P&gt;1.7.4.1&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 08 Oct 2013 02:34:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246897#M21602</guid>
      <dc:creator>bobbywu</dc:creator>
      <dc:date>2013-10-08T02:34:40Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246898#M21603</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Paul, if your issue does not exists, please click Correct Answer/Helpful Answer.&lt;/P&gt;&lt;P&gt;Thansk,&lt;/P&gt;&lt;P&gt;Yixing&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 08 Oct 2013 06:43:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246898#M21603</guid>
      <dc:creator>YixingKong</dc:creator>
      <dc:date>2013-10-08T06:43:53Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246899#M21604</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Do you have Slove the problem？I have the same question，please help。&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 21 Jul 2014 01:52:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246899#M21604</guid>
      <dc:creator>gavinbao</dc:creator>
      <dc:date>2014-07-21T01:52:26Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246900#M21605</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Does anybody have an update on this? I have not looked at this for a while and thought I had it working. But now I cannot transfer large files due to transmit collisions. I have been attempting to review my imx.c driver changes but cannot find any fixes that work. I am using rz and sz to transfer a file between two on-board UART ports.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 19 Aug 2014 15:27:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246900#M21605</guid>
      <dc:creator>PaulDeMetrotion</dc:creator>
      <dc:date>2014-08-19T15:27:39Z</dc:date>
    </item>
    <item>
      <title>Re: i.MX6 UART Driver and RS485 Support</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246901#M21606</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; the following may be helpful&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/thread/459898"&gt;Does UART in RS485 mode support only 9 Bit mode for i.MX6 ?&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;(&lt;SPAN style="color: #51626f; background-color: #ffffff;"&gt;suggest to use a recent kernel such as 4.13.2 for rs485 evaluation.&lt;/SPAN&gt;)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Yuri.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 26 Oct 2017 07:14:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/i-MX6-UART-Driver-and-RS485-Support/m-p/246901#M21606</guid>
      <dc:creator>Yuri</dc:creator>
      <dc:date>2017-10-26T07:14:41Z</dc:date>
    </item>
  </channel>
</rss>

