FreeBSD(98)のシリアルドライバ



FreeBSD(98)のシリアルドライバに関する現状と対策
FreeBSD(98)でダイアルアップ接続を行っている方はたくさんいると 思われますが、現時点でリリースされているFreeBSD(98)では、 シリアルドライバに関してはいろいろと問題点がありますので、 整理してみます。なお、このドキュメント中で、PC-9801シリーズ と書いてあるものは、基本的にはPC-9801Fxシリーズあたりまでの 古いアーキテクチャを指します。それ以降のマシンは、型番と サポートされている機能の対応が明確につけにくいので、適宜 読み変えて下さい。


基礎知識 - DCE速度とDTE速度って、なに?
例えば、モデムを使って33600bpsでプロバイダに接続しようと いう場合、通常、PCとモデムの間の通信速度は33600bpsでない ことが一般的です。モデム同士ないし、モデムとプロバイダの コミュニケーションサーバ等の接続先との間の速度(この場合33600bps)を DCE(Data Circuit Terminating Equipment)速度、モデムとPC間の速度を DTE(Data Terminal Equipment)速度と呼びます。 DCE速度はモデム同士が接続する際に相手の通信速度や回線状況に 合わせて決められますが、DTE速度はPC側のシリアルポートの 設定によって決まります(たとえば、IIJ-PPPなどの設定するス ピードはこれのことです)。通常DTE速度はDCE速度より高速な スピードで、モデムとPCの双方がともに利用できるスピードに 設定します。


PC-9801シリーズにおける話
まず、NEC PC-9801シリーズでは、8251というシリアルチップの 系列が採用されました。実はこのチップは、USART (Universal Synchronous-Asynchronous Receiver/Transmitter: 汎用同期-非同期送受信装置)である事から、同期通信をサポート していますが、今の所FreeBSD(98)ではサポートしていませんし、 同期通信をサポートしているモデム等も一般的には見られません ので、特に問題はないでしょう。

それから、PC-9801シリーズのシリアルポートは、非常に大きな 制約があります。実はPC-9801シリーズは公式にはDTE速度が9600bps までの通信しか保証していません。なぜこんな制約があるのでしょう? 高速な(現在から見れば非常に遅いのですが、当時はこれでも 早かった)通信にICが対応できないから、というのも1つの理由と して考える事ができるのですが、もう1つ重要な理由があります。

PC-9801シリーズには、システムクロックに1996800Hzを採用 している "8MHz系" と呼ばれるマシンと、2457600Hzを採用して いる "5MHz系"(10MHz系と呼ばれる場合もあります)のマシンがあります。 例えばPC-9801UX/VX/RA/DA/BXなどは5MHz系ですし、PC-9801RS/FAなどは 8MHz系のマシンです。この辺の時代だと、本体のクロック周波数 が5の倍数だと5MHz系、8の倍数だと8MHz系だと思えば間違いない でしょう。本体のクロックが12MHzというマシンがありますが、 この辺は10MHzに分類されたと思います。なお、PC-9801NS/Tは、 本体のクロックは20MHzなんですが、システムクロックは8MHz系 なのでちょっと注意が必要です。

さて、PC-9801でのシリアル通信は、一般的には8251の1/16分周 モードというのを使用しています。ここで、9600bpsで通信を行う 事を考えてみましょう。1/16モードを使用する場合、8251に入力 するクロックは、9600*16=153600Hzとなります。このクロックを生成 するのに、9801シリーズではプログラマブルタイマ 8253 を 使用します。(8253は入力された信号を整数分の1に分周する働きが あります)。5MHz系の場合、システムクロックは2457600Hzなので、 8253にセットする値は、
2457600/153600 = 16
となります。また、8MHz系の場合、システムクロックは1996800Hz なので、8253にセットする値は
1996800/153600 = 13
となります。つまり、8253にセットする値はそれぞれ16と13に なります。

次に19200bpsで通信を行う事を考えてみましょう。同様に 計算を行うと、5MHz系のマシンは
2457600/307200 = 8
となります。ところが、8MHz系のマシンは
1996800/307200 = 6.5
となります。あれ? 整数値でなくなってしまいましたね。 前にも書いた通り、8253に設定する値は整数値でなければ なりません。小数になってしまうという事は、8MHz系の マシンの場合、どうやっても19200bpsでの通信を行う事が できないわけです。
同様に38400bpsでの通信を考えると、5MHz系だと
2457600/614400 = 4
で問題は無いですが、8MHz系だと
1996800/614400 = 3.25
となり、やはり通信を行う事はできません。

では、8MHz系のマシンにおいて、切れの良い整数値を渡したら どうなるでしょうか? ちょっとやってみましょう。例えば、 8253に"6"を渡すとすると、
1996800/(16*6) = 20800
となる事から、通信速度は20800(bps)になります。同様に、 "3"を渡すとすると
1996800/(16*3) = 41600
となる事から、通信速度は41600(bps)になります。ということは、 モデムがこのような通信速度に対応していればこの速度で 通信できそうです。

(ちなみに、5MHz系のマシンにおいても、8253に"3"を渡す事に より、51200(bps)での通信を行う事ができるようです)

このような半端な速度は一般的なモデムではサポート されていませんが、「国産の」モデムの中には、このような 半端な通信速度をサポートしたモデムがあります。例えば 私が最初に買った、PC-9801FA2も、8MHz系のマシンであるために、 38400bpsでの通信を行う事はできないのですが、OMRONのME1414BII というモデムは、20800bpsや41600bpsでの通信をサポートして いるため、かなり快適にパソコン通信などを行えました。

