役に立つと思われるシリアル関連のちょっとしたテクニックを紹介します。
テキスト端末では EIA-232 は十分高速ですが、許されるケーブル長が短す ぎることはよくあります。この問題は平衡型伝送技術により解決します。 テキスト端末で平衡型伝送を行うための一般的な方法は、シリアル回線に 2 つのラインドライバをインストールして、非平衡型から平衡型への変換(およ び逆変換)を行うことです。これは特殊な機器であり、新しく買うとなると高 価でしょう。
IBM 8514 ボード(など)の I/O アドレスは 0x?2e8 と言われています(?
は 2, 4, 8, 9 のいずれか)。
シリアルポートがアドレスを展開する時に 16 進値の先頭の 0 である桁を
無視する(多くのシリアルポートはそのように動作します)場合には、これは
0x02e8 にある ttyS3
の I/O アドレスと衝突します(ただし
シリアルポートがうまく設計されていれば衝突しないはずです)。
これは、このアドレスで ttyS3
を使おうとしている人には困った話です。
これとは別の問題で Linux は ttyS3
にある内蔵モデムを検出で
きませんが、setserial
を使ってこのアドレスに ttyS3
を置
けば、モデムはうまく動作するでしょう。
これは割り込みと UART の状態レジスタが競合するという問題です。UART のトランスミッタがバイトデータの送信を終え、UART の送信バッファが空に なると(送信バッファは次のバイトデータを待ちます)割り込みが発行されます。 しかし UART の状態レジスタは、これが十分反映されるほど速く更新されま せん。 その結果、割り込みサービスルーチンが高速なチェックを行うと、何も 起こっていないと(間違って)判断します。したがって、次に転送すべきバイト データはシリアルポートに送られず、UART のトランスミッタは届くことのな いバイトデータを虚しく待ち続けることになります。割り込みサービスが状態 レジスタをチェックするまでの待ち時間がもう少し長ければ、実際の状態が反 映され、全てがうまく行くはずなのですが…。
シリアルドライバにパッチを当てることにより、この問題を解決しようという 提案もあります。しかし、欠陥ハードウェアに対応するために Linux にパッ チを当てるべきでしょうか? しかも問題ないハードウェアでの性能が落ちるか もしれないのに。