Ultra96ボードのBOOT.BINを作って起動させてみた
自分でUltra96ボードをブートさせようと思った場合、まずUltra96ボードのVivadoのプロジェクトを探してくる必要があります。
Vivadoプロジェクトは、
http://zedboard.org/support/design/24166/156
にあるようです。
この中のTutorial 01-04 Solutionsをダウンロードします。
この中にあるUltra96_Basic_SystemというフォルダがVivadoのプロジェクトで、Ultra96_Basic_System\Ultra96_Basic_System.sdk\design_1_wrapper.hdfがHDFファイル(ハードウェア定義ファイル)です。
このファイルはVivado 2018.2用なので、私のVivado 2018.1では開けませんでしたが、HDFがあれば、XILINX SDKでプロジェクトが作成できます。
XSDKで新規プロジェクト作成、とやって、Newを押します。
次のダイアログでHDFファイルを指定すれば新しいハードウェアプラットフォームとして登録されます。
これで、プロセッサのタイプをPMUにしてPMUファームウェアを作り、FSBL、Periferal Testなどのアプリを作ります。
注意しなければならないことは、デフォルトではUART0に標準出力が出力されてしまうことです。Ultra96ボードのUART0はBluetoothなので、普通にFSBLやPMUを作ってもコンソールに何も出てきません。
Ultra96ボードのUARTを3ピンのピンヘッダ(J15)につないでいる場合、UART1に出してやらなければなりませんが、その変更はPMU_BSPや、FSBL_BSP、TEST_BSPなど、_BSPと付いたプロジェクトの中のxparameters.hにあります。xparameters.hのSTDIN_BASEADDRESSとSTDOUT_BASEADDRESSがデフォルトでは0xFF000000になっているので、これを0xFF010000に変更します。
#define STDIN_BASEADDRESS 0xFF010000 #define STDOUT_BASEADDRESS 0xFF010000
ビルドが走ってしまうと数十分かかってしまうようですね・・
XSDKが作ったデフォルトのFSBLやPMUはデバッグメッセージを出さないので、デバッグメッセージを出すように修正します。
まず、PMUのプロジェクトではxpfw_config.hを開いて
#define XPFW_DEBUG_ERROR_VAL (1U) #define XPFW_DEBUG_DETAILED_VAL (1U)
を有効にします。
FSBLのプロジェクトではxfsbl_config.hを開いて、
#define FSBL_PRINT_VAL (1U) #define FSBL_DEBUG_VAL (1U) #define FSBL_DEBUG_INFO_VAL (1U) #define FSBL_DEBUG_DETAILED_VAL (1U)
を有効にします。
bootimage.bifは以下のようにします。
//arch = zynqmp; split = false; format = BIN the_ROM_image: { [fsbl_config]a53_x64 [pmufw_image]D:\ultrascale\PMU\Debug\PMU.elf [bootloader, destination_cpu=a53-0]D:\ultrascale\FSBL\Debug\FSBL.elf [destination_device = pl]design_1_wrapper.bit [destination_cpu = a53-0]D:\ultrascale\TEST\Debug\TEST.elf }
bootimage.bifの書き方でいろいろ実験してみてわかったことは、
- [fsbl_config]の行は無くても影響なさそう
- 実は、PMU.elfはなくてもFSBLとアプリは起動する
- FPGAのBitファイルがなくても、CPUは起動する(ただしPLがコンフィグされないので、DONEのLEDは点灯しない)
- アプリ(test.elf)はなくても、FSBLまでなら起動する
ということでした。
なお、bootimage.bifからboot.binを作るのは
D:\Xilinx\SDK\2018.1\bin\bootgen -image bootimage.bif -arch zynqmp -o D:\ultrascale\mkboot\BOOT.bin -w on
とコマンドを打ちます。
ためしにどこまで削っていってブートするかを試してみたら、最小限のbootimage.bifとして
the_ROM_image: { [bootloader, destination_cpu=a53-0]D:\ultrascale\FSBL\Debug\FSBL.elf }
だけで起動できました。
Xilinx Zynq MP First Stage Boot Loader Release 2018.1 Oct 9 2018 - 01:03:55 Reset Mode : System Reset Platform: Silicon (4.0), Cluster ID 0x80000000 Running on A53-0 (64-bit) Processor, Device Name: XCZU3EG Processor Initialization Done ================= In Stage 2 ============ SD0 Boot Mode SD: rc= 0 File name is BOOT.BIN Multiboot Reg : 0x0 Image Header Table Offset 0x8C0 XFSBL_ERROR_NO_OF_PARTITIONS Image Header Table Validation failed Boot Device Initialization failed 0xD ================= In Stage Err ============ Fsbl Error Status: 0x0
PMUも複数のプロセッサも出てこない。これならZYNQ 7000と同じですね。
さて、本筋に戻りましょう。
FSBL、PMU、BitStream、テストアプリ(Periferal Test)を結合させてBoot.binを作り、ブートさせてみた結果が次の画面です。
起動時の全メッセージを載せます。FSBLがデバッグメッセージをUART1に出力するので、中で何をやっているかがわかると思います。
Xilinx Zynq MP First Stage Boot Loader Release 2018.1 Oct 9 2018 - 01:03:55 Reset Mode : System Reset Platform: Silicon (4.0), Cluster ID 0x80000000 Running on A53-0 (64-bit) Processor, Device Name: XCZU3EG Processor Initialization Done ================= In Stage 2 ============ SD0 Boot Mode SD: rc= 0 File name is BOOT.BIN Multiboot Reg : 0x0 Image Header Table Offset 0x8C0 *****Image Header Table Details******** Boot Gen Ver: 0x1020000 No of Partitions: 0x3 Partition Header Address: 0x440 Partition Present Device: 0x0 Initialization Success ======= In Stage 3, Partition No:1 ======= UnEncrypted data Length: 0x153E27 Data word offset: 0x153E27 Total Data word length: 0x153E27 Destination Load Address: 0xFFFFFFFF Execution Address: 0x0 Data word offset: 0xED80 Partition Attributes: 0x26 Destination Device is PL, changing LoadAddress XPFW: Calling ROM PWRUP Handler..Done XPFW: Calling ROM Isolation Handler..Done Non authenticated Bitstream download to start now DMA transfer done PL Configuration done successfully PPFW: Calling ROM PWRUP Handler..Done artition 1 Load Success ======= In Stage 3, Partition No:2 ======= UnEncrypted data Length: 0x6412 Data word offset: 0x6412 Total Data word length: 0x6412 Destination Load Address: 0x0 Execution Address: 0x0 Data word offset: 0x162BB0 Partition Attributes: 0x116 Partition 2 Load Success All Partitions Loaded ================= In Stage 4 ============ PM Init Success Protection configuration applied Running Cpu Handoff address: 0x0, Exec State: 0 Exit from FSBL ---Entering main--- Running ScuGicSelfTestExample() for psu_acpu_gic... ScuGicSelfTestExample PASSED ScuGic Interrupt Setup PASSED Running XZDma_SelfTestExample() for psu_adma_1... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_1... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_adma_2... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_2... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_adma_3... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_3... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_adma_4... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_4... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_adma_5... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_5... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_adma_6... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_6... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_adma_7... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_7... ZDMA Simple Example PASSED Running SysMonPsuPolledPrintfExample() for psu_ams... Entering the SysMon Polled Example. The Current Temperature is 46.561 Centigrades. The Maximum Temperature is 47.082 Centigrades. The Minimum Temperature is 46.102 Centigrades. The Current VCCINT is 0.853 Volts. The Maximum VCCINT is 0.855 Volts. The Minimum VCCINT is 0.852 Volts. The Current VCCAUX is 1.817 Volts. The Maximum VCCAUX is 1.818 Volts. The Minimum VCCAUX is 1.815 Volts. Exiting the SysMon Polled Example. SysMonPsuPolledPrintfExample PASSED Running SysMonPsuIntrExample() for psu_ams... Entering the SysMonPsu Interrupt Example. The Current Temperature is 46.514 Centigrade. The Current VCCINT is 0.854 Volts. The Current VCCAUX is 1.816 Volts. Temperature Alarm(0) HIGH Threshold is 36.512 Centigrade. Temperature Alarm(0) LOW Threshold is 26.510 Centigrade. VCCINT Alarm(1) HIGH Threshold is 0.654 Volts. VCCINT Alarm(1) LOW Threshold is 1.054 Volts. VCCAUX Alarm(3) HIGH Threshold is 1.615 Volts. VCCAUX Alarm(3) LOW Threshold is 2.016 Volts. Alarm 0 - Temperature alarm has occured The Current Temperature is 46.607 Centigrade. The Maximum Temperature is 47.346 Centigrade. The Minimum Temperature is 45.955 Centigrade. The Current VCCINT is 0.853 Volts. The Maximum VCCINT is 0.855 Volts. The Minimum VCCINT is 0.851 Volts. The Current VCCAUX is 1.817 Volts. The Maximum VCCAUX is 1.818 Volts. The Minimum VCCAUX is 1.815 Volts. Exiting the SysMon Interrupt Example. SysMonPsu IntrExample PASSED Running XCsuDma_SelfTestExample() for psu_csudma... XCsuDma_SelfTestExample PASSED Running Interrupt Test for psu_csudma... CSUDMA Interrupt Example PASSED Running XZDma_SelfTestExample() for psu_gdma_0... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_0... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_1... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_1... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_2... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_2... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_3... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_3... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_4... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_4... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_5... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_5... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_6... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_6... ZDMA Simple Example PASSED Running XZDma_SelfTestExample() for psu_gdma_7... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_gdma_7... ZDMA Simple Example PASSED Running IicPsSelfTestExample() for psu_i2c_1... IicPsSelfTestExample PASSED Running XZDma_SelfTestExample() for psu_adma_0... XZDma_SelfTestExample PASSED Running Interrupt Test for psu_adma_0... ZDMA Simple Example PASSED Running SpiPsSelfTestExample() for psu_spi_0... SpiPsSelfTestExample PASSED Running SpiPsSelfTestExample() for psu_spi_1... SpiPsSelfTestExample PASSED Running Interrupt Test for psu_ttc_0... TtcIntrExample PASSED Running Interrupt Test for psu_ttc_1... TtcIntrExample PASSED Running Interrupt Test for psu_ttc_2... TtcIntrExample PASSED Running Interrupt Test for psu_ttc_3... TtcIntrExUartPsPoUartPsIntrExample PASSED Running WdtPsSelfTestExample() for psu_wdt_0... WdtPsSelfTestExample PASSED Running WdtPsSelfTestExample() for psu_wdt_1... WdtPsSelfTestExample PASSED ---Exiting main---
そして豪華なペリフェラルテストを行っています。
あれ?PMUが出てこない。
どうしてでしょう。
| 固定リンク
コメント