ZYBO-Z7-20でUbuntu 16.04 LTSを動かす(4) : BOOT.binの作成とZynq上での実行
ZYBO-Z7でUbuntu 16.04 LTSを動かす - メモ置き場
第4回目.
ZYBO-Z7-20でUbuntu 16.04 LTSを動かす(2) : FSBLとデバイスツリーの作成 - メモ置き場
ZYBO-Z7-20でUbuntu 16.04 LTSを動かす(3) : U-BootとuEnv.txtの作成 - メモ置き場
で作成した
- bitstreamファイル
- fsbl.elf
- u-boot.elf
からBOOT.binを生成する.SDカードに生成したBOOT.binを入れて実際にブートしてみる.
BOOT.binの生成
SDKに含まれるbootgen
を使う.適当なディレクトリを作成し,bitstreamファイル,fsbl.elf,u-boot.elfをコピーしておく.次のような中身のbootimg.bifを作成する.
the_ROM_image: { [bootloader] ./fsbl.elf ./design_1_wrapper.bit ./u-boot.elf }
bootgen
コマンドでBOOT.binを生成する.
bootgen -image bootimg.bif -w on -o BOOT.bin
SDカードの準備
ZYBO-Z7ではmicorSDカードしか使えない.僕が使っているのはこちら.
SDカードはパーティションを切って,第一パーティションにはブート関連のファイルやLinux kernel,第二パーティションにはLinuxのrootfile systemを入れる必要がある.
パーティションを作成するにはgpartedを使う.SDカードを挿入してterminalから
sudo gparted
で起動する.
第一パーティションは64.00 MiBをfat32でフォーマット,第2パーティションはext4でフォーマットした.
第一パーティションに作成したBOOT.binを入れる.
BOOT.binの起動メッセージ
この記事にあるように,ZYBO-Z7とPCをシリアルポートでつなぐ.作成したSDカードをスロットに入れ電源を入れるとfsbl.elfとu-boot.elfの起動メッセージが表示される.このときブート方法のジャンパピン(JP5)をSDにしておく必要がある.
以下に起動メッセージを貼っておく.u-boot.elfの起動後はu-bootのコンソールに入れるようになる.作業としては折り返し地点くらい.後はLinux kernel,ramdisk,devicetreeの作成を行う.
Xilinx First Stage Boot Loader Release 2018.2 Jan 28 2019-01:47:55 Devcfg driver initialized Silicon Version 3.1 Boot mode is SD SD: rc= 0 SD Init Done Flash Base Address: 0xE0100000 Reboot status register: 0x60600000 Multiboot Register: 0x0000C000 Image Start Address: 0x00000000 Partition Header Offset:0x00000C80 Partition Count: 3 Partition Number: 1 Header Dump Image Word Len: 0x000F6EC0 Data Word Len: 0x000F6EC0 Partition Word Len:0x000F6EC0 Load Addr: 0x00000000 Exec Addr: 0x00000000 Partition Start: 0x000075D0 Partition Attr: 0x00000020 Partition Checksum Offset: 0x00000000 Section Count: 0x00000001 Checksum: 0xFFD13B7E 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: 0x00004A30 PCAP DMA SRC ADDR 0xF8007018: 0x00100001 PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF PCAP DMA SRC LEN 0xF8007020: 0x000F6EC0 PCAP DMA DEST LEN 0xF8007024: 0x000F6EC0 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: 0x000205DA Data Word Len: 0x000205DA Partition Word Len:0x000205DA Load Addr: 0x04000000 Exec Addr: 0x04000000 Partition Start: 0x000FE490 Partition Attr: 0x00000010 Partition Checksum Offset: 0x00000000 Section Count: 0x00000001 Checksum: 0xF7EA0770 Application Handoff Address: 0x04000000 In FsblHookBeforeHandoff function SUCCESSFUL_HANDOFF FSBL Status = 0x1 U-Boot 2018.01-dirty (Jan 28 2019 - 02:04:53 +0900) Model: Zynq ZYBO Development Board Board: Xilinx Zynq Silicon: v3.1 I2C: ready DRAM: ECC disabled 1 GiB MMC: sdhci@e0100000: 0 (SD) SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 16 MiB *** Warning - bad CRC, using default environment In: serial@e0001000 Out: serial@e0001000 Err: serial@e0001000 Net: ZYNQ GEM: e000b000, phyaddr 0, interface rgmii-id I2C EEPROM MAC address read failed eth0: ethernet@e000b000 Hit any key to stop autoboot: 0 Device: sdhci@e0100000 Manufacturer ID: 27 OEM: 5048 Name: SD16G Tran Speed: 50000000 Rd Block Len: 512 SD version 3.0 High Capacity: Yes Capacity: 14.5 GiB Bus Width: 4-bit Erase Group Size: 512 Bytes ** Unable to read file uEnv.txt ** Copying Linux from SD to RAM... ** Unable to read file uImage ** switch to partitions #0, OK mmc0 is current device Scanning mmc 0:1... starting USB... USB0: USB EHCI 1.00 scanning bus 0 for devices... 1 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found Device 0: unknown device ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT ! missing environment variable: pxefile_addr_r ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT ! ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT ! Zynq>