Cora Z7 > microSD起動 > No Execution Address JTAG handoff > CPUアプリを含めてBOOT.binを作成する + bitstreamにelfを関連付ける

```txt:動作環境
CORA Z7
Windows 10 Pro v1909
Vivado v2019.1
TeraTerm Version 4.105
```

### 概要

- MicroBlazeアプリを作成
    - UARTで文字列「1559MicroBlaze」を出力する
- BOOT.binを作成してmicroSD起動する


### Block design

- MicroBlazeを追加する
- UartLiteを足してMicroBlazeに接続
- Zynqを追加
    - CPUアプリを作るため

![zynq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/c36bb939-bbcf-4c91-e21f-c8e3b7e68e16.png)


MicroBlazeの詳細について「FPGA プログラミング大全 Xilinx編 小林 優様」に詳しい。


### 制約ファイル

Pmod Aの0,1ピンに接続する設定とした。

```
set_property PACKAGE_PIN Y18 [get_ports rx_0]
set_property PACKAGE_PIN Y19 [get_ports tx_0]
set_property IOSTANDARD LVCMOS33 [get_ports rx_0]
set_property IOSTANDARD LVCMOS33 [get_ports tx_0]

set_property PACKAGE_PIN W13 [get_ports reset_rtl_0]
set_property IOSTANDARD LVCMOS33 [get_ports reset_rtl_0]
```

### XSDKでの作業

1. Zynq FSBLアプリを新規作成
2. CPU アプリを新規作成 (Hello World)
3. MicroBlaze アプリを新規作成

### FSBLのmain.cを変更 (起動時にdelayを入れる)

 [Cora Z7 > ビルトイン USBシリアルでFSBLの処理メッセージを表示したい > 10秒のdelayを追加 > microSDからアプリ起動もした](https://qiita.com/7of9/items/492c2f65b0a43cfdd2ae)
    - これをしないと起動に失敗する


### MicroBlaze アプリ

MicroBlazeからUART出力をするプログラム。

```hello_world.c
#include "xparameters.h"
#include "xstatus.h"
#include "xuartlite.h"
#include "sleep.h"

#define UARTLITE_DEVICE_ID  ( XPAR_AXI_UARTLITE_0_DEVICE_ID )
//#define UARTLITE_DEVICE_ID  ( XPAR_AXI_UARTLITE_4_DEVICE_ID )

int SendAndReceive(u16 DeviceId);

XUartLite UartLite;
u8 RecvBuffer[100];

int main(void)
{
    int Status;

    sleep(10);

    Status = SendAndReceive(UARTLITE_DEVICE_ID);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    return XST_SUCCESS;

}

int SendAndReceive(u16 DeviceId)
{
    int Status;
    unsigned int ReceivedCount = 0;

    Status = XUartLite_Initialize(&UartLite, DeviceId);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    Status = XUartLite_SelfTest(&UartLite);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    // send
    u8 testmsg[] = "1559MicroBlaze\r\n";
    XUartLite_Send(&UartLite, testmsg, sizeof(testmsg));
    usleep(400000); // 400msec

    // recv
    while (1) {
        ReceivedCount += XUartLite_Recv(&UartLite,
                       RecvBuffer + ReceivedCount,
                       1);
        if (RecvBuffer[ReceivedCount - 1] == '\r') {
            break;
        }
    }

    print("You have received:");
    print(RecvBuffer);
    print("\r\n");

    return XST_SUCCESS;
}
```

### FSBLのデバッグオプション

FSBL_DEBUG_INFO をデバッグオプションに追加しておく。
microSD起動時にUSBケーブル接続側のUARTにFSBL動作情報が表示される。


![zynq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/8a60bc6e-2adc-c225-6b71-c7475080706c.png)


## 失敗編

### Boot.bin作成

1. FSBL
2. bitstream
3. MicroBlazeアプリケーション

上記でBOOT.binを作成

FSBLのログは以下。

``` 
Xilinx First Stage Boot Loader
Release 2019.1  Oct 19 2020-20:38:07
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00003A30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100

DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Handoff Address: 0x00000000
In FsblHookBeforeHandoff function
No Execution Address JTAG handoff
```

## 成功変

### Boot.bin作成

1. FSBL
2. bitstream
3. CPUアプリケーション
4. MicroBlazeアプリケーション

BITファイル

```
//arch = zynq; split = false; format = BIN
the_ROM_image:
{
	[bootloader]C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\fsbl_1600\Debug\fsbl_1600.elf
	C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\design_1_wrapper_hw_platform_0\design_1_wrapper.bit
	C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\cpu_1631\Debug\cpu_1631.elf
	C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\uart_1558\Debug\uart_1558.elf
}
```

FSBLのログは以下。

```
Xilinx First Stage Boot Loader
Release 2019.1  Oct 21 2020-20:14:53
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 6
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100

DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD734C8
Application
Partition Number: 3
Header Dump
Image Word Len: 0x0000000A
Data Word Len: 0x0000000A
Partition Word Len:0x0000000A
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000888D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000003
Checksum: 0xFFF7748E
Application
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World
```

UARTLiteの接続先のシリアル出力

```
1559MicroBlaze
```

### 備考

BOOT.binをCPUアプリケーションで作成していた時にも`No Execution Address JTAG handoff`が出ていた。
CPUアプリを作成しなおしてからか、失敗しなくなった。

よくわからない。

再度同じことしたら、CPU elfは起動したが、MicroBlaze elfが起動しない。

よくわからない。

### 二回目に実施

二回目の実施では、CPUアプリは起動し、MicroBlazeアプリは起動しなかった。
作業を見返して

- MicroBlazeのelfはReleaseとして作成
- Vivadoに戻って、Tools > Associate ELF Filesにて、そのelfファイルを選択

![zynq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/e1e684ff-6490-eee4-0a28-b487d648e90b.png)

これでMicroBlazeアプリが起動するようになった。