aster_ismの工作室

FPGAとかマイコンとか

ZYBO-Z7を用いたLチカ(Petalinux編)

ZYBO Z7(20) を買ったので、PetalinuxによるLinuxビルドを簡単なLチカを行う。 使用バージョンはVivado/SDK/Petalinux 2017.2

実施手順

  1. 事前準備
  2. VivadoでGPIOによるLED回路作成、bitstreamの生成
  3. Petalinuxの設定とビルド
  4. SDカードへの書込み
  5. ブート・動作確認

1. 事前準備

2. VivadoでGPIOによるLED回路作成、bitstreamの生成

Vivadoの設定

プロジェクト名「lnxled」。 予めインストールしておいたボードファイル「Zybo Z7-20」を選択。

回路の作成

Flow Navigator > IP INTEGRATOR > Create Block Design

デフォルトの「design_1」でOK

中央の「+」ボタン(Add IP)をクリックして、「zynq」と検索、Enterで追加。

緑色でアシスタンスされている「Run Block Automation」をクリックします。

デフォルトのまま「OK」をクリック。

BoardタブからGPIOの4LEDsをクリックする。

デフォルトで選択されているGPIOのままOKをクリック。

アシスタンスされているRun Connection Automationをクリック。

デフォルトのままOKをクリック。

AXI GPIOを開く。

IP ConfigurationのDefault Tri State Valueを「0x00000000(すべて出力)」に設定する。

Validate Designを実行し、問題ないことを確認する。DDR周りでclock skew valueが4か所Critical warningとなるが気にしない。

Address Editorタブに切り替えて、 Offset Addressを確認しておく。

今回の場合は、0x41200000。

Sourcesタブの「design_1」を右クリックしてCreate HDL Wrapperを実行。

Flow Navigator > PROGRAM AND DEBUG > GenerateBitstream をクリックしてBitstreamが生成されるのを待つ

bitstreamが生成されたら、File > Export > Export Hardwareを選択。「include bistream」のチェックは入れておく。

Vivadoの作業は終了

3. Petalinuxの設定とビルド

場所はどこでも構わないがとりあえずプロジェクトディレクトリ(lnxled.srcsとかがあるところ)でPetalinuxのプロジェクトを作成する。

$ petalinux-create -t project -n lnxled.lnx --template zynq
INFO: Create project: lnxled.lnx
INFO: New project successfully created in /home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx

Petalinuxのプロジェクトディレクトリに移動して、コンフィグを行う。

$ cd lnxled.lnx
$ petalinux-config --get-hw-description ../lnxled.sdk
INFO: Getting hardware description...
INFO: Rename design_1_wrapper.hdf to system.hdf
[INFO] generating Kconfig for project

コンフィグ画面が出てくるがそのままExitする。

しばらく設定が完了するまで待つ。

[INFO] menuconfig project
/home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/build/misc/config/Kconfig.syshw:30:warning: defaults for choice values not supported
/home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/build/misc/config/Kconfig:574:warning: config symbol defined without type
configuration written to /home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/project-spec/configs/config

*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.

[INFO] sourcing bitbake
[INFO] generating plnxtool conf
[INFO] generating meta-plnx-generated layer
~/Project/zybo-z7/lnxled/lnxled.lnx/build/misc/plnx-generated ~/Project/zybo-z7/lnxled/lnxled.lnx
~/Project/zybo-z7/lnxled/lnxled.lnx
[INFO] generating machine configuration
[INFO] generating bbappends for project . This may take time !
~/Project/zybo-z7/lnxled/lnxled.lnx/build/misc/plnx-generated ~/Project/zybo-z7/lnxled/lnxled.lnx
~/Project/zybo-z7/lnxled/lnxled.lnx
[INFO] generating u-boot configuration files
[INFO] generating kernel configuration files
[INFO] generating kconfig for Rootfs
Generate rootfs kconfig
[INFO] oldconfig rootfs
[INFO] generating petalinux-user-image.bb

設定ファイルが生成されたらビルドを実行する。

