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)サポート
- 115200bps(FIFO)サポート
というマシンが出て来ました。次に、これらの機種について説明します。
まず、「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