[Armadillo:08631] Re: シリアル受信読出が途中で止まる

Yasuhisa Nakamura email@hidden
2013年 2月 26日 (火) 02:51:49 JST


中村です。

[Armadillo:08630]に追加です。

> 今回問題になっているポートのRXTLを1にします。
>
> #define UART1_UFCR_RXTL         16

データシートのRXTLの説明には
 A maskable interrupt is generated whenever the
 data level in the RxFIFO reaches the selected
 threshold.
と、また、UCR1のRRDYENには
 The fill level in the RxFIFO at which an interrupt
 is generated is controlled by the RXTL bits.
と書いてあるのですが、USR1のRRDYでは
 Indicates that the RxFIFO data level is above
 the threshold set by the RXTL bits.
となってます。

RXTLが"reach"、RRDYENが"fill level"、
ところが、RRDYでは"above"。

もしかしたらRXTLに0(zero)をセットかもしれません。
RXTLは0〜32がセットできるので、もし"reach"で
0だったら、受信データなしで割り込みかかりっぱなしに
なっちゃいます。

だけど、もしこれ(RxFIFOに一定バイトたまらないと
割り込みがかからない)が原因だったら、モデム相手に
"AT"とやったときに応答がちゃんと得られるのが
謎です。

-- 
なかむら


[Armadillo:08630]
> 中村です。
>
> [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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
>




armadillo メーリングリストの案内