$ petalinux-build
[INFO] building project
[INFO] sourcing bitbake
INFO: bitbake petalinux-user-image
Parsing recipes: 100% |####################################################################################################| Time: 0:02:31
Parsing of 2446 .bb files complete (0 cached, 2446 parsed). 3236 targets, 224 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |#################################################################################################| Time: 0:00:22
Checking sstate mirror object availability: 100% |#########################################################################| Time: 0:00:26
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
fsbl-2017.2+gitAUTOINC+122565ec40-r0 do_compile: NOTE: fsbl: compiling from external source tree /mnt/Xilinx/2017.2/PetaLinux/2017.2/tools/hsm/data/embeddedsw
NOTE: Tasks Summary: Attempted 2415 tasks of which 1869 didn't need to be rerun and all succeeded.
INFO: generating FIT Image
INFO: bitbake petalinux-user-image -R /home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/build/conf/fit-image.conf
Parsing recipes: 100% |####################################################################################################| Time: 0:02:32
Parsing of 2446 .bb files complete (0 cached, 2446 parsed). 3236 targets, 224 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |#################################################################################################| Time: 0:00:08
Checking sstate mirror object availability: 100% |#########################################################################| Time: 0:00:22
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
fsbl-2017.2+gitAUTOINC+122565ec40-r0 do_compile: NOTE: fsbl: compiling from external source tree /mnt/Xilinx/2017.2/PetaLinux/2017.2/tools/hsm/data/embeddedsw
NOTE: Tasks Summary: Attempted 2416 tasks of which 2379 didn't need to be rerun and all succeeded.
INFO: Copying Images from deploy to images
INFO: Creating images/linux directory
[INFO] successfully built project

最後に、BOOT.binを作成します

$ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga  images/linux/design_1_wrapper.bit --u-boot --force
INFO: File in BOOT BIN: "/home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/images/linux/zynq_fsbl.elf"
INFO: File in BOOT BIN: "/home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/images/linux/design_1_wrapper.bit"
INFO: File in BOOT BIN: "/home/aster_ism/Project/zybo-z7/lnxled/lnxled.lnx/images/linux/u-boot.elf"
INFO: Generating zynq binary package BOOT.BIN...
INFO: Binary is ready.
WARNING: Unable to access the TFTPBOOT folder /tftpboot!!!
WARNING: Skip file copy to TFTPBOOT folder!!!

Warningが出てますが気にしなくていい。

BOOT.bin と image.ub をSDカードにアクセスできる場所にコピーします。

$ cp images/linux/BOOT.BIN /mnt/windows/
$ cp images/linux/image.ub /mnt/windows/

4. SDカードへの書込み

先ほどのBOOT.binとimage.ubをFAT32でフォーマットされたmicroSDカードに書き込みます。

普通にデバイスの取り外しを行い、SDカードを取り外します。

5. ブート・動作確認

ZYBO Z7にmircoSDカードを差し込み、JP5(ZYBO Z7のロゴの近く)が「SD」になるように設定して、電源を入れる(電源を入れないとSerialポートが認識しないため)。MobaXtermを立ち上げて、Serialのセッションを追加。スピードは115200bps。

すぐに起動してしまってログが見えなかったので、起動ログを見るためにPS-SRSTボタンを押す。 (起動ログ、Ether等設定していないので、Warningが出ているが、とりあれず今回のデモでは関係ない)

U-Boot 2017.01 (Oct 21 2017 - 13:48:22 +0900)

Board: Xilinx Zynq
DRAM:  ECC disabled 1 GiB
MMC:   sdhci@e0100000: 0 (SD)
SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 32 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
PHY is not detected
GEM PHY init failed
No ethernet found.
U-BOOT for lnxled.lnx

ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
No ethernet found.
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
Hit any key to stop autoboot:  0
Device: sdhci@e0100000
Manufacturer ID: 28
OEM: 4245
Name: 00000
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
reading image.ub
9474264 bytes read in 802 ms (11.3 MiB/s)
## Loading kernel from FIT Image at 10000000 ...
   Using 'conf@1' configuration
   Verifying Hash Integrity ... OK
   Trying 'kernel@0' kernel subimage
     Description:  Linux Kernel
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x100000d4
     Data Size:    3742736 Bytes = 3.6 MiB
     Architecture: ARM
     OS:           Linux
     Load Address: 0x00008000
     Entry Point:  0x00008000
     Hash algo:    sha1
     Hash value:   a52074473877f93b97a338de2fa66c3301d5a67d
   Verifying Hash Integrity ... sha1+ OK
## Loading ramdisk from FIT Image at 10000000 ...
   Using 'conf@1' configuration
   Trying 'ramdisk@0' ramdisk subimage
     Description:  ramdisk
     Type:         RAMDisk Image
     Compression:  uncompressed
     Data Start:   0x10395744
     Data Size:    5715362 Bytes = 5.5 MiB
     Architecture: ARM
     OS:           Linux
     Load Address: unavailable
     Entry Point:  unavailable
     Hash algo:    sha1
     Hash value:   7772445f6ee95ca80a9060c24b5bd853cc1c8551
   Verifying Hash Integrity ... sha1+ OK
