ドライバの使い方
// ドライバ制御関数
ULONG WINAPI PcieOpen();
void WINAPI PcieClose();
// 情報取得関数
ULONG WINAPI PcieGetDriverVersion();
BOOLEAN WINAPI PcieGetPropertyString(ULONG id,WCHAR buffer[256]);
BOOLEAN WINAPI PcieIsGenericDriver();
BOOLEAN WINAPI PcieGetBusNum(PULONG bus,PULONG dev,PULONG func);
BOOLEAN WINAPI PcieGetBar(ULONG barNum,PULONG startAddr,PULONG length);
BOOLEAN WINAPI PcieSetBar(ULONG barNum,ULONG startAddr,ULONG length);
BOOLEAN WINAPI PcieGetInterruptInfo(PULONG intLevel,PULONG intVector);
// コンフィグ空間読み出し関数
UCHAR WINAPI PcieReadConfigCharNT(ULONG bus,ULONG dev,ULONG func,ULONG offset);
USHORT WINAPI PcieReadConfigShortNT(ULONG bus,ULONG dev,ULONG func,ULONG offset);
ULONG WINAPI PcieReadConfigLongNT(ULONG bus,ULONG dev,ULONG func,ULONG offset);
UCHAR WINAPI PcieReadConfigChar(ULONG offset);
USHORT WINAPI PcieReadConfigShort(ULONG offset);
ULONG WINAPI PcieReadConfigLong(ULONG offset);
// コンフィグ空間書き込み関数
void WINAPI PcieWriteConfigCharNT(ULONG bus,ULONG dev,ULONG func,ULONG offset,UCHAR data);
void WINAPI PcieWriteConfigShortNT(ULONG bus,ULONG dev,ULONG func,ULONG offset,USHORT data);
void WINAPI PcieWriteConfigLongNT(ULONG bus,ULONG dev,ULONG func,ULONG offset,ULONG data);
void WINAPI PcieWriteConfigChar(ULONG offset,UCHAR data);
void WINAPI PcieWriteConfigShort(ULONG offset,USHORT data);
void WINAPI PcieWriteConfigLong(ULONG offset,ULONG data);
// メモリ空間読み出し関数
UCHAR WINAPI PcieReadMemChar(ULONG addr);
USHORT WINAPI PcieReadMemShort(ULONG addr);
ULONG WINAPI PcieReadMemLong(ULONG addr);
PUCHAR WINAPI PcieReadMemLongLong(ULONG addr,PUCHAR data);
PUCHAR WINAPI PcieReadMemBlock(ULONG addr,PUCHAR data,ULONG bytes);
// メモリ空間書き込み関数
BOOLEAN WINAPI PcieWriteMemChar(ULONG addr,UCHAR data);
BOOLEAN WINAPI PcieWriteMemShort(ULONG addr,USHORT data);
BOOLEAN WINAPI PcieWriteMemLong(ULONG addr,ULONG data);
BOOLEAN WINAPI PcieWriteMemLongLong(ULONG addr,PUCHAR data);
BOOLEAN WINAPI PcieWriteMemBlock(ULONG addr,PUCHAR data,ULONG bytes);
// DMA・割り込み関連関数
typedef void (WINAPI *CALLBACK_ISR)(ULONG reason);
TKDNPCIE_API BOOLEAN WINAPI PcieReadDMA(ULONG targetAddr,PUCHAR buf,ULONG length);
TKDNPCIE_API BOOLEAN WINAPI PcieWriteDMA(ULONG targetAddr,PUCHAR buf,ULONG length);
TKDNPCIE_API BOOLEAN WINAPI PcieRegistISR(CALLBACK_ISR isr);
これらの関数の詳しい使用方法については、後日紹介します。
DLLを使うサンプルプログラム
tkdnpcie.dllを使って、PCIの構成情報を得るサンプルプログラムを以下に示します。
#include "tkdnpcie.h" #include #include #include
int main() { setlocale(LC_ALL, ""); // WCHARの文字列を表示するために必要な宣言
int status = PcieOpen(); // デバイスドライバをオープンする printf("status = %d¥n",status); // ステータス0 (TKPE_OPEN_SUCCESS)が返ればOK if(status != TKPE_OPEN_SUCCESS) return 0; printf("driver version = %x¥n",PcieGetDriverVersion()); // ドライバのバージョンを表示 printf("is generic = %x¥n",PcieIsGenericDriver()); // 現在のドライバが汎用ドライバか? ULONG sa,len; PcieGetBar(0,&sa,&len); // BAR0空間の開始アドレスと長さを調べる printf("Bar0 = %x %x¥n",sa,len); printf("Cfg(0) = %08lx¥n",PcieReadConfigLong(0)); // コンフィグレジスタ0を読み出す
WCHAR buf[256]; for(int i=0;i<10;i++) { if(PcieGetPropertyString(i,buf)) // 物理デバイスオブジェクトから { // 返された様々な情報文字列を表示する wprintf(L"id(%d) = %s¥n",i,buf); } } PcieClose();
return 0; }
|
実行結果
6.問題点と今後の課題
現在判明している問題点と今後の改善すべき課題は下記のとおりです。
-
-
複数のプログラムで同時にドライバを開いた場合に、どういう動作をするかわからない
-
Windows Vista、Windows 2003 Server、Windows XP(64bit版)へ対応していない
-
複数のNP1025Aボードが存在している場合に、選択して開けない
-
プログラムがドライバをオープンしている状況で、デバイスを削除した場合に、PCの再起動を必要とする。
-
PCI Expressカードに割り当てられた範囲を超えて物理メモリを操作できてしまう。 安全のため、プロテクトをかけられるようにすることが望ましい。ULONGLONGサイズ(64bit)でメモリアクセスする機能がない。
-
SSE2命令(128bit)でメモリアクセスする機能がない。
※ただし、SSE2命令を使っても、RootComplexが2つの64bitアクセスに分割して しまうので、意味がありません。
そのため、当ドライバではWriteCombinedに対応させて64バイト(512bit)アクセスを可能にしています。 -
電源管理をもっと強化すべき
-
7.使用許諾条件
1.本デバイスドライバは、特殊電子回路株式会社(以下、甲と略す)の著作物であり、知的財産です。
2.本デバイスドライバは動作に関する保証は一切ありません。また、当デバイスドライバを使ったことにより、ユーザの機器や人命財産に損害を与えた場合でも、甲は一切その責を負わないものとします。
3.本デバイスドライバは、商用・非商用を問わず、NP1025用のデバイスドライバとして無償で使用することができます。
4.本デバイスドライバは、非商用の場合に限り汎用のPCI Expressデバイスドライバとして使用することができます。本ドライバを商用の用途で使用したい場合は甲に別途の許諾を受ける必要があります。
5.本デバイスドライバの再配布は禁止します。
6.リバースエンジニアリング、逆コンパイル、逆アセンブルなど、当デバイスドライバの配布物からソースコードを引き出そうとする行為を行ってはなりません。
7.使用許諾条件は予告無しに変更されることがあります。
8.本使用許諾条件を変更してはなりません。
再配布を行いたい場合や、汎用のPCI Expressデバイスドライバとして商用での利用を希望される場合は、下記のアドレスにメールでご連絡ください。
平成21年3月21日
特殊電子回路株式会社
Copyright(C) 2009 TokushuDenshiKairo Inc. All rights reserved.
info@tokudenkairo.co.jp