勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

ZYBOを進める - 27. VitisでFSBL作成

ZYBOの続きです。 今回は、以前にやったFSBLのカスタマイズを、Vitisツールを使ってやってみたいと思います。
このカスタマイズは、ZYBOのEEPROMに入っているMACアドレスを取得するためのものです。
Vitis使うのは初めてですが、どんな感じなのか。

一応Vitis参考を載せておきます。

Zynq-7000 FSBL - Xilinx Wiki - Confluence

ひでみのアイデア帳

Vitis起動

Avnet社のガイドに従うと、Vitisのデスクトップアイコンが作成されています。
これをダブルクリックでVitisを起動します。

f:id:nokixa:20211113204447p:plain:w400

eclipseベースのツールらしく、ワークスペース指定のダイアログがまず出ます。

f:id:nokixa:20211113204908p:plain:w400

最初の画面では、"Create Platform Project"を選択します。

f:id:nokixa:20211113223719p:plain:w500

プロジェクト名を入力して"Next"をクリック。

f:id:nokixa:20211113223813p:plain:w500

前にVivadoで生成したxsaファイルを指定、Operating systemはstandaloneのままで"Finish"します。

f:id:nokixa:20211113223920p:plain:w500

こんな感じの画面が出てきます。

f:id:nokixa:20211113224009p:plain:w500

FSBLの編集

Explorerウィンドウで"zynq_fsbl"を開くと、FSBLのソースコードが出てきます。このうち、"fsbl_hooks.c"を開きます。

f:id:nokixa:20211113224113p:plain:w500

前の記事で書いたように、"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);
}

最後にビルドボタンを押すと、無事ビルドが完了しました。

f:id:nokixa:20211113224304p:plain:w500

Explorerウィンドウの"zynq_fsbl"の下にも"fsbl.elf"がありますし、"export" > "zybo-fsbl" > "sw" > "zybo-fsbl" > "boot"の下にもあります。

とりあえず以上

今回はここまでにしておきます。
次回はPetalinuxのほうの作業になります。