Okay... I successfully reproduced (supposed to be) same issue as yours.
I wrote a short program running on PC-Linux, which intentionally turn OFF and ON RTS signal between every receive event. The core of the program is;
while (1) {
len = read(fd, buff, 8);
total_len += len;
printf("%d\n", total_len);
status &= ~(TIOCM_RTS);
ret = ioctl(fd, TIOCMSET, &status);
usleep(1 * 1000); /* 1msec */
status |= TIOCM_RTS;
ret = ioctl(fd, TIOCMSET, &status);
}
With this program on receiver side at 115200bps, sure iMX28 stops transmission in less than 1Kbyte.
I peeked UART and ICOLL register status when the stoppage happend.
ICOLL raw0=80000000 raw1=00000001 raw2=00000000 raw3=00000000
ICOLL 112=00000004
UART CTRL0=00030000 CTRL1=00000000 CTRL2=0022ca01
UART LINECTRL0=00680a70 LINECTRL1=00000000
UART INTR=00720002 STAT=f1f00000 DEBUG=00682800
INTR high (0x0072) shows RTIEN, TXIEN, RXIE, CTSMIEN are set.
INTR low (0x0002) shows CTSMIS is set, which suggests it should generate CTS interrupt.
However the correspoinding ICOLL register (ICOLL raw3, bit 16) shows 0,
which shows no IRQ from UART0 is activated.
STAT high (0xf1f0) stuats shows Present, Highspeed, BUSY, CTS, RXFE are set.
BUSY bit (bit 29) should NOT be all-time high, but when this issue happens it will never go down.
Does it mean the UART logic is hung up?
I suspected it will be IRQ handler messes up IRQ mask, but if the UART logic is locked up, this is serious issue...
I attached "debuart" Linux driver source code to peek registers.
You have to modify KERNEL_SRC path in Makefile according to your build environment.
Once you get debuart.ko,
# insmod debuart.ko
debuart:register major id=253
# mknod /dev/debuart c 253 0 (* only once needed)
# cat /dev/debuart
Will give you register dump of UART and ICOLL registers.