特殊電子回路株式会社

 

 

特電について

トップ ページ製品情報JTAG情報設計サービス会社紹介

[トップ ページ][製品情報][PCI Expressサポートページ][PCI Expressデバイスドライバマニュアル]

 

特電PCI Express 汎用デバイスドライバの使い方

1.はじめに

    このデバイスドライバは、PCI Express用の汎用デバイスドライバです。このデバイスドライバを使うと、ユーザモードのプログラムからPCIバスのコンフィギュレーション空間とメモリ空間にアクセスすることができ、自作のアドインカードの制御を簡単に行うことができます。

    このドライバはPCI Express評価ボード(NP1025)用のデバイスドライバとしても使用でき、また、汎用のPCI Express用デバイスドライバとしても使用できます。

    もちろん、PCI ExpressではなくPCIの汎用ドライバとしてもご利用いただけます。

    このドライバは「何でもできる」という利便性と、間違った操作ができないという「安全性」の両立を目標に開発を行っております。

     

2.特徴

    従来の汎用ドライバと異なり、以下のような特徴を備えています。

    • WDMに対応した、正当な方法で作られている

    • PCIコンフィギュレーションレジスタの読み書きが可能

    • PCIボード(Express含む)上のメモリ空間の読み書きが可能

    • PCIバスドライバにアクセスして構成情報を得ている(コンフィギュレーション空間に直接アクセスはしない)

    • GUIDを用いた新しい方法でシンボリックリンクを作成している

    • CombinedWriteを用いて、64バイトサイズの書き込みリクエストを発行できる
      (CPU→PCI Express方向へのバースト書き込みは非常に高速)

     

3.使用方法

    @対応OS・バージョン

    Microsoft Windows 2000

    Microsoft Windows XP(32bit版)

    Microsoft Windows Vista(32bit版)

    Microsoft Windows 7(32bit版)

    Aファイルの説明

    tkdnpcie.sys         デバイスドライバの本体

    tkdnpcie.inf          インストールに使うファイル

    tkdnpcie.dll          使いやすくするためのAPI

    tkdnpcie.h           APIのヘッダファイル

    tkdnpcie.lib          インポートライブラリ(VisualC用)  ※DLLをリンクするプログラムを作成するときに使う

    tkdnpcie_bcc.lib    インポートライブラリ(BorlandC用)  ※DLLをリンクするプログラムを作成するときに使う

    readme.txt           この説明書

     

    Bカスタマイズ(PCI Express評価ボード用のデバイスドライバとして使用する場合のみ)

    カスタマイズの必要はありません。

4.インストール

    本デバイスドライバは、特電PCI Express評価ボードのデバイスドライバとして使用できるほか、汎用のPCI (Express) ドライバとしても使用できます。

    以下、評価ボード用にインストールする手順と、汎用ドライバとしてインストールする手順を示します。なお、汎用ドライバとしてインストールする場合はWidows2000とWindowsXP以降で若干異なりますので、両方の手順を示しています。

     

    なお、両方のタイプでインストールする場合は、先に特電PCI Express評価ボードのデバイスドライバとしてインストールしてください。

     

     

    @ PCI Express評価ボード用デバイスドライバとしてのインストール手順(Wndows XP)

    スタートメニューから「ファイル名を指定して実行」を行い、sysdm.cpl と入力し、コントロールパネルのシステムのプロパティを開き、デバイスマネージャを開きます。

    右クリックしてハードウェア変更のスキャンを実行します。

     

     


     

    PCI ExpressボードがDPIOモジュールとして検出されます。


     

    新しいハードウェアの検索ウィザードが開始しますので、「いいえ、今回は接続しません」を選択し、「次へ」をクリックします。


     

    次の画面では、「一覧または特定の場所からインストールする」を選択し、「次へ」をクリックします。

     


     

    「次の場所を含める」チェックしてtkdnpcie.inf ファイルのあるフォルダを入力し、「次へ」をクリックします。


     

    ファイルのコピーとドライバのインストールが行われます。


     

    右の画面が出たら完了です。


     


     

    A 汎用PCI(Express)ドライバとしてのインストール手順(Wndows XP)

    スタートメニューから「ファイル名を指定して実行」を行い、hdwwiz.cpl と入力します。
     

    ハードウェアのインストールウィザードが起動しますので、「次へ」をクリックします。


     

    右の画面が表示されるので、しばらく待ちます。


     

    はい、ハードウェアを接続しています」を選択します。


     

    新しいハードウェアデバイスの追加」を選択して、「次へ」をクリックします。


     

    一覧から選択したハードウェアをインストールする」を選択します。


     

    すべてのデバイスを表示」を選択し、「次へ」をクリックします。


     

    ディスク使用」を押します。


     

    特電PCI Expressコアを解凍したフォルダを入力します。


     

    PCI Express Generic Device Driver」を選択します。


     

    「次へ」を押します。


     

    右の図の画面が出たらインストールは完了です。


     


     

    B 汎用PCI(Express)ドライバとしてのインストール手順(Wndows2000)

    スタートメニューから「ファイル名を指定して実行」を行い、hdwwiz.cpl と入力します。
     

    ハードウェアのインストールウィザードが起動しますので、「次へ」をクリックします。


     

    デバイスの追加/トラブルシューティング」を選択し、「次へ」をクリックします。


     

    右の図の画面が表示されるので、しばらく待ちます。


     

    新しいデバイスの追加」を選択して、「次へ」をクリックします。


     

    いいえ、一覧からハードウェアを検索します」を選択します。


     

    その他のデバイス」を選択し、「次へ」をクリックします。


     

    ディスク使用」を押します。


     

    特電PCI Expressコアを解凍したフォルダを入力します。


     

    PCI Express Generic Device Driver」を選択します。


     

    「次へ」を押します。


     

    右の図の画面が出たらインストールは完了です。


     

    インストールが完了すると、デバイスマネージャに以下のように表示されます。

     

     

     

5.ソフトウェア開発方法

    はじめに

    特電PCI Expressドライバを使用するには、tkdnpcie.dllでエクスポートしている関数を利用します。

    プログラムを作成する際には、お客様が作成したプログラムとDLLをリンクする必要があります。

    また、お客様が作成したプログラムの実行時には、DLLをパスの通ったディレクトリに配置しておく必要があります。

     

    ヘッダファイルとインポートライブラリ

    お客様は、お客様が作成されたプログラムの中で、tkdnpcie.hをインクルードするようにします。

    そして、リンク時にインポートライブラリを使用します。

     

    具体的には、VisualCでコンパイルするには以下のように入力します。

    cl  your_program_source.cpp tkdnpcie.lib

     

    BorlandCでコンパイルするには以下のように入力します。

    bcc32  your_program_source.cpp tkdnpcie_bcc.lib

     

    VisualStudioや、Borland C++ Builderなどの統合環境で使用する場合には、上記のライブラリファイルをプロジェクトに追加してください。

     

    DLLでエクスポートされる関数

    tkdnpcie.dllでエクスポートされている関数を下記のとおりです。

     

    リスト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 <stdio.h>

    #include <wchar.h>

    #include <locale.h>

     

    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日

    特殊電子回路株式会社

 

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