## Loading fdt from FIT Image at 10000000 ...
   Using 'conf@1' configuration
   Trying 'fdt@0' fdt subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x10391dd8
     Data Size:    14522 Bytes = 14.2 KiB
     Architecture: ARM
     Hash algo:    sha1
     Hash value:   0cf8add2ace2b7bcb2d56b6fd1820bdaa53e9b41
   Verifying Hash Integrity ... sha1+ OK
   Booting using the fdt blob at 0x10391dd8
ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
mdio_register: non unique device name 'eth0'
   Loading Kernel Image ... OK
   Loading Ramdisk to 07a8c000, end 07fff5a2 ... OK
   Loading Device Tree to 07a85000, end 07a8b8b9 ... OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0x0
Linux version 4.9.0-xilinx-v2017.2 (aster_ism@ubuntu) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11) ) #1 SMP PREEMPT Sat Oct 21 13:53:01 JST 2017
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
OF: fdt:Machine model: xlnx,zynq-7000
bootconsole [earlycon0] enabled
cma: Reserved 16 MiB at 0x3f000000
Memory policy: Data cache writealloc
percpu: Embedded 14 pages/cpu @ef7d2000 s25932 r8192 d23220 u57344
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260608
Kernel command line: console=ttyPS0,115200 earlyprintk
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1007760K/1048576K available (6144K kernel code, 202K rwdata, 1456K rodata, 1024K init, 229K bss, 24432K reserved, 16384K cma-reserved, 245760K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    vmalloc : 0xf0800000 - 0xff800000   ( 240 MB)
    lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)
    pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
    modules : 0xbf000000 - 0xbfe00000   (  14 MB)
      .text : 0xc0008000 - 0xc0700000   (7136 kB)
      .init : 0xc0900000 - 0xc0a00000   (1024 kB)
      .data : 0xc0a00000 - 0xc0a32840   ( 203 kB)
       .bss : 0xc0a32840 - 0xc0a6bed8   ( 230 kB)
Preemptible hierarchical RCU implementation.
        Build-time adjustment of leaf fanout to 32.
        RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
