ZynqBerryでUbuntu Linuxを動かす
ZynqBerryでLinuxを動かすための情報を公開します。
◆FSBLの構築
ZynqBerryは、フレームバッファというしくみを使ってHDMIに画像表示を行います。この機能を有効にするにはFSBLにパッチを当てる必要があります。そのパッチを含めたFSBLのソース一式は、Trenz社からダウンロードしたプロジェクトアーカイブのsw_apps\zynq_fsbl\srcディレクトリにあるのですが、ps7_init.cとps7_init.hは間違っているようなので、これを使ってはいけません。
やり方としては、XSDKで新規にFSBLのプロジェクトを作成し、sw_apps\zynq_fsbl\srcからps7_init.cとps7_init.h以外を持ってくることになります。
また、
#define FSBL_DEBUG_INFO
は、付けた方がよいでしょう。
Trenz社から提供されたZYNQ Berry用のU-Bootと、新しいFSBLで起動した画面を下の図に示します。
◆U-Bootの構築
ZynqBerryで普通にU-Bootを起動すると、MMCのclockがどうので止まってしまいます。それを回避しても、GEMがない、と止まってしまいます。さらにはSPI ROMから起動しようとして、非常に遅いメモリコピーをした挙句に、起動イメージがないと出ます。
U-Bootで改変しなければならない箇所は
- sdhci0ではなく、sdhci1を使うようデバイスツリーを変える
- defconfigのCONFIG_ZYNQ_GEMをnにする
- serial0とserian1を入れ替える
- memoryの範囲を<0x0 0x1F700000>にする
また、board.cというソースのboard_late_init()という関数を書き換えます
int board_late_init(void)
{
switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
case ZYNQ_BM_QSPI:
setenv("modeboot", "sdboot");
// setenv("modeboot", "qspiboot");
break;
・・・
U-Bootは、SPI ROMからZYNQが起動したら、SLCRというレジスタを読んでSPI BOOTであることを調べ、LinuxのイメージもSPI ROM上にあると想定した動作を行います。この修正を行うことで、SPI ROMから起動しても、SDカードからLinuxイメージを読み込むようになります。
下のリストは、FSBLとU-Bootが起動したときのメッセージです。
Xilinx First Stage Boot Loader Release 2017.1 Dec 15 2017-16:06:19 Devcfg driver initialized Silicon Version 3.1 Boot mode is QSPI Single Flash Information FlashID=0x1 0x20 0x18 SPANSION 128M Bits QSPI is in single flash connection QSPI Init Done Flash Base Address: 0xFC000000 Reboot status register: 0x60480000 Multiboot Register: 0x0000C000 Image Start Address: 0x00000000 Partition Header Offset:0x00000C80 Partition Count: 3 Partition Number: 1 Header Dump Image Word Len: 0x0003DC28 Data Word Len: 0x0003DC28 Partition Word Len:0x0003DC28 Load Addr: 0x00000000 Exec Addr: 0x00000000 Partition Start: 0x000085D0 Partition Attr: 0x00000020 Partition Checksum Offset: 0x00000000 Section Count: 0x00000001 Checksum: 0xFFF3E346 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: 0xFC021741 PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF PCAP DMA SRC LEN 0xF8007020: 0x0003DC28 PCAP DMA DEST LEN 0xF8007024: 0x0003DC28 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: 0x0001CB48 Data Word Len: 0x0001CB48 Partition Word Len:0x0001CB48 Load Addr: 0x04000000 Exec Addr: 0x04000000 Partition Start: 0x00046200 Partition Attr: 0x00000010 Partition Checksum Offset: 0x00000000 Section Count: 0x00000001 Checksum: 0xF7F639B6 Application PCAP:StatusReg = 0x40000F30 PCAP:device ready PCAP:Clear done PCAP register dump: PCAP CTRL 0xF8007000: 0x4C00E07F PCAP LOCK 0xF8007004: 0x0000001A PCAP CONFIG 0xF8007008: 0x00000508 PCAP ISR 0xF800700C: 0x00030004 PCAP IMR 0xF8007010: 0xFFFFFFFF PCAP STATUS 0xF8007014: 0x00000F30 PCAP DMA SRC ADDR 0xF8007018: 0xFC118801 PCAP DMA DEST ADDR 0xF800701C: 0x04000001 PCAP DMA SRC LEN 0xF8007020: 0x0001CB48 PCAP DMA DEST LEN 0xF8007024: 0x0001CB48 PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF PCAP MBOOT 0xF800702C: 0x0000C000 PCAP SW ID 0xF8007030: 0x00000000 PCAP UNLOCK 0xF8007034: 0x757BDF0D PCAP MCTRL 0xF8007080: 0x30800110 ................................................................................................... DMA Done ! Handoff Address: 0x04000000 In FsblHookBeforeHandoff function FSBL: Enabling VTC.. FSBL: Enabling Out VDMA at 0x1FC00000.. FSBL: Enabling In VDMA at 0x1F700000.. SUCCESSFUL_HANDOFF FSBL Status = 0x1 U-Boot 2017.01-00014-g5fa7d2e-dirty (Dec 15 2017 - 16:34:59 +0900) Model: TrenzElectronic TE0726-03M ZynqBerry (U-Boot by Tokuden 1.0) Board: Xilinx Zynq I2C: ready DRAM: ECC disabled 503 MiB MMC: sdhci@e0101000: 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 Model: TrenzElectronic TE0726-03M ZynqBerry (U-Boot by Tokuden 1.0) Board: Xilinx Zynq Net: No ethernet found. reading uEnv.txt 115 bytes read in 8 ms (13.7 KiB/s) Importing environment from SD ... Hit any key to stop autoboot: 0 Berry> usb start starting USB... USB0: USB EHCI 1.00 scanning bus 0 for devices... 4 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found Berry> usb info 1: Hub, USB Revision 2.0 - u-boot EHCI Host Controller - Class: Hub - PacketSize: 64 Configurations: 1 - Vendor: 0x0000 Product 0x0000 Version 1.0 Configuration: 1 - Interfaces: 1 Self Powered 0mA Interface: 0 - Alternate Setting 0, Endpoints: 1 - Class Hub - Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms 2: Hub, USB Revision 2.0 - Class: Hub - PacketSize: 64 Configurations: 1 - Vendor: 0x0424 Product 0x9514 Version 2.0 Configuration: 1 - Interfaces: 1 Self Powered Remote Wakeup 2mA Interface: 0 - Alternate Setting 0, Endpoints: 1 - Class Hub - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms 3: Vendor specific, USB Revision 2.0 WDC-150SU2M ?凪i}・己O - Class: (from Interface) Vendor specific - PacketSize: 64 Configurations: 1 - Vendor: 0x056e Product 0x4008 Version 0.0 Configuration: 1 - Interfaces: 1 Bus Powered Remote Wakeup 500mA Interface: 0 - Alternate Setting 0, Endpoints: 3 - Class Vendor specific - Endpoint 1 In Bulk MaxPacket 512 - Endpoint 2 Out Bulk MaxPacket 512
usb startとusb infoでUSBデバイスのj情報が取得できていることがわかります。
◆Linuxの構築
Linuxの構築はセミナーで説明したとおりにやれば、USBやWiFiが使えるようになりますが、それに加えてHDMI出力を有効にするために、Drivers→Graphics Support→Frame Buffer Driversの中のSimple framebuffer supportを有効にします。
これで画像出力対応になります。
これで、Linuxの起動時にペンギンの絵が出るようになります。
◆リッチなLinuxの構築
まずは、Linaro Ubuntuのイメージをとってきます。
http://www.tokudenkairo.co.jp/cosmoz/files/cosmoz-ubuntu12.img
から、ZYNQ用のLinaro Ubuntu 12のイメージをとってきて、Win32DiskImagerでSDカードに書き込みます。
そして、第一パーティションに、devicetree.dtb、u-boot.rgba、uEnv.txt、uImageを入れます。
このSDカードで起動すれば、ZynqBerryでLinaro Ubuntu 12が起動するはずです。
そうしたら、/etc/resolv.confを削除し、/etc/hostnameを書き換えてホスト名を決めてください。そして、決めたホスト名が127.0.0.1をさすように/etc/hostsも設定してください。
127.0.0.1 zynqberry
Linuxが起動したときの画面を下の図に示します。
こうして、めでたくZynqBerryでリッチなUbuntu Linux 12が起動します。
コンソールからも使えますが、キーボードやマウス、HDMIをなぐとパソコンのようになります。
フレームバッファというのは単純にメモリの内容を画像として出力するだけのもので、アクセラレータもないので、とても遅いです。GUIでさわるともっさりもっさりした動作ですが、RaspBerry Pi2くらいの速度は出ているように思えます。コンソールからのアクセスならばそんれほど遅さは感じません。
ビルド済みのBoot.binは下記のURLにアップロードしました。
また、Linuxの起動に必要なビルド済みのSDカード内容は下記のURLにアップロードしました。
Ubuntu Linuxのイメージはこちらです。
これで、ZYNQで動くリッチなLinuxがご堪能いただけると思います。
| 固定リンク
コメント
ZynqBerry に boot.bin が書き込めませんでした。何がいけないのか、アドバイスを頂けないでしょうか?
□やったこと
1.Trenzのリファレンスデザイン(zynqberrydemo2)をダウンロードして、zip ファイルを展開する。
2.design_basic_settings.cmd を修正する。(VIVADO_VERSION=2017.2, PARTNUMBER=3, SWAPP=u-boot)
3.prebuilt\boot_images\te0726_m\u-boot のディレクトリに、上の boot.zip を展開した出てきた boot.bin を上書きコピーする。
4.マイクロ SD カードをセットしていない ZynqBerry を PC に USB 接続する。
⇒Windows DeviceManager では正常に認識している。
5.Vivado 2017.2 を起動して、Hardware Manager を開き、Open Target→Auto Connect を選択する。
⇒Zynq が正常に認識されている。
6.Vivado を終了する。
7.program_flash_binfile.cmd を実行するが、"Flash Operation Successful" が表示されない。
INFO: [TE_INIT-16] Read board part definition list (File C:/Proj/zynqberrydemo2/board_files/TE0726_board_files.csv).
INFO: [TE_INIT-18] Read Software list (File: C:/Proj/zynqberrydemo2/sw_lib/apps_list.csv).
INFO: [TE_INIT-22] Read ZIP ignore list (File: C:/Proj/zynqberrydemo2/sw_lib/apps_list.csv).
Create temporary vivado project in: C:/Proj/zynqberrydemo2/vivado/tmp
Start Flash Programming with BIN File
Found ID: 3
INFO: [Labtools 27-2285] Connecting to hw_server url TCP:localhost:3121
INFO: [Labtools 27-2222] Launching hw_server...
INFO: [Labtools 27-2221] Launch Output:
****** Xilinx hw_server v2017.2
**** Build date : Jun 15 2017-18:53:26
** Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.
INFO: [Labtoolstcl 44-466] Opening hw_target localhost:3121/xilinx_tcf/Digilent/2516330005B9A
Found part name: xc7z010clg225-1
Found ID: 3
ERROR: [TE_PR-52] Script (TE::VLAB::hw_create_flash_device) failed: ERROR: [Labtoolstcl 44-655] Cfgmem part s25fl128s-3.3v-qspi-x4-single is not supported for device arm_dap.
.
ERROR: (TE_PR-52) Script (TE::VLAB::hw_create_flash_device) failed: ERROR: [Labtoolstcl 44-655] Cfgmem part s25fl128s-3.3v-qspi-x4-single is not supported for device arm_dap.
.
ERROR: [TE_INIT-100] Script (TE::pr_program_flash_binfile) failed: .
ERROR: (TE_INIT-100) Script (TE::pr_program_flash_binfile) failed: .
ERROR:(TE) Script (TE::INIT::program_zynq_bin) failed: .
ERROR:(TE) Script (TE::main) failed: .
INFO: [Common 17-206] Exiting Vivado at Tue Dec 19 14:42:23 2017...
-------------------------scripts finished----------------------------
--------------------------------------------------------------------
--------------------Change to design folder-------------------------
------------------------Design finished-----------------------------
※ なお、boot.bin を zynqberrydemo2 に含まれていたファイルに戻した場合でも、同じエラーが発生しました。
投稿: moto | 2017.12.19 15:12
こちらの環境では
Start Flash Programming with BIN File
Found ID: 3
までは同じなのですが、そこから先には、
Found Shortname: te0726_m
Used file:D:/zynqberrydemo2/prebuilt/boot_images/te0726_m/myboot/Boot.bin
INFO: [TE_PR-41] Start program flash:
Run "exec program_flash -f BOOT.bin -flash_type qspi_single" in D:/zynqberrydemo2/prebuilt/boot_images/te0726_m/myboot
Please Wait..
------
INFO: [TE_EXT-4] Command results from program flash "exec program_flash -f BOOT.bin -flash_type qspi_single":
と続きます。
エラーメッセージを見ると、VivadoのhwserverがSPI ROMを認識できないような感じなのですが、
もしかすると、vivado_create_project_guimode.cmdを先に行って、プロジェクトファイルを作っておかないと、書き込みのターゲットとなるファイルを見つけられない、とかそういう問題があるのかもしれません。
vivado_create_project_guimode.cmdあるいはvivado_open_existing_project_guimode.cmdは実行されていますか?
また、最初の_create_win_setup.cmdを実行した際に、1 (Maximum)を選択していますか?
よろしくお願いします。
投稿: なひたふ | 2017.12.19 18:14
ありがとうございます。無事解決しました。うまく boot.bin が書き込めなかった理由は、Xilinx SDK をインストールしていなかったからでした。先日のセミナーの時に使用していた PC とは別の PC を使用して作業を行っていたのですが、program_flash_binfile.cmd を実行するだけならば、Vivado があれば十分だろうと勝手に決めつけておりました。
お騒がせして申し訳ありませんでした。
投稿: moto | 2017.12.21 10:39