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