INtimeドキュメンタリトップへ

PCIボードを検出しろ!!

10月10日・・・PCIボードを検出できない!?

どうしたんだ!!PciFindDevice()どうして検出できないのか?

なぜ?

ボードはきちんと挿入しているのに・・・。 テストのためINtime®ウィザードで自動生成されるユーティリティコールGetPciInterruptLevel()で試してみたが、結果は同じだったのです。

以下はGetPciInterruptLevel()です:


/*****************************************************************************
*
* FUNCTION: GetPciInterruptLevel
*
* PARAMETERS: 1. PCI  Vendor ID
*             2. PCI Device ID
* 
* RETURNS: エンコードされた割り込みレベル、または失敗時   0xffff
*
\*****************************************************************************/  
WORD         GetPciInterruptLevel(
   WORD                   wPciVendorId,
   WORD                   wPciDeviceId)
{
   static const BYTE    irq2level[] = {
           IRQ0_LEVEL, IRQ1_LEVEL,IRQ2_LEVEL, IRQ3_LEVEL,
           IRQ4_LEVEL, IRQ5_LEVEL, IRQ6_LEVEL, IRQ7_LEVEL,
           IRQ8_LEVEL, IRQ9_LEVEL, IRQ10_LEVEL, IRQ11_LEVEL,
           IRQ12_LEVEL, IRQ13_LEVEL, IRQ14_LEVEL, IRQ15_LEVEL };
  PCIDEV	                     dev;

  dev.wVendorId = wPciVendorId;
  dev.wDeviceId = wPciDeviceId;   
  dev.wDeviceIndex= 0;     // はじめに検出されたデバイス
  if (!PciFindDevice(&dev))
          return 0xFFFF;    // デバイスは見つからない

  if (dev.byIntLine > 15) 
           return 0xFFFF;    // このデバイスにはIRQがないか、認められないIRQ値である
  return irq2level[dev.byIntLine];
} 
この関数の第一引数はベンダーID,第二引数はデバイスIDです。私はこの関数に直接ベンダーID、デバイスIDを指定しました:

WORD intLevel; IntLevel = GetPciInterruptLevel( 1221, 8153 );


途中経過

結果0xffffが返却されました。どうしてなのでしょうか?

(回答) ベンダーID、デバイスIDは正しいでしょうか? CONTEC PCIバス対応 非絶縁型多チャンネルアナログ入力ボード AD12-16(PCI)のベンダーIDは0x1221、デバイスIDは0x8153ですよ。


だからベンダーID:1221、デバイスID:8153に・・・・はぅっ!?!

≪また・・・またやってしまった!!≫


0x1221(16進数) = 4641(10進数)  私の指定した数値:1221(10進数)
0x8153(16進数) = 33017(10進数) 私の指定した数値:8153(10進数)


「まだ10進数と16進数の違いに自然に対応できない私のケアレスミスでした・・・。」


INtime®ウィザードの割り込み処理ダイアログ
ここで入力した値で10進数、16進数を意識せず、ベンダーID(Vendor ID)1221、デバイスID(Device ID)8153と入力してしまっていたのでしょう。
この後正しく指定すると、まったく問題なくボードを認識していることが分かりました。

自動生成されたソースコード上では:

/*****************************************************************************
*
* FUNCTION:    nt1Init
*
* PARAMETERS:  なし
*
* RETURNS:     BOOL 処理の成功を意味します
*
* DESCRIPTION: 割り込みを扱える状態に設定します
*                割り込みハンドラと割り込みスレッドを使用します
\*****************************************************************************/

BOOL Int1Init(void)
{
   wLevel		= GetPciInterruptLevel(0x1221,0x8153);
   if(0xFFFF == wLevel)                        ここで指定しています
          return FALSE;

   SetRtProcessMaxPriority(NULL_RTHANDLE, 0);

   return (CreateRtThread(0, Int1Thread, 4096, 0)
                           != BAD_RTHANDLE);
}

結果

それでは「割り込みレベル」で指定するの"PCI based"とは?

(回答)
PCIバスデバイスの場合、その動作モードによりOSがPCIバスのIRQが動的に設定する場合があります。"PCI based"ではPCIの割り込みレベルを取得する関数GetPciInterruptLevel()を使用してIRQレベルを取得する必要があります。



「なるほど・・・」



※TenAsys®, INtime®, eVM® and iRMX® are registered trademarks in USA of the TenAsys Corporation.