[Armadillo:09125] Re: ttymxc4 に対するselect()によるread()

Yasuhisa Nakamura email@hidden
2013年 8月 15日 (木) 09:33:33 JST


中村です。

[Armadillo:09120]で Yanagihara, Kosaku さんは書きました:
> Armadillo-440で/dev/ttymxc4からread()するプログラムを作成しており、
> ttymxc4をopen()し、select()で
>  (a) 戻り値がゼロ(タイムアウト)なら受信エラー
>  (b) 戻り値が正値なら受信処理(ttymxc4にread()発行)
>  (c) 戻り値が負値ならプログラムをエラー終了
> という、ありがちな処理を行なっています。
>
> そして、UARTデコード機能付きオシロをttymxc4に付けた状態で実験したところ、
> オシロでは文字データが観測されているにも関わらず、select()はタイムアウト
> してしまうという結果になってしまって困っています。

ttymxc4というと、UART5ですよね。
UART3(CON9の隣の列)やUART2(DSUB9)ではどうなりますか?
たぶん同じでしょうけど・・・

それから、select()を使わないでブロッキングでread()で
待ったときはどうなりますか?


> ソースを見てもよく理解できなかったので推測なのですが、約30バイト程度(マ
> イコンのFIFOかドライバかに)溜まらないと、read()から読み出せる所に受信デー
> タが転送されず、select()がttymxc4はブロックすると判断してしまうのではな
> いかと思っています。

シリアルドライバとハードウェアの動作としては、FIFOに1バイトでも
データがあれば、データはあがってくるようになっています。
(具体的説明は↓の方で)


> 約30バイトという数字については、[Armadillo:07492]に「i.MX25の場合、ハー
> ドウェア的な送信バッファは32Byte」という記述があるので、受信の場合も同程
> 度のバッファがあるのかも・・・と考えていますが、i.MX25のデータシートで
> その辺の具体的な説明を見つけることはできませんでした。
> (見つけた所で解決しませんが・・・)

受信FIFOの大きさは32バイトです。
32バイトまでためられますが、何バイトたまったらデータを
上げるか(割り込みを発生させるか)は、32バイト以下の値を
ソフトで設定するようになっていて、Armadilloの実装では
16になっているようです。
arch/arm/mach-mx25/serial.h の
#define UART5_UFCR_RXTL         16
というのがそれです。

もしそのバイト数まで溜まらなかったときにはどうなるかというと、
AGTIM(AgeingTimer)という機能が働いて割り込みを発生させます。
AGTIMの割り込み発生の条件は
  No read has occurred on RxFIFO and RXD line
  has stayed high, for a time corresponding to
  8 characters.
だそうです。

8バイト分の時間だけ待ってもデータが増えなければ割り込みを
発生させて、FIFOの中身をドライバに引き渡します。


上の方で、
| シリアルドライバとハードウェアの動作としては、FIFOに1バイトでも
| データがあれば、データはあがってくるようになっています。
と書きましたが、ハードウェアに問題があると、上がってこなくなる
こともあります。(See [Armadillo:08628]〜[Armadillo:08651])

-- 
なかむら




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