ZYBOの続きです。
今回は、以前にやったFSBLのカスタマイズを、Vitisツールを使ってやってみたいと思います。
このカスタマイズは、ZYBOのEEPROMに入っているMACアドレスを取得するためのものです。
Vitis使うのは初めてですが、どんな感じなのか。
一応Vitis参考を載せておきます。
Zynq-7000 FSBL - Xilinx Wiki - Confluence
Vitis起動
Avnet社のガイドに従うと、Vitisのデスクトップアイコンが作成されています。
これをダブルクリックでVitisを起動します。
eclipseベースのツールらしく、ワークスペース指定のダイアログがまず出ます。
最初の画面では、"Create Platform Project"を選択します。
プロジェクト名を入力して"Next"をクリック。
前にVivadoで生成したxsaファイルを指定、Operating systemはstandaloneのままで"Finish"します。
こんな感じの画面が出てきます。
FSBLの編集
Explorerウィンドウで"zynq_fsbl"を開くと、FSBLのソースコードが出てきます。このうち、"fsbl_hooks.c"を開きます。
前の記事で書いたように、"fsbl_hooks.c"に以下のコードを追加します。
How to obtain the MAC address of Zybo - Embedded Linux - Digilent Forum
- 先頭にドライバヘッダのインクルードを追加
#include "xiicps.h" #include "xemacps.h"
- FsblHookBeforeHandoff()関数の中身を追加
/****************************************************************************** * This function is the hook which will be called before the FSBL does a handoff * to the application. The user can add all the customized code required to be * executed before the handoff to this routine. * * @param None * * @return * - XST_SUCCESS to indicate success * - XST_FAILURE.to indicate failure * ****************************************************************************/ u32 FsblHookBeforeHandoff(void) { u32 Status; Status = XST_SUCCESS; /* * User logic to be added here. * Errors to be stored in the status variable and returned */ fsbl_printf(DEBUG_INFO,"In FsblHookBeforeHandoff function \r\n"); /* Read Out MAC Address */ { int Status; XIicPs Iic; XIicPs_Config *Iic_Config; XEmacPs Emac; XEmacPs_Config *Mac_Config; unsigned char mac_addr[6]; int i = 0; fsbl_printf(DEBUG_GENERAL,"Look Up I2C Configuration\n\r"); Iic_Config = XIicPs_LookupConfig(XPAR_PS7_I2C_0_DEVICE_ID); if(Iic_Config == NULL) { return XST_FAILURE; } fsbl_printf(DEBUG_GENERAL,"I2C Initialization\n\r"); Status = XIicPs_CfgInitialize(&Iic, Iic_Config, Iic_Config->BaseAddress); if(Status != XST_SUCCESS) { return XST_FAILURE; } fsbl_printf(DEBUG_GENERAL,"Set I2C Clock\n\r"); XIicPs_SetSClk(&Iic, 200000); mac_addr[0] = 0xFA; fsbl_printf(DEBUG_GENERAL,"Set Memory Read Address\n\r"); XIicPs_MasterSendPolled(&Iic, mac_addr, 1, 0x50); while(XIicPs_BusIsBusy(&Iic)); fsbl_printf(DEBUG_GENERAL,"Get Mac Address\n\r"); XIicPs_MasterRecvPolled(&Iic, mac_addr, 6, 0x50); while(XIicPs_BusIsBusy(&Iic)); fsbl_printf(DEBUG_GENERAL,"MAC Addr: "); for(i = 0; i < 6; i++) { fsbl_printf(DEBUG_GENERAL,"%02x ", mac_addr[i]); } fsbl_printf(DEBUG_GENERAL,"\n\r"); fsbl_printf(DEBUG_GENERAL,"Look Up Emac Configuration\n\r"); Mac_Config = XEmacPs_LookupConfig(XPAR_PS7_ETHERNET_0_DEVICE_ID); if(Mac_Config == NULL) { return XST_FAILURE; } fsbl_printf(DEBUG_GENERAL,"Emac Initialization\n\r"); Status = XEmacPs_CfgInitialize(&Emac, Mac_Config, Mac_Config->BaseAddress); if(Status != XST_SUCCESS){ return XST_FAILURE; } fsbl_printf(DEBUG_GENERAL,"Set Emac MAC Address\n\r"); Status = XEmacPs_SetMacAddress(&Emac, mac_addr, 1); if(Status != XST_SUCCESS){ return XST_FAILURE; } fsbl_printf(DEBUG_GENERAL,"Verify Emac MAC Address\n\r"); XEmacPs_GetMacAddress(&Emac, mac_addr, 1); if(Status != XST_SUCCESS){ return XST_FAILURE; } } return (Status); }
最後にビルドボタンを押すと、無事ビルドが完了しました。
Explorerウィンドウの"zynq_fsbl"の下にも"fsbl.elf"がありますし、"export" > "zybo-fsbl" > "sw" > "zybo-fsbl" > "boot"の下にもあります。
とりあえず以上
今回はここまでにしておきます。
次回はPetalinuxのほうの作業になります。