ちなみに、5MHz系のマシンにおいて、
2457600/16/76800 = 2
と考えると、もっと早い速度での通信もできそうな気がしますが、 ハードがついて来ない等の理由で、現実的には無理でしょう。

もし、古いパソコンを活用してパソコン通信をやったり、 インターネットに接続しようと考える場合で、本体が8MHz系の時は、 最新のモデムを買うよりも、14400bps程度の国産の中古モデムを 探して使用した方が、幸せになれるかもしれません。また、 どうしても最新のモデムが使いたいのならば、素直にシリアル ボードを買った方がよろしいでしょう。


PC-9821シリーズにおける話(1st serial)
PC-9821シリーズになると、話が非常に複雑になります。PC-9821 のシステムクロックは全てのマシンで5MHz系となることから、 PC-9801シリーズと互換のシリアルポート(1st serial)において、 先程説明した方法を使えば、38400bpsでの通信を行う事は可能です。 また、機種によっては、 というマシンが出て来ました。次に、これらの機種について説明します。

まず、「19200bpsサポート」の機種ですが、これは先程説明 したものと全く同じ制御方法を使うだけですので、特に何もする 必要がありません。通信速度として、19200bpsを指定するだけ です。

次に、FIFOのサポートに関してですが、FreeBSD(98)ではFIFOの サポートは「全く」されていません。現状では対応パッチもありません。 したがって、38400bps以上での通信では、取りこぼし等が起きる 可能性が非常に高いです。FIFO無しだと、5.5Kbps程度が最高だと 思った方が良いかもしれません。ちなみにNetBSD/pc98の開発者向けの 最新版では、FIFOのサポートもされていますので、将来的にFreeBSD(98) でもサポートされる可能性はあるでしょう。

最後に115200bpsでの通信ですが、これは従来のように分周比と 通信速度によって決まる物ではなく、「クロックディバイダ」と 呼ばれる物を制御する事によってクロックを生成している事から、 これもまたFreeBSD(98)ではサポートしていません。しかし、 FreeBSD(98)2.2.x(基本的には2.2.5が対象です)では、高橋さんが 作成されたパッチを適用する事によって、115200bpsでの通信など を行う事はできるようになります。このパッチは、 http://wyvern.cc.kogakuin.ac.jp/~nyan/FreeBSD/sio.html から入手する事ができます。


PC-9821シリーズにおける話(2nd serial)
PC-9821シリーズでは、後にシリアルポートを2つ持ったマシンが 登場しました。25pinのポートは(1st serial)などと呼ばれる のに対し、新設された9pinのポートは(2nd serial)などと呼ばれます。 2nd serialは、従来のように8251をベースにした物ではなく、 PC機で一般的に用いられている、8250をベースにした物となって います。8250はUART (Universal Asynchronous Receiver/Transmitter: 汎用非同期送受信装置) という名前からわかるように、同期通信を行う事ができないですが、 一般的には、PC機での同期通信は利用されていないので問題はない です。なお、現在は8250をベースにした、16550などが広く使われて おります。

PC-9801シリーズでも、拡張スロット(いわゆるC-bus)に増設する シリアルボードなどに16550が用いられていた事から、比較的一般 的に使用されています。16550関連のFreeBSD(98)では、FreeBSD(98) 1.x の時代にMicrocoreの製品に対応した事から、デフォルトでは Microcoreの製品が使えるようになっています。

ところが、現在のFreeBSD(98)コードは、IO portの番号などを 書き換えて実現するという、かなり強引な方法を取っているため、 その他のボードにも対応しようと思うと、途端に困難になります。 ポートなどを指定している部分を捜し出して、直接書き換えると いう、面倒な作業が待っているわけです。PC-9821に標準で16550互換の ポートがついていたりすれば、当然何もしなくても使えるもんだ、 と思われがちですが、上記のような理由で現在ではそのままでは 使えません。

これを逆に考えれば、誰かがパッチを用意してくれれば良いわけ です。過去にいろいろな人がパッチを用意したようですが、現在では 森田さんのページに、FreeBSD(98) 2.1.xおよび2.2.x用のパッチ がありますので、ここを参照される人が多いようです。このページ にあるパッチを当てれば、2nd serialに関しては使えるようになり ます。


最後に

1st serialでも2nd serialでも115200bpsでの通信が行えて、 更に増設シリアルボードも使いたい、という場合はどうでしょう? 残念ながら今のFreeBSD(98)のソースコードをちょっと手直しする程度では できません。ですが、実は 高橋さんの所から入手できるパッチ は、config ファイルに、flags行を追加するだけで各種ボードを サポートしよう、というコンセプトの元に作成されたパッチなので、 このパッチを当てて適切にカーネルを再構築すれば、ほとんど全て のボード等に対応する事ができるようになります。このパッチは将来の FreeBSDのソースで統合される予定なのですが、パッチの動作チェック が進んでいない事から、まだマージされていません。このパッチは 現在FreeBSD98-testers MLでテスト中 ですので、是非動作チェックに御協力下さい。


FreeBSD(98) 非公式ガイドのホームページに戻る
ホームページに戻る

karl@spnet.ne.jp
karl@jp.freebsd.org