先日プリンターポートを壊したと報告したが、その原因はこれである。
そう、Flash ROM Writer の制御プログラムを作っていてその検証中にプリンターポートを壊してしまったのだ。
Pentium III を使っていた頃に作ったもので、もう6,7年前になるだろう。
当時の BIOS ROM は丁度 DIP から PLCC に切り替わる途中であった為、ベースは DIP にしておき PLCC はアダプターで対応しようと考えていたのだが、結局は DIP しか使わずアダプターを作っていなかった。
特に回路図は載せないが、写真でも判るように多くのラッチとバッファ、ゲートが少しと電源制御のリレーのみの単純な回路だ。構成としては、74HC574 のラッチを使い制御レジスタ 8bit と ROM のデータ 8bit、アドレス 23bit(1bit は制御で利用)を持ち 74HC245 で ROM のデータ読み込みを制御している。つまり、プリンターポートを 8bit の双方向バスとして使うような作りとなっている。
今回、何故これが必要になったかと言うと...
最近仕入れたノート PC の BIOS を書き換えて実験していたら、突然電源が入らなくなってしまった。「あ、BIOS 飛ばした!」と割と冷静に考えていた。そう、前に作った Flash ROM 切替機で簡単に復旧できると思っていたのだ。
しかし、そうは簡単ではなかったのだ!?
その BIOS を飛ばしてしまったノート PC では、シャドー RAM に BIOS ROM を読み込んでアクセスするようにはなっておらず常に Flash ROM をアクセスする物であった為だ。状況としては、正常に動く BIOS で起動して書き込みの寸前で Flash ROM を切り替えると、そのタイミングで電源が落ちてしまう。
このままでは電源が落ちてしまって Flash ROM を書き込むことが出来ない。
そこで、Flash ROM Writer を引っ張り出してきたのである。
作成時は MS-DOS 上で動くプログラムで制御していたが、その制御ソフトが入っている CD-R が読めなくなっていたので、今回は Windows 上で動くように VisualBasic で作ってみた。
VisualBasic からは直接ポートを制御できないので、フリーソフトで適当なアクセス用 DLL を使っているが、どの DLL でもそんなに差はないようである。
DLL 経由でポートをアクセスしてて更に Windows であることを考えるとアクセスのタイミングはそんなに意識しなくても良いだろうと単純に作っていたのだが、なかなか安定しない。
やはりタイミング的に厳しい部分があるのかとオシロスコープで探ってみると、制御用のラッチがリセットされてしまう場合があるようだ。タイミング的にはポートを出力から入力に切り替えてデータを読み込む時に消えてしまう。
そのタイミングを擬似的に連続して実行してみると...入力に切り替えてからバッファ出力をイネーブルにする時に制御レジスタのラッチに使っていた -STROBE に 0.5V 前後のノイズが載っている!
前回のプリンターポートを壊したレポートはこの辺り!?(笑)
マザーボード(ASUSTeK P4GE-V)のプリンターポートとインピーダンスが合わなかったのかデータ線の反射が -STROBE に出てしまったようだ。まあ、原因はインピーダンスであろうと思いデータ線に集合抵抗でプルダウンすると、綺麗な信号になり安定するようになったが、まだ読み込みでデータ化けがあるようだ。
更にアクセスタイミングを調べてみると...ありました。2つも!
1つは、ROM へ供給するデータとアドレスを持つラッチの動作で、ここは制御レジスタからの 2bit で 74HC138 のデコードからラッチを作っているが、データのホールド時間が足りなくなる。もう1つは、書き込み時のライトパルス幅が少なくて正常に書き込みできない。
適当なウェイトループやダミーステップを入れたら、完全に安定して動くようになった。
プリンターポートは IBM PS/2 の頃から基本的な仕様は変わらないが、Super I/O やサウスブリッジの中に組み込まれたので動作速度は使用する LSI で決まってくる。当然、CPU やチップセットが早くなれば、それなりにアクセスタイミングを考慮しなければならないようだ。
※33MHz は PCI バスでした。PC/AT の ISA バスは 8MHz です。
※入力が可能になったのは PC/AT の頃ではなく PS/2 になってからでした。
しかし、PC の速度は昔に比べてかなり速くなったものだ...
0 件のコメント:
コメントを投稿