[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 メーリングリストの案内