[Armadillo:08630] Re: シリアル受信読出が途中で止まる
Yasuhisa Nakamura
email@hidden
2013年 2月 26日 (火) 00:24:33 JST
中村です。
[Armadillo:08629]で
> 試しに、mxcuart_rx_chars()の入り口のところにある
> max_count = 256
> を変更したらどうなります?
と思いつきで書きましたが、これは外れだったような気がします。
> <*>去年の夏ころ、このドライバのバグをいくつか見つけました。
のときは送信の方ばかりを見ていましたが、
受信の方もじっくり読んでみました。
ソースはlinux-2.6.26-at16のものを使ってます。
2つ試していただけますか?
●その1
--- mxc_uart.c-orig 2012-07-26 21:30:37.000000000 +0900
+++ mxc_uart.c 2013-02-25 23:57:02.000000000 +0900
@@ -282,15 +282,17 @@
static void mxcuart_stop_rx(struct uart_port *port)
{
uart_mxc_port *umxc = (uart_mxc_port *) port;
- volatile unsigned int cr1;
+ volatile unsigned int cr1, cr4;
- cr1 = readl(port->membase + MXC_UARTUCR1);
if (umxc->dma_enabled == 1) {
+ cr1 = readl(port->membase + MXC_UARTUCR1);
cr1 &= ~MXC_UARTUCR1_RXDMAEN;
+ writel(cr1, port->membase + MXC_UARTUCR1);
} else {
- cr1 &= ~MXC_UARTUCR1_RRDYEN;
+ cr4 = readl(port->membase + MXC_UARTUCR4);
+ cr4 &= ~MXC_UARTUCR4_DREN;
+ writel(cr4, port->membase + MXC_UARTUCR4);
}
- writel(cr1, port->membase + MXC_UARTUCR1);
}
/*!
@@ -1231,7 +1233,10 @@
cr1 |= (MXC_UARTUCR1_RXDMAEN | MXC_UARTUCR1_ATDMAEN |
MXC_UARTUCR1_UARTEN);
} else {
- cr1 |= (MXC_UARTUCR1_RRDYEN | MXC_UARTUCR1_UARTEN);
+ cr = readl(port->membase + MXC_UARTUCR4);
+ cr |= MXC_UARTUCR4_DREN;
+ writel(cr, umxc->port.membase + MXC_UARTUCR4);
+ cr1 |= MXC_UARTUCR1_UARTEN;
}
writel(cr1, umxc->port.membase + MXC_UARTUCR1);
面倒だったら、前半のmxcuart_stop_rx()の方は
放置でもテストには影響はないと思います。
コンパイルが通ることは確認しましたが、
動作の確認はしていません。
修正内容を理解した上で、やってみてください。
●その2
(その1のパッチはあてずにmxc_uart.cはオリジナルの状態で)
arch/arm/mach-mx25/serial.h の次の部分のうち、
今回問題になっているポートのRXTLを1にします。
#define UART1_UFCR_RXTL 16
...
#define UART2_UFCR_RXTL 16
...
#define UART3_UFCR_RXTL 16
...
#define UART4_UFCR_RXTL 16
...
#define UART5_UFCR_RXTL 16
"当たり"ならいいのですが・・・
--
なかむら
armadillo メーリングリストの案内