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のチュートリアルをコピーするだけでは全く身につかない。どうしたらいいんだ。。。