FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Xilinxのデバイスドライバ向け関数の勉強

Zedboard のチュートリアルを進めている。とりあえず、Xilinxデバイスドライバを叩いてLEDを光らせたり、タイマを使ったり、スイッチから値を読む方法について勉強した。 結構初期化とか、値を読み込むのとかが大変だ。

XStatus XGpio_Initialize (XGpio * InstancePtr, Xuint16 DeviceId) 

InstancePtrというやつがGPIOの実際のインスタンスになるようで、各関数でこれを渡すことで、操作ができるようになる。

  • XGpio_SetDataDirection(&GPIOInstance_Ptr, 1, 1); // 入出力の方向を決める?
  • XTmrCtr_Initialize (&TimerInstancePtr, XPAR_AXI_TIMER_0_DEVICE_ID); // タイマーを初期化する
  • XTmrCtr_SetHandler(&TimerInstancePtr, Timer_InterrptHandler, &TimerInstancePtr); // タイマーのハンドラを初期化する。 ちなみに、Timer_InterruptHandlerは以下のように宣言されている。
void Timer_InterrptHandler (void *data, u8 TmrCtrNumber)
{
    print ("\r\n");
    print ("\r\n");
    print ("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n");
    print (" Inside Timer ISR \r\n");
    XTmrCtr_Stop (data, TmrCtrNumber);
    // PS GPIO Writing
    print ("LEd 'LD9' Turn ON\r\n");
    XGpioPs_WritePin (&psGpioInstancePtr, iPinNumber, 1);
    XTmrCtr_Reset (data, TmrCtrNumber);
    print ("Timer ISR Exit\n\n\r");
    print ("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n");
    print ("\r\n");
    print ("\r\n");
    InterruptFlag = 1;
}

これはきっと引数がこの形で決まってるんだろうな。

 XTmrCtr_SetOptions (&TimerInstancePtr,
            XPAR_AXI_TIMER_0_DEVICE_ID,
            (XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION));

タイマのオプション設定。説明では、

Enables the specified options for the specified timer counter. This function sets the options without regard to the
current options of the driver. To prevent a loss of the current options, the user should call XTmrCtr_GetOptions()
prior to this function and modify the retrieved options to pass into this function to prevent loss of the current
options

ちなみにこれらの設定の殆どがMicroBlazeとの互換性を持っているようだ。というか調べてもMicroBlazeのドキュメントしか出てこない。

だけれども、Zynqで追加された(であろう)関数については殆ど情報が載っていない。。。

 xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,
            GpioConfigPtr,
            GpioConfigPtr->BaseAddr);

Zynqのチュートリアルをコピーするだけでは全く身につかない。どうしたらいいんだ。。。