Embedded Linux® Hands-on Tutorial for the ZYBO をやってみた

ZedboardZyboで,Linuxから自作IPを使う方法がわからず悩んでいたところ,digilentのチュートリアルがよさそうとのアドバイスをFPGAの部屋のmarseeさんからいただいのでやってみました.ドラフト版が’Embedded Linux Tutorial - Zybo’というタイトルでここにありますが,このポストではオフィシャルドキュメント(July 17, 2014版)の方に沿って進めていきます.

内容はZybo上にLinuxをインストールし,デバイスドライバ経由でボード上のLEDを点灯させるというもの.
なおチュートリアルはMac上のVMwareにインストールしたUbuntu 14.04 64bitで,Vivado 2014.2を動かして行いました.

以下では躓いた点や気になった所を紹介します.各インデックスはドキュメントのセクションに対応しています.

1.2 2-3

チュートリアルで用いるzybo_base_system.zipはVivado 2013.4用のプロジェクトのため,開くとプロジェクトをアップグレードするかと聞かれるので,Automatic Upgrade... を選択する.すると今度はIPをアップグレードするかと聞かれるので,Report IP StatusでIP Statusを確認し,IPを全てアップグレードする.

1.2 5

Figure 11の画面からNextボタンで進むと,3択画面になるので,Create a new AXI4 peripheral を選択する.

1.2 16

Address Editor上でmyLed_0はUnmapped slavesのままなので,myLed_0を選択してAuto Assign Addressを実行する.実行後はFigure 62のようになる.Bitstreamの生成を始めるとCritical warningがどうのこうのと言われるがOKにしてすすめる.

2.2 2

Figure 34 の1行目のmakeのオプションは zynq_ZYBO_config ではなく,zynq_zybo_config (全て小文字)とする
※2014-08-30 marseeさんのご指摘により追記
$ make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zybo_config

3.2 1

Vivado 2014.2にはExport Hardware for SDKのコマンドが無いので,Export Hardwareをしてから,Launch SDKをする.出力先はデフォルトの

3.2 5

Target HardwareのHardware Platformがドキュメントと異なり,system_wrapper_hw_platform_0となっているが,気にしないで進む.

3.2 10

1つめはpartition typeをbootloaderにして <人それぞれ>/zybo_base_system/source/vivado/hw/zybo_bsd/zybo_bsd.sdk/FSBL/Debug/FSBL.elf を追加し,次にsystem.bitではなく(見つからないので),<人それぞれ>/zybo_base_system/source/vivado/hw/zybo_bsd/zybo_bsd.sdk/system_wrapper_hw_platform_0/system_wrapper.bit を追加する.最後はドキュメントの通りに先ほど作成した u-boot.elf を追加する.Create Image を押すと上書きするか聞かれるのでOKにする.

4.2 1

Master-Next Branchを使うように書いてあるが,ドキュメントのgitコマンドだと落ちてこないので(zynq-zybo.dtsが無くて困る)‘git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git’でちゃんとMaster-Next Branchをチェックアウトする.
※2014-08-14現在,gitすると以下の様な感じ.
$ git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git
Cloning into 'Linux-Digilent-Dev'...
remote: Counting objects: 3586185, done.
remote: Compressing objects: 100% (549210/549210), done.
remote: Total 3586185 (delta 3007205), reused 3586185 (delta 3007205)
Receiving objects: 100% (3586185/3586185), 864.91 MiB | 2.66 MiB/s, done.
Resolving deltas: 100% (3007205/3007205), done.
Checking connectivity... done.
Checking out files: 100% (46147/46147), done.

4.2 4

U-Bootのコンパイルに使うmkimageをUbuntuはデフォルトで持ってないので,前もってsudo apt-get install u-boot-tools でmkimageをインストールする.(もしくは,Fig. 50のPathの追加を行ってもよい)

5.2 1

私の環境では,dtsファイルは arch/arm/boot/dts/zynq-zybo.dts(zyboが小文字).ファイルの中身もFigure 51と微妙に異なっていたので,編集せずそのまま利用した.そして ramdisk だが,ramdisk8M.image.gz が見当たらないので(ZYBO Linux Reference Design にイメージがあるって書いてあるけど,そのデザインが見当たりません),Zedboardのデザインにあったものを流用する.
実行したらFigure 52と同じバイトサイズになった.
$ mkimage -A arm -T ramdisk -c gzip -d ./ramdisk8M.image.gz uramdisk.image.gz
Image Name:
Created: Sat Aug 16 00:34:45 2014
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 3694108 Bytes = 3607.53 kB = 3.52 MB
Load Address: 00000000
Entry Point: 00000000

5.2 3

Figure 54はパスがめちゃくちゃに書いてある気がするけど,言われたとおり4つのファイルを適当なマイクロSDカードにコピー
$ cp devicetree.dtb <micro SDのマウント先>
$ cp Linux-Digilent-Dev/uramdisk.image.gz <micro SDのマウント先>
$ cp Linux-Digilent-Dev/arch/arm/boot/uImage <micro SDのマウント先>
$ cp zybo_base_system/sd_image/BOOT.bin <micro SDのマウント先>

5.2 4

私の環境では/dev/ttyUSB1がUARTのポートだったので,gtktermのポートをそれに併せて先のマイクロSDカードを挿したZyboを起動すると,無事にコンソール画面が出た(^^)/

6.2 3-4

オリジナルの myled.c はここからダウンロードできる.ただし,このままだとエラーが出てコンパイルできないので,先頭のinclude文に以下の8行目を追加.参考:編集後の myled.c

#include <linux/seq_file.h> /* Needed for Sequence File Operations */
#include <linux/platform_device.h> /* Needed for Platform Driver Functions */
#include <linux/slab.h> /* Needed for kmalloc and kfree */

6.2 5

Figure 64に従い zynq-zybo.dts を編集する.参考:編集後の zynq-zybo.dts
7.2 基本的にドキュメント通り.参考までにソースとMakefileを置いておく.
led_blink.c Makefile


疑問や今後の課題
  • ramdisk8M.image.gz でルートファイルシステムをRAM上に実現してるっぽいけど,SD card上にファイルシステムを構築するにはどうすればいいのか?
  • ZyboのPSを変更しない限りは,PLにいろいろ自作IPを追加しようとも,今回のFSBLを使い続けられるのか?
  • XillinuxとかではフルのUbuntuが動いてるけど,dtsファイルやカーネルのconfigファイルをどうしているんだろう...
  • Digilent Linuxのネットワーク設定を行い,NFSサーバのマウント,クライアントマシンでのSSH接続ができるかの確認.
blog comments powered by Disqus