« 特電PCI Expressコアを更新(V0.4) | トップページ | 32bitを超えるメモリアクセス »

2009.03.08

汎用PCI Expressデバイスドライバを作りたい

タイトルのとおりです。
Windows2000やXPで動く、汎用的なPCI Expressデバイスドライバを作ろうと思っています。

PCIであれば、すばらしい汎用ドライバが既にあります。
(「PCIバス&PCI-Xバスの徹底研究」に収録されている)

車輪の再発明といわれそうですが、せっかく作るのだから、
・PCI Express拡張コンフィギュレーション空間に対応させる
・WDM形式で作る
・HalAssignSlotResuorces関数を呼び出せるようにして、PCIのリソース再割り当てをいつでも実行できるようにする。

ようにしたいと思っています。

WDMというのは、Windows98やWindows2000以降のデバイスドライバで、INFファイルを使ってインストールするものです。
それに対して、NT形式というのもあります。NT形式は本来WindowsNT4.0のためのドライバですが、Windows2000やXPでも動きます。

どちらが良いかというのは一概にはいえません。

WDMのほうがもちろん高機能なのですが、インストールするのが面倒です。プラグアンドプレイ検出してもらわないと、インストールができません。(というか、やりかたがよくわかりません) なので、「汎用のI/Oポートアクセスドライバ」のようなドライバはインストールが難しそうです。

それに対して、NT形式のドライバは、ユーザーモードのプログラムの中から関数を2つか3つ呼び出してやれば、いつでも好きなときにインストール、アンインストールができます。ユーザの見えないところでいつのまにかカーネルモードのプログラムがインストールされて動くという、とてもとても恐ろしいことができてしまうのです。

ですが、WDMの汎用ドライバをやってみたいと思います。

それから、HalAssignSlotResuorces関数というのは、"WDMデバイスドライバプログラミング完全ガイド"という本を読んでいて見つけた関数なのですが、PCI(に限らず)のコンフィグ空間のレジスタを再設定してくれる便利な関数のようです。
パソコンが稼動中にPCI Expressのカードをいきなり差し込んだとしても、BAR0などのレジスタが初期化されていないのでアプリケーションはそのカードを認識できませんが、HalAssignSlotResuorces関数を呼び出してやるとBAR0などのレジスタが再設定されるそうなのです。

普通、FPGAを再コンフィギュレーションしたら、FPGA内のレジスタはすべて消えてしまいますので、この関数を使わないと、「FPGAを再コンフィギュレーションしたらパソコンを再起動してください」なんていう悲しいことになってしまうかもしれません。
この関数の呼び出しはぜひともデバイスドライバに組み込んで、ユーザモードからいつでも再認識プロセスを発行できるようにしてあげたいものです。

|

« 特電PCI Expressコアを更新(V0.4) | トップページ | 32bitを超えるメモリアクセス »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 特電PCI Expressコアを更新(V0.4) | トップページ | 32bitを超えるメモリアクセス »