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