« 火鍋 | トップページ | 見積システムを開発しています »

2017.12.15

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で起動した画面を下の図に示します。

Zb_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を有効にします。

Fb

これで画像出力対応になります。

これで、Linuxの起動時にペンギンの絵が出るようになります。

Linuxfb

◆リッチな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が起動したときの画面を下の図に示します。

Zb_linux

こうして、めでたくZynqBerryでリッチなUbuntu Linux 12が起動します。

コンソールからも使えますが、キーボードやマウス、HDMIをなぐとパソコンのようになります。

Zb_linux1 Zb_linux2

フレームバッファというのは単純にメモリの内容を画像として出力するだけのもので、アクセラレータもないので、とても遅いです。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

コメントを書く



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




« 火鍋 | トップページ | 見積システムを開発しています »