RCU: Adjusting geometry for rcu_fanout_leaf=32, nr_cpu_ids=2
NR_IRQS:16 nr_irqs:16 16
efuse mapped to f0802000
slcr mapped to f0804000
L2C: platform modifies aux control register: 0x72360000 -> 0x72760000
L2C: DT/platform modifies aux control register: 0x72360000 -> 0x72760000
L2C-310 erratum 769419 enabled
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 ID prefetch enabled, offset 1 lines
L2C-310 dynamic clock gating enabled, standby mode enabled
L2C-310 cache controller enabled, 8 ways, 512 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76760001
zynq_clock_init: clkc starts at f0804100
Zynq clock init
sched_clock: 64 bits at 333MHz, resolution 3ns, wraps every 4398046511103ns
clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x4ce07af025, max_idle_ns: 440795209040 ns
Switching to timer-based delay loop, resolution 3ns
clocksource: ttc_clocksource: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 537538477 ns
timer #0 at f080c000, irq=17
Console: colour dummy device 80x30
Calibrating delay loop (skipped), value calculated using timer frequency.. 666.66 BogoMIPS (lpj=3333333)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x100000 - 0x100058
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
Brought up 2 CPUs
SMP: Total of 2 processors activated (1333.33 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor menu
hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
hw-breakpoint: maximum watchpoint size is 4 bytes.
zynq-ocm f800c000.ocmc: ZYNQ OCM pool: 256 KiB @ 0xf0880000
zynq-pinctrl 700.pinctrl: zynq pinctrl initialized
GPIO IRQ not connected
XGpio: /amba_pl/gpio@41200000: registered, base is 902
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
media: Linux media interface: v0.10
Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
FPGA manager framework
fpga-region fpga-full: FPGA Region probed
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource arm_global_timer
NET: Registered protocol family 2
TCP established hash table entries: 8192 (order: 3, 32768 bytes)
TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
TCP: Hash tables configured (established 8192 bind 8192)
UDP hash table entries: 512 (order: 2, 16384 bytes)
UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Trying to unpack rootfs image as initramfs...
Freeing initrd memory: 5584K (c7a8c000 - c8000000)
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available
futex hash table entries: 512 (order: 3, 32768 bytes)
workingset: timestamp_bits=30 max_order=18 bucket_order=0
jffs2: version 2.2. (NAND) (SUMMARY)  © 2001-2006 Red Hat, Inc.
bounce: pool size: 64 pages
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330
dma-pl330 f8003000.dmac:        DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 143, base_baud = 6249999) is a xuartps
▒console [ttyPS0] enabled
console [ttyPS0] enabled
bootconsole [earlycon0] disabled
bootconsole [earlycon0] disabled
xdevcfg f8007000.devcfg: ioremap 0xf8007000 to f0904000
[drm] Initialized
brd: module loaded
loop: module loaded
m25p80 spi0.0: found s25fl128s, expected m25p80
m25p80 spi0.0: s25fl128s (16384 Kbytes)
4 ofpart partitions found on MTD device spi0.0
Creating 4 MTD partitions on "spi0.0":
0x000000000000-0x000000500000 : "boot"
0x000000500000-0x000000520000 : "bootenv"
0x000000520000-0x000000fa0000 : "kernel"
0x000000fa0000-0x000001000000 : "spare"
libphy: Fixed MDIO Bus: probed
CAN device driver interface
libphy: MACB_mii_bus: probed
macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 145 (00:0a:35:00:1e:53)
Generic PHY e000b000.etherne:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=e000b000.etherne:00, irq=-1)
e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-pci: EHCI PCI platform driver
usbcore: registered new interface driver usb-storage
mousedev: PS/2 mouse device common for all mice
i2c /dev entries driver
EDAC MC: ECC not enabled
Xilinx Zynq CpuIdle Driver started
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using DMA
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
NET: Registered protocol family 10
sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
NET: Registered protocol family 17
can: controller area network core (rev 20120528 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20120528)
can: broadcast manager protocol (rev 20161123 t)
can: netlink gateway (rev 20130117) max_hops=1
Registering SWP/SWPB emulation handler
hctosys: unable to open rtc device (rtc0)
of_cfs_init
of_cfs_init: OK
ALSA device list:
  No soundcards found.
Freeing unused kernel memory: 1024K (c0900000 - c0a00000)
mmc0: new high speed SDHC card at address 0001
INIT: mmcblk0: mmc0:0001 00000 7.41 GiB
 mmcblk0: p1
version 2.88 booting
Starting udev
udevd[784]: starting version 3.2
random: udevd: uninitialized urandom read (16 bytes read)
random: udevd: uninitialized urandom read (16 bytes read)
random: udevd: uninitialized urandom read (16 bytes read)
udevd[785]: starting eudev-3.2
random: udevd: uninitialized urandom read (16 bytes read)
random: fast init done
Populating dev cache
hwclock: can't open '/dev/misc/rtc': No such file or directory
Sat Oct 21 04:54:14 UTC 2017
hwclock: can't open '/dev/misc/rtc': No such file or directory
Starting internet superserver: inetd.
Running postinst /etc/rpm-postinsts/100-sysvinit-inittab...
update-rc.d: /etc/init.d/run-postinsts exists during rc.d purge (continuing)
 Removing any system startup links for run-postinsts ...
  /etc/rcS.d/S99run-postinsts
INIT: Entering runlevel: 5
Configuring network interfaces... IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
udhcpc (v1.24.1) started
Sending discover...
Sending discover...
Sending discover...
No lease, forking to background
done.
Starting Dropbear SSH server: Generating key, this may take a while...
Public key portion is:
ssh-rsa xxxxxx root@lnxled.lnx
Fingerprint: md5 xxxxxxxxxxxxxxxx
dropbear.
hwclock: can't open '/dev/misc/rtc': No such file or directory
Starting syslogd/klogd: done
Starting tcf-agent: OK

PetaLinux 2017.2 lnxled.lnx /dev/ttyPS0

lnxled.lnx login:

root/rootでログイン

メモしていたAddress Offset を使ってLEDを光らせる。アドレスに1を書き込むと点灯し、0を書き込むと消灯する。0~3ビットがそれぞれLD0~3に対応している。従って、LD0を点灯させる場合は下記の通り。

# devmem 0x41200000 32 0x1

(わかりづらいがLD0スイッチの上のLED右端が点灯)

4つとも光らせるなら

# devmem 0x41200000 32 0xF