« ZYNQ UltraScale+ MPSoCの起動について調べたこと | トップページ | Ultra96ボードのJTAGバウンダリスキャンができた »

2018.10.08

Ultra96ボードのBOOT.BINを作って起動させてみた

自分でUltra96ボードをブートさせようと思った場合、まずUltra96ボードのVivadoのプロジェクトを探してくる必要があります。

Vivadoプロジェクトは、

http://zedboard.org/support/design/24166/156

にあるようです。

この中のTutorial 01-04 Solutionsをダウンロードします。

Ultra96_tutorial

この中にある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を押します。

New_proj_1

次のダイアログでHDFファイルを指定すれば新しいハードウェアプラットフォームとして登録されます。

New_proj_2

これで、プロセッサのタイプを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
}

だけで起動できました。

Minimum_zu

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を作り、ブートさせてみた結果が次の画面です。

Ultra96_boot

起動時の全メッセージを載せます。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...
TtcIntrExUartPsPoUartPsIntrExample PASSED

 Running WdtPsSelfTestExample() for psu_wdt_0...
WdtPsSelfTestExample PASSED

 Running WdtPsSelfTestExample() for psu_wdt_1...
WdtPsSelfTestExample PASSED
---Exiting main---

そして豪華なペリフェラルテストを行っています。

あれ?PMUが出てこない。

どうしてでしょう。

|

« ZYNQ UltraScale+ MPSoCの起動について調べたこと | トップページ | Ultra96ボードのJTAGバウンダリスキャンができた »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ZYNQ UltraScale+ MPSoCの起動について調べたこと | トップページ | Ultra96ボードのJTAGバウンダリスキャンができた »