[Armadillo:08293] Armadillo-400 シリーズのハードウェアフロー制御関連の問題修正

Yasuhisa Nakamura email@hidden
2012年 9月 3日 (月) 04:46:32 JST


中村です。

Armadillo-400シリーズ(試したのは420と440)のシリアルドライバの
ハードウェアフロー制御関連(他もあり)の問題修正レポートです。

興味のある方、あるいは同じような現象に遭遇したことのある方、
修正コード(パッチ)を添付しますので、試してみてください。

使ったソースは、linux-2.6.26-at15 の drivers/serial/mxc_uart.c です。

ドコモのFOMA UM02-F専用アダプタセットでpppをするときに、pppdの
オプションにcrtsctsを設定したらモデムとの通信が一切できなくなった、
というのが調査のきっかけです。
ドコモのモデムでの問題が下の一覧の(1)で、(2)以降は(1)の調査のときに
見つけた別の問題です。
解決の順番は(1)が最後になりました。

調査は、ソフトは自作の簡単なプログラム、stty、tipなどを、
ハードはヌルモデム(クロスケーブル)で別のパソコンにつないだり、
TXD/RXD、RTS/CTS、DTR/DSR/DCDをコネクタのところでジャンパして
ループバックしたり解放したり、で行いました。

問題箇所はいくつかあります。
(1) crtscts時、CTSがOFFで開始するとCTSをONにしても送信できない
(2) ioctl(fd, TIOCMGET, &modem)でDSRの状態を取得できない
(3) -crtscts時、RTSをONにしてCTSがOFFだとデータを送信できない
(4) 送信割り込み処理で、tx_chars()が必要以上に何度も繰り返しコールされる
(5) 送信割り込み処理で、終了条件としてTXFEを待っている

以下、それぞれの詳細(症状と解決法)です。

(1) crtscts時、CTSがOFFで開始しるとCTSをONにしても送信できない

ドコモのFOMA UM02-F専用アダプタセットは、CTSが上がるのが
少し遅れがあるため、この問題が発生します。
(他に安川のD2-k's1やサン電子のP100なども使ったことがありますが、
そのときにはこの問題には気づきませんでした)

CTSをOFFにして
  stty -F /dev/ttymxc1 -crtscts
  tip -r -F /dev/ttymxc1
を実行すると、あとからCTSをONにしてもデータを送信できない。
(詳しく調べてみると、CTS=OFFの間も、CTS=ONにした後も、
ドライバの送信バッファからチップのFIFOへのデータ書き込みが
一切行われていない。)

しかし、
  stty -F /dev/ttymxc1 crtscts
  tip -r -F /dev/ttymxc1
ならば、後からCTSをONにしたときに、それまでの送信しようとしていた
データを送信し始める。
(この場合は、CTS=OFFの間でも16バイトまではドライバの送信
バッファからチップのFIFOへ書き込みが行われ、CTS=ONになると
FIFOからデータが送信される)

解決方法
 i.MX25のハードウェアによるハードウェアフロー制御を使う設定のとき
 (UART2はこれがデフォルトです)、CTS(レジスタ名ではRTS)の変化は
 監視しないようになってたが、crtsctsでもCTS変化の割り込みを有効にして、
 CTSがONになったときにコアドライバへ通知するようにした。


(2) ioctl(fd, TIOCMGET, &modem)でDSRの状態を取得できない

これを処理するのは mxcuart_get_mctrl() で、CTS, DCD, RI は
値を取得しているのですが、DSRの読み出しを行っていません。

解決方法
 i.MX25にはDSRの現在値を読み出すレジスタがないようなので、
 (linux-2.6.26-at15のmxc_uart.cだけでは)どうすることも
 できないようです。

 ところが・・・今年7月リリースのlinux-2.6.26-at16では、
 UART1_TXDピンの使い方を変更して(UART2のDSRではなくGPIOの
 4-23に変更して)、GPIOとして読み出せるようにしていました。
 (こっそりと修正されていたのですね。7月の「製品アップ
 デートのお知らせ」に書いてあるのを、問題調査の後に
 見つけました)

 ということで、この問題はlinux-2.6.26-at16を使うことで
 解決しますので、このメールのパッチには含まれていません。


(3) -crtscts時、RTSをONにしてCTSがOFFだとデータを送信できない

ハードウェアフロー制御を行わないときには、CTSの状態によらずに
データを送信できるべきですが、CTS=OFFのときデータを送信できません。
(確か8251AというICはCTS=OFFでは絶対に送信できませんでしたが...)

解決方法
 i.MX25のハードウェアによるハードウェアフロー制御を使う設定のとき、
 常に(フロー制御の設定によらず)CTSCをセットしていた。
 -crtsctsのときは、CTSCをセットしないようにした。


(4) 送信割り込み処理で、tx_chars()が必要以上に何度も繰り返しコールされる

tx_charsやstop_tx関数の入り口あたりにprintkを入れて実行してみば
すぐにわかりますが、たとえば、tipコマンドで1文字送信すると、
tx_charsが繰り返し何度も(100回以上?)コールされます。
送信データないとき、tx_charsはstop_txをコールしますから、
stop_txも同じ回数だけ無駄にコールされます。

解決方法
 割り込み処理のループの中でUCR1レジスタを読み直していないのが原因。
 ループの中でUCR1レジスタを読み直しするようにして解決。


(5) 送信割り込み処理で、終了条件としてTXFEを待っている

適当な場所にprintkを入れて監視すればわかますが、TXFEになるまで
(送信シフトレジスタが空になるまで)データ送信の割り込み処理が
終了しません。

解決方法
 送信割り込みの処理ループの狩猟条件からTXFE==0をはずした。
 また、送信データがあり送信レジスタへの書き込み可能な条件では
 ループを継続すべきなので、この条件を付け加えた。


お暇な方・・・ぜひぜひ、パッチをあてて動かしてみてください。

-- 
なかむら@眠い
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: mxc_uart.patch
型:         text/x-diff
サイズ:     5725 バイト
説明:       無し
URL:        <http://lists.atmark-techno.com/pipermail/armadillo/attachments/20120903/5fb9e4d7/attachment.patch>


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