Dear all,
when I test the UART port, I found it lost data while receiving data. the test process is like this:
1. On PC side I send 100 bytes from the UART port.
2. On IMX6Q side, I start a test process to test UART, This process will read data with block state, when it receives
data, it just print the data. from the printed data I found some data lost.
3. I try to add some log in function imx_rxint() in file imx.c, the added log is like this:
static irqreturn_t imx_rxint(int irq, void *dev_id)
{
struct imx_port *sport = dev_id;
unsigned int rx,flg,ignored = 0;
struct tty_struct *tty = sport->port.state->port.tty;
unsigned long flags, temp;
spin_lock_irqsave(&sport->port.lock,flags);
while (readl(sport->port.membase + USR2) & USR2_RDR) {
flg = TTY_NORMAL;
sport->port.icount.rx++;
rx = readl(sport->port.membase + URXD0);
temp = readl(sport->port.membase + USR2);
if (temp & USR2_BRCD) {
writel(USR2_BRCD, sport->port.membase + USR2);
if (uart_handle_break(&sport->port))
continue;
}
if (uart_handle_sysrq_char(&sport->port, (unsigned char)rx))
continue;
if (unlikely(rx & URXD_ERR)) {
if (rx & URXD_BRK)
sport->port.icount.brk++;
else if (rx & URXD_PRERR)
sport->port.icount.parity++;
else if (rx & URXD_FRMERR)
sport->port.icount.frame++;
if (rx & URXD_OVRRUN)
sport->port.icount.overrun++;
if (rx & sport->port.ignore_status_mask) {
if (++ignored > 100)
goto out;
continue;
}
rx &= sport->port.read_status_mask;
if (rx & URXD_BRK)
flg = TTY_BREAK;
else if (rx & URXD_PRERR)
flg = TTY_PARITY;
else if (rx & URXD_FRMERR)
flg = TTY_FRAME;
if (rx & URXD_OVRRUN)
flg = TTY_OVERRUN;
#ifdef SUPPORT_SYSRQ
sport->port.sysrq = 0;
#endif
}
/*add by aaron, 2015.7.29*/
if(sport->port.line == 1)
{
pr_err("[AARON] ttymxc1 :%d, %d", rx, sport->port.icount.rx);
}
/*end by aaron*/
tty_insert_flip_char(tty, rx, flg);
}
out:
spin_unlock_irqrestore(&sport->port.lock,flags);
tty_flip_buffer_push(tty);
return IRQ_HANDLED;
}
from the log , I found it also not receive the whole data. which means data was lost at this driver layer.
since The amount of data transfered is not so much, why this happened? if some configuration error?
Please help me. It critical to me
Thanks!
HI 如新
data may be lost due to uart buffer overruns conditions,
one can try to decrease baudrate or use flow control
as described below
i.MX6 UART Driver and RS485 Support
Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
Dear igorpadykov
I even use 9600 baudrate, which seems lost data again,
during debug I find if only send 30 bytes to IMX6, it will much better, and I chek the SPEC, find the RXFIFO is 32 bytes, if the problem is Related to the FIFO?
I tested much times with 100 bytes, and the log is always like this:
130|root@sabresd_6dq:/system/bin # ./test5_io
[aaron] start test_io: Success
[AARON] dma_rx_work, data :1, count :3 //first time to send 100 bytes
[AARON] dma_rx_work, data :97, count :3
[AARON] dma_rx_work, data :3, count :3
[AARON] dma_rx_work, data :4, count :31
[AARON] dma_rx_work, data :5, count :31
[AARON] dma_rx_work, data :6, count :31
[AARON] dma_rx_work, data :7, count :31
[AARON] dma_rx_work, data :8, count :31
[AARON] dma_rx_work, data :9, count :31
[AARON] dma_rx_work, data :10, count :31
[AARON] dma_rx_work, data :11, count :31
[AARON] dma_rx_work, data :12, count :31
[AARON] dma_rx_work, data :13, count :31
[AARON] dma_rx_work, data :14, count :31
[AARON] dma_rx_work, data :15, count :31
[AARON] dma_rx_work, data :16, count :31
[AARON] dma_rx_work, data :17, count :31
[AARON] dma_rx_work, data :18, count :31
[AARON] dma_rx_work, data :19, count :31
[AARON] dma_rx_work, data :20, count :31
[AARON] dma_rx_work, data :21, count :31
[AARON] dma_rx_work, data :22, count :31
[AARON] dma_rx_work, data :23, count :31
[AARON] dma_rx_work, data :24, count :31
[AARON] dma_rx_work, data :25, count :31
[AARON] dma_rx_work, data :26, count :31
[AARON] dma_rx_work, data :27, count :31
[AARON] dma_rx_work, data :28, count :31
[AARON] dma_rx_work, data :29, count :31
[AARON] dma_rx_work, data :30, count :31
[AARON] dma_rx_work, data :31, count :31
[AARON] dma_rx_work, data :32, count :31
[AARON] dma_rx_work, data :33, count :31
[AARON] dma_rx_work, data :34, count :31
[AARON] dma_rx_work, data :1, count :1 //second time to send 100 bytes
[AARON] dma_rx_work, data :97, count :31
[AARON] dma_rx_work, data :3, count :31
[AARON] dma_rx_work, data :4, count :31
[AARON] dma_rx_work, data :5, count :31
[AARON] dma_rx_work, data :6, count :31
[AARON] dma_rx_work, data :7, count :31
[AARON] dma_rx_work, data :8, count :31
[AARON] dma_rx_work, data :9, count :31
[AARON] dma_rx_work, data :10, count :31
[AARON] dma_rx_work, data :11, count :31
[AARON] dma_rx_work, data :12, count :31
[AARON] dma_rx_work, data :13, count :31
[AARON] dma_rx_work, data :14, count :31
[AARON] dma_rx_work, data :15, count :31
[AARON] dma_rx_work, data :16, count :31
[AARON] dma_rx_work, data :17, count :31
[AARON] dma_rx_work, data :18, count :31
[AARON] dma_rx_work, data :19, count :31
[AARON] dma_rx_work, data :20, count :31
[AARON] dma_rx_work, data :21, count :31
[AARON] dma_rx_work, data :22, count :31
[AARON] dma_rx_work, data :23, count :31
[AARON] dma_rx_work, data :24, count :31
[AARON] dma_rx_work, data :25, count :31
[AARON] dma_rx_work, data :26, count :31
[AARON] dma_rx_work, data :27, count :31
[AARON] dma_rx_work, data :28, count :31
[AARON] dma_rx_work, data :29, count :31
[AARON] dma_rx_work, data :30, count :31
[AARON] dma_rx_work, data :31, count :31
[AARON] dma_rx_work, data :32, count :31
[AARON] dma_rx_work, data :50, count :31
[AARON] dma_rx_work, data :51, count :31
[AARON] dma_rx_work, data :52, count :31
[AARON] dma_rx_work, data :53, count :31
[AARON] dma_rx_work, data :54, count :31
[AARON] dma_rx_work, data :55, count :31
[AARON] dma_rx_work, data :56, count :31
[AARON] dma_rx_work, data :57, count :31
[AARON] dma_rx_work, data :58, count :31
[AARON] dma_rx_work, data :59, count :31
[AARON] dma_rx_work, data :60, count :31
[AARON] dma_rx_work, data :61, count :31
[AARON] dma_rx_work, data :62, count :31
[AARON] dma_rx_work, data :63, count :31
[AARON] dma_rx_work, data :64, count :31
[AARON] dma_rx_work, data :65, count :31
[AARON] dma_rx_work, data :66, count :31
[AARON] dma_rx_work, data :67, count :31
[AARON] dma_rx_work, data :68, count :31
[AARON] dma_rx_work, data :69, count :31
[AARON] dma_rx_work, data :70, count :31
[AARON] dma_rx_work, data :71, count :31
[AARON] dma_rx_work, data :72, count :31
[AARON] dma_rx_work, data :73, count :31
[AARON] dma_rx_work, data :74, count :31
[AARON] dma_rx_work, data :75, count :31
[AARON] dma_rx_work, data :76, count :31
[AARON] dma_rx_work, data :77, count :31
[AARON] dma_rx_work, data :78, count :31
[AARON] dma_rx_work, data :79, count :31
[AARON] dma_rx_work, data :80, count :31
Thanks!
you should use uart data flow control
(as suggested in first answer) to correctly use dma
~igor
Dear igorpadykov,
I just send 100 bytes, and from log it seems lost much data. why?
I test to send 30 bytes, and still may lost data, some of data lost
is in the middle of data flow like this:
[AARON] dma_rx_work, data :1, count :3 //first time to send 100 bytes
[AARON] dma_rx_work, data :97, count :3
[AARON] dma_rx_work, data :4, count :31 //data 3 lost
[AARON] dma_rx_work, data :5, count :31
[AARON] dma_rx_work, data :6, count :31
[AARON] dma_rx_work, data :7, count :31
[AARON] dma_rx_work, data :9, count :31 //data 8 lost
[AARON] dma_rx_work, data :10, count :31
[AARON] dma_rx_work, data :11, count :31
[AARON] dma_rx_work, data :12, count :31
[AARON] dma_rx_work, data :13, count :31
[AARON] dma_rx_work, data :14, count :31
[AARON] dma_rx_work, data :15, count :31
[AARON] dma_rx_work, data :16, count :31
[AARON] dma_rx_work, data :17, count :31
[AARON] dma_rx_work, data :18, count :31
[AARON] dma_rx_work, data :19, count :31
[AARON] dma_rx_work, data :20, count :31
[AARON] dma_rx_work, data :21, count :31
[AARON] dma_rx_work, data :22, count :31
[AARON] dma_rx_work, data :23, count :31
[AARON] dma_rx_work, data :24, count :31
[AARON] dma_rx_work, data :25, count :31
[AARON] dma_rx_work, data :26, count :31
[AARON] dma_rx_work, data :27, count :31
[AARON] dma_rx_work, data :28, count :31
[AARON] dma_rx_work, data :29, count :31
[AARON] dma_rx_work, data :30, count :31
[AARON] dma_rx_work, data :31, count :31
[AARON] dma_rx_work, data :32, count :31
[AARON] dma_rx_work, data :33, count :31
[AARON] dma_rx_work, data :34, count :31
..... //data all lost
HI 如新:
You mentioned the problem solved now?