製品情報>販売終了製品>特電PCI Express評価ボード>ドライバの使い方

ドライバの使い方

リスト1 デバイスドライバ制御用関数一覧

// ドライバ制御関数

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の構成情報を得るサンプルプログラムを以下に示します。

リスト2 tkdnpcie.dll使用例

#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デバイスドライバとして商用での利用を希望される場合は、下記のアドレスにメールでご連絡ください。

info@tokudenkairo.co.jp

平成21年3月21日

特殊電子回路株式会社

 IPコアサポートページへ戻る

 

Copyright(C) 2009 TokushuDenshiKairo Inc. All rights reserved.
info@tokudenkairo.co.jp

 

 


© 2017 TokushuDenshiKairo Inc. All rights reserved