0

DOS用のアプリケーションを開発しています。パラレルポート経由で通信する必要があります。

現在、どの PCI 関数の BAR (ベース アドレス レジスタ) にそのパラレル ポートのベース アドレス (つまり、データ ポート アドレス) が含まれているかを判断する方法に行き詰まっています。:?

正確には、特定の BAR にそのパラレル ポートのベース アドレスが常に含まれるという業界の慣習、標準、またはデファクト スタンダードはありますか?

そうでない場合、その PCI パラレル ポートのベース アドレスを特定するにはどうすればよいですか (PCI 拡張カードまたは mobo に統合されているかどうか)。

実は、私はPCI 拡張カードのパラレル ポートに関心があります。私の知る限り、BIOSはこれらについて知りません。BIOS はリソースを PCI カードにのみ割り当てます。それだけです。そのため、BDA にそのようなパラレル ポートのエントリがない可能性があります。BIOS の製造元は、モボが持つすべてのデバイスについてしか知らないからです。

たとえば、PC では、pci 拡張カードに 4 つのパラレル ポートをインストールしましたが、mobo には 1 つのパラレル ポートが統合されています。他の 2 つのパラレル ポートのエントリはどこに行くのでしょうか?

そのため、BIOS には、チップセットまたはマザーボードに統合された3 つのパラレル ポートのみのエントリがあるようです。したがって、mobo にインストールされている PCI 拡張カードのパラレル ポートのベース アドレスを取得するには、PCI BAR を読み取る必要があると思います。

ありがとう

4

2 に答える 2

2

パラレル ポート (シリアル ポートを含む) のメモリ ベースのリストは、3 つのエントリのみに制限されています ( IBM PC では元々 4 でした)。これは、プラグ アンド プレイ(PnP) テクノロジがまだ存在しない古い ISA ベースのシステム用に設計されています。

新しいシステムでは、BIOS PnP 機能を使用して PCI ベースのパラレル ポート デバイスを検出する必要があります。これには、すべての PCI デバイスをスキャンして、 Parallel Portのサブクラスを持つCommunication Deviceクラスの PCI デバイスを見つけることが含まれます。Intel のプラグ アンド プレイ BIOS 仕様は、 Intel の Web サイト(PDF ファイル) またはACPI Web サイトから直接入手してください。そのドキュメントには、PnP BIOS 機能にアクセスする方法が記載されています。

一部のシステムにはまだオンボードのパラレル ポートがあるため、BIOS メモリを使用してその存在を検出する必要があることに注意してください。オンボードのパラレル ポートが 3 つ未満の場合は、追加の PCI ベースのパラレル ポートもそのメモリにリストする必要があります。ただし、BIOS にバグがある可能性があるため、そうではないと想定することをお勧めします。そのため、メモリと PnP BIOS の両方からの検出結果を組み合わせて、重複を削除します。

実際のパラレル ポートを検出して、それが存在し動作していることを確認したい場合は、VirtualBox の BIOSアセンブリ ソース コード(元はBochsの BIOS から) を確認してください。具体的にはdetect_parport機能。

編集: PCI デバイスの現在の構成の詳細。

PCI デバイスの現在の構成は、拡張システム構成データ(ESCD) に格納されます。これは、一部の BIOSではNVRAMとも呼ばれます。そのデータを取得する方法は、PnP BIOS 仕様の関数0x41および0x42で説明されています。ただし、ESCD 仕様は PnP BIOS 仕様とは別のものです。こちらから入手できます(PDFファイル)。

Intel の Web サイトからのリンクが見つかりませんでした。申し訳ありません。以前はこれらの古い仕様を提供していて、Web サイトから検索することもできましたが、現在は見つけるのが困難です。私はまだRTF形式のままでした。その PDF ESCD仕様は最後のバージョンのようで、バージョン 1.02A である私のものと同じです。

于 2012-08-24T03:27:04.147 に答える
0

BIOSで構成された組み込みのパラレルポートがある場合、ベースアドレスを介してPCIパラレルポートにデータを送信できないことがわかりました。そのPCIパラレルに送信する1つの方法は、BIOSでパラレルポートを無効にすることです...

私はすでにこのシナリオをテストしており、私の側では問題なく動作します。

ただし、ビルトイン ポートや pci パラレル ポートなどの多くのポートを使用する場合は、ビルトイン ポートに io ベース アドレスを使用できますが、pci パラレル ポートの場合は、pci パラレル ポートの製造元が提供するドライバーを知る必要があります。 ...システムが提供するドライバーの場合、パブリックioctlを介して、または通常のファイルとしてドライバーにアクセスすることにより、ドライバーをフックする方法があるかもしれません..

Windows 7で実行されている汎用ポートを使用しました。

于 2012-09-06T02:23:58.610 に答える