New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Debian Linux on Zynq (Xilinx ARM-SoC FPGA) Setup Flow (Vivado 2015.4)
1. Debian Linux on Zynq
Setup Flow
(Version March 2016 for Vivado 2015.4)
Shinya Takamaeda-Yamazaki
Nara Institute of Science and Technology (NAIST)
E-mail: shinya_at_is.naist.jp
2. Goal of this tutorial
n Constructing Zynq system with GPIO I/F and Debian Linux
l GPIO devices (LED and SW) are accessed from software on CPU
l (User IP can be added on PL part, if needed)
Shinya T-Y, NAIST 2
ARM
Core
L1
L2
DRAM
I/F
ARM
Core
L1
PS
PL
GPIO User IP
LED SW
FPGA
DRAM
GP
ACP HP
3. Setup flow for Debian Linux on Zynq
n Download and setup of FPGA board file (for Zybo)
n Hardware development on Vivado
n U-boot SPL and U-boot (only once)
n Linux kernel (only once) and device tree (only once)
n Debian root file system (only once)
n Setup SD card (only once)
n Boot from SD card
n CMA (Continuous memory allocator) driver (only once)
n Run test applications
n How to replace the bitstream
Shinya T-Y, NAIST 3
4. Reference platform
n FPGA board: Digilent Zybo (Zynq XC7Z010)
l Almost same flow can be applied to ZedBoard and ZC706
n FPGA tool: Xilinx Vivado 2015.4
l License is "Web Pack"
n Target OS: Debian 8.0 (Jessie)
n Host OS: Ubuntu 14.04
Shinya T-Y, NAIST 4
6. FPGA board file for Zybo
n Zybo's board setting (I/O pins, …) is not included in Vivado.
Download and install it from Digilent web page
l https://reference.digilentinc.com/vivado:boardfiles/
l Follow the procedure on the web page
Shinya T-Y, NAIST 6
7. Install board file into Vivado system
n Unzip the download file and copy it into Vivado system
Shinya T-Y, NAIST 7
cp -a vivado-boardfiles-master/new/boardfiles/* ¥
/opt/Xilinx/Vivado/2015.4/data/boards/board_files/
9. Hardware development on Vivado
n Setup PATH
l If you use bash (default) or zsh
l If you use tcsh
n Create a working directory and launch Vivado
Shinya T-Y, NAIST 9
source /opt/Xilinx/Vivado/2015.4/settings64.sh
source /opt/Xilinx/Vivado/2015.4/settings64.csh
cd ~/
mkdir zybo_debian
mkdir zybo_debian/hw
cd zybo_debian/hw
vivado &
39. Export Hardware with Bitstream (only once)
n This step is required only once for U-boot compilation
Shinya T-Y, NAIST 39
File -> Export -> Export Hardware
41. Prepare "ps7_init_gpl.{c,h}" by using "hsi"
(only once, for Zybo)
n Go to the SDK directory
n Launch "hsi"
n Open HW design
n Generate application files
l Type this command in 1 line!
n Complete!
Shinya T-Y, NAIST 41
cd ~/zybo_debian/hw/zybo/zybo.sdk
hsi
open_hw_design zybo_wrapper.hdf
generate_app -hw zybo_wrapper -os standalone -proc
ps7_cortex9_0 -app zynq_fsbl -sw fsbl -dir zynq_fsbl
quit
42. Prepare "ps7_init_gpl.{c,h}" by using "hsi"
(only once, for Zybo)
n Example in PNG
n If you use Zybo or other special boards unlike ZedBoard
and ZC706, you must create ps7_init_gpl.*
l ps7_init_gpl.* for ZedBoard and ZC706 are already included in U-
boot as default
n Generated "ps7_init_gpl.{c,h}" files are used later for
building U-boot
Shinya T-Y, NAIST 42
43. Hardware development completed
n Your bitstream can be found at
zynq_debian/hw/zybo/zybo.runs/impl_1/zybo_wrapper.bit
n Copy the bitstream to somewhere (BOOT)
Shinya T-Y, NAIST 43
mkdir ~/zybo_debian/BOOT
cp ~/zybo_debian/hw/zybo/zybo.runs/impl_1/zybo_wrapper.bit ~/zybo_debian/BOOT
45. Download U-boot and modify it
n Create a new working directory for software
n Clone from GitHub
n Checkout the tagged version for Vivado 2015.4
n Edit "zynq-common.h"
Shinya T-Y, NAIST 45
mkdir ~/zybo_debian/sw
cd ~/zybo_debian/sw
git clone https://github.com/Xilinx/u-boot-xlnx.git
emacs include/configs/zynq-common.h
cd u-boot-xlnx
git checkout xilinx-v2015.4
46. Edit "CONFIG_EXTRA_ENV_SETTINGS"
and "CONFIG_BOOTCOMMAND"
n CONFIG_EXTRA_ENV_SETTINGS
n CONFIG_BOOTCOMMAND
Shinya T-Y, NAIST 46
/* Default environment */
#define CONFIG_EXTRA_ENV_SETTINGS ¥
"fpgaload=load mmc 0 0x1000000 zynq.bit¥0 " ¥
"fpgaboot=fpga loadb 0 0x1000000 $filesize¥0 " ¥
"bootimage=uImage¥0" ¥
"fdtaddr=0x00000100¥0" ¥
"fdtimage=devicetree.dtb¥0" ¥
"loadaddr=0x8000¥0" ¥
"mmcloadcmd=fatload¥0" ¥
"mmcloadpart=1¥0" ¥
"mmcroot=/dev/mmcblk0p2¥0" ¥
"mmcload=mmc rescan; fatload mmc 0:1 ${loadaddr} ${bootimage}; fatload mmc 0:1 ${fdtaddr} ${fdtimage}¥0" ¥
"mmcboot=setenv bootargs console=ttyPS0,115200 root=${mmcroot} rw rootwait uio_pdrv_genirq.of_id=dmem-uio; bootm ${loadaddr} - ${fdtaddr}¥0" ¥
DFU_ALT_INFO
/* default boot is according to the bootmode switch settings */
#define CONFIG_BOOTCOMMAND "run fpgaload; run fpgaboot; run mmcload; run mmcboot"
48. Build U-boot
n Setup PATH
l If you use bash (default) or zsh
l If you use tcsh
n Setup some parameters
l If you use bash or zsh
l If you use tcsh
Shinya T-Y, NAIST 48
source /opt/Xilinx/Vivado/2015.4/settings64.sh
source /opt/Xilinx/Vivado/2015.4/settings64.csh
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export ARCH=arm
setenv CROSS_COMPILE arm-xilinx-linux-gnueabi-
setenv ARCH arm
49. Build U-boot
n If you use Zybo (or an other board that its fsbl software
source code is NOT included in "u-boot-xlnx/board/zynq/"),
copy "ps7_init_gpl.{c,h}" from SDK directory to "u-boot-
xlnx/board/xilinx/zynq/custom_hw_platform"
l Files for ZedBoard and ZC706 are included as default
You can find these files, such like
"u-boot-xlnx/board/xilinx/zynq/zed_hw_platform"
n At "u-boot-xlnx"
Shinya T-Y, NAIST 49
cp ~/zybo_debian/hw/zybo/zybo.sdk/ps7_init_gpl.* ¥
board/xilinx/zynq/custom_hw_platform
50. Build U-boot
n At u-boot-xlnx
l If you youse other boards, such as ZedBoard, please find its
corresponding config command at u-boo-xlnx/configs, such as
"configs/zynq_zed_defconfig"
n Then, make
Shinya T-Y, NAIST 50
make zynq_zybo_defconfig
make
51. Build U-boot
n Example in PNG
n "u-boot.img" and "boot.bin" have been generated
at u-boot-xlnx
Shinya T-Y, NAIST 51
52. U-boot has been successfully generated
n Copy two files into somewhere
n Boot order is
(1) U-boot SPL -> (2) U-boot -> (3) Linux Kernel
n Even if you want to change the hardware design, no build
of U-boot is required anymore
Shinya T-Y, NAIST 52
cp u-boot.img ~/zybo_debian/BOOT/
cp boot.bin ~/zybo_debian/BOOT/
54. Download Linux kernel
n Move to the software directory
n Clone from GitHub
n Checkout the tagged version for Vivado 2015.4
Shinya T-Y, NAIST 54
cd ~/zybo_debian/sw
git clone https://github.com/Xilinx/linux-xlnx.git
cd linux-xlnx
git checkout xilinx-v2015.4.01
56. Configure the kernel options
n At linux-xlnx, load the default options
n Configure the kernel options by menuconfig
Shinya T-Y, NAIST 56
make xilinx_zynq_defconfig
make menuconfig
64. Build Linux kernel and device tree
n Setup PATH
l If you use bash (default) or zsh
l If you use tcsh
n Build the kernel image and device tree
Shinya T-Y, NAIST 64
export PATH=~/zybo_debian/sw/u-boot-xlnx/tools:$PATH
make uImage LOADADDR=0x00008000
setenv PATH ~/zybo_debian/sw/u-boot-xlnx/tools:$PATH
65. Build Linux kernel and device tree
n Example in PNG
Shinya T-Y, NAIST 65
66. Linux kernel and device tree have been
successfully generated
n Copy uImage and zynq-zybo.dtb to somewhere
n Even if you want to change the hardware design, no build
of Linux kernel is required anymore
l Device tree should be modified, if you change different address
mapping
Shinya T-Y, NAIST 66
cp arch/arm/boot/uImage ~/zybo_debian/BOOT
cp arch/arm/boot/dts/zynq-zybo.dtb ~/zybo_debian/BOOT
68. Setup environment
n Setup parameters (on bash)
n Build the root file system in $targetdir (= rootfs)
Shinya T-Y, NAIST 68
cd ~/zybo_debian
sudo apt-get install qemu-user-static debootstrap binfmt-support
export targetdir=rootfs
export distro=jessie
mkdir $targetdir
sudo debootstrap --arch=armhf --foreign $distro $targetdir
sudo cp /usr/bin/qemu-arm-static $targetdir/usr/bin
sudo cp /etc/resolv.conf $targetdir/etc
sudo chroot $targetdir
69. Build rootfs with QEMU
n Setup APT
Shinya T-Y, NAIST 69
distro=jessie
export LANG=C
/debootstrap/debootstrap --second-stage
cat <<EOT > /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian $distro main contrib non-free
deb-src http://ftp.jp.debian.org/debian $distro main contrib non-free
deb http://ftp.debian.org/debian $distro-updates main contrib non-free
deb-src http://ftp.debian.org/debian $distro-updates main contrib non-free
deb http://security.debian.org/debian-security $distro/updates main contrib non-free
deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free
EOT
cat << EOT > /etc/apt/apt.conf.d/71-no-recommends
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOT
70. Build rootfs with QEMU
n Install applications and setup root password
n IP address
Shinya T-Y, NAIST 70
apt-get update
apt-get install locales dialog
dpkg-reconfigure locales
apt-get install openssh-server ntpdate resolvconf sudo less hwinfo ntp tcsh zsh
passwd
echo <<EOT >> /etc/network/interfaces
auto eth0
iface eth0 inet static
hwaddress ether 00:0a:35:00:02:00
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 192.168.0.1
EOT
71. Build rootfs with QEMU
n resolve.conf
n sshd_config
l “PasswordAuthentication yes”
Shinya T-Y, NAIST 71
echo <<EOT >> /etc/resolv.conf
nameserver 192.168.0.1
EOT
vi /etc/ssh/sshd_config
72. Build rootfs with QEMU
n Add a new admin user
l Enter, enter, …
n Edit sudo user
l Edit like below
Shinya T-Y, NAIST 72
adduser username
editor=vi visudo
# User privilege specification
root ALL=(ALL:ALL) ALL
username ALL=(ALL:ALL) ALL
73. Build rootfs with QEMU
n ntp.conf
n Insert a new server (in my case "ntp.nict.jp")
Shinya T-Y, NAIST 73
vi /etc/ntp.conf
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
server ntp.nict.jp
74. Build rootfs with QEMU
n rc.local
n Insert 3 lines for NTP setup
Shinya T-Y, NAIST 74
vi /etc/rc.local
service ntp stop
ntpdate ntp.nict.jp
service ntp start
exit 0
75. Build rootfs with QEMU
n fstab
n Insert 1 line (to mount 1st partition of SD card)
n Create a new directory for 1st partition of SD card
Shinya T-Y, NAIST 75
vi /etc/fstab
/dev/mmcblk0p1 /sdcard auto defaults 0 0
mkdir sdcard
76. Build rootfs with QEMU
n Permission rule of /dev/uio (Userspace I/O)
n Permission rule of /dev/xdevconfig (Configuration port)
Shinya T-Y, NAIST 76
echo KERNEL=="uio*", MODE="0666",OWNER="root",GROUP="root" >> /etc/udev/rules.d/50-uio.rules
echo KERNEL=="xdevcfg", MODE="0666",OWNER="root",GROUP="root" >> /etc/udev/rules.d/50-xdevcfg.rules
77. Build rootfs with QEMU
n Hostname, etc.
n Install applications (if you need)
n Finish
Shinya T-Y, NAIST 77
echo debian-zynq > /etc/hostname
echo T0:2345:respawn:/sbin/getty -L ttyS0 115200 vt1000 >> /etc/inittab
echo 127.0.0.1 debian-zynq >> /etc/hosts
apt-get install build-essential
apt-get install screen bash-completion time
apt-get install python python-pip python3 python3-pip
apt-get install nis nfs-common
exit
sudo rm -f $targetdir/usr/bin/qemu-arm-static
79. Format SD card
n Prepare SD card (> 8GB)
n Install and launch gparted
n Setup 2 partitions
l BOOT (64MB, FAT32, with "bootable" flag)
ü 4MB empty space ahead
l rootfs (rest all, ext4)
Shinya T-Y, NAIST 79
sudo apt-get install gparted -y
sudo gparted &
empty
(4MB)
BOOT
(64MB, FAT32, bootable)
rootfs
(rest, ext4)
80. Copy the created files into the SD card
n Mount the formatted SD card
l /media/yourname/BOOT and /media/yourname/rootfs
n Copy bitstream, U-boot, Linux kernel, and device tree
n Copy rootfs
n Unmount BOOT and rootfs
Shinya T-Y, NAIST 80
cp ~/zybo_debian/BOOT/boot.bin /media/yourname/BOOT/
cp ~/zybo_debian/BOOT/u-boot.img /media/yourname/BOOT/
cp ~/zybo_debian/BOOT/zybo_wrapper.bit /media/yourname/BOOT/zynq.bit
cp ~/zybo_debian/BOOT/uImage /media/yourname/BOOT/
cp ~/zybo_debian/BOOT/zynq-zybo.dtb /media/yourname/BOOT/devicetree.dtb
sudo cp -a ~/zybo_debian/rootfs/* /media/yourname/rootfs/
84. Boot system from SD card
n Connect Zybo to network
l Or connect UART port to the host PC
n Insert SD card and power-on
n Login via SSH (type password)
n Or login via UART: type username and password
Shinya T-Y, NAIST 84
ssh username192.168.0.100
85. Time zone and locale
n Change the time zone
l In my case, Asia -> Tokyo
n Change the locale
l Select "en_US.UTF-8", "ja_JP.UTF-8", and "ja_JP.EUC-JP"
l Then select "en_US.UTF-8" as default
n Reboot
Shinya T-Y, NAIST 85
(on zynq) sudo dpkg-reconfigure tzdata
(on zynq) sudo dpkg-reconfigure locales
(on zynq) sudo reboot
87. Copy linux-xlnx into the SD card
n Mount the formatted SD card
l /media/yourname/BOOT and /media/yourname/rootfs
n Copy linux-xlnx into rootfs
n Create symbolic link to "linux"
n Download "udmabuf" from GitHub
n Remove SD card and boot again from SD card
Shinya T-Y, NAIST 87
sudo cp -a ~/zybo_debian/sw/linux-xlnx /media/yourname/rootfs/usr/src/linux
sudo ln -s /media/yourname/rootfs/usr/src/linux /media/yourname/rootfs/usr/src/kernel
git clone https://github.com/shtaxxx/udmabuf.git
sudo mkdir /media/yourname/rootfs/drivers
sudo cp -a udmabuf /media/yourname/rootfs/drivers/
88. Build CMA driver
n Login
n Compile kernel modules
n Compile CMA driver
Shinya T-Y, NAIST 88
(on zynq) cd /usr/src/kernel
(on zynq) sudo make modules_prepare
(on zynq) cd /drivers/udmabuf
(on zynq) sudo make
(on zynq) sudo cp udmabuf.ko /drivers/
(on zynq) sudo cp settings/setup_udmabuf.sh /drivers/
89. Modify /etc/rc.local for CMA driver
n Edit /etc/rc.local
n Insert 1 line before "exit 0"
n Reboot
Shinya T-Y, NAIST 89
sh /drivers/setup_udmabuf.sh
exit 0
(on zynq) sudo vi /etc/rc.local
(on zynq) sudo reboot
91. Download applications and library
n Download "zynq-linux" from GitHub
n Copy zynq-linux to Zynq system
l Type password
n Login on Zynq and go to zynq-linux/sample
Shinya T-Y, NAIST 91
(on zynq) cd zynq-linux/sample
git clone https://github.com/PyHDI/zynq-linux.git
scp -r zynq-linux username@192.168.0.100
92. Run GPIO test
n Compile "axis_test.c" and run it
l LED pattern is changed
l The value of switches is read
Shinya T-Y, NAIST 92
(on zynq) gcc -O2 -I ../lib/ -o axis.out axis_test.c
(on zynq) ./axis.out 15
write: 15
read: 1
93. Run CMA test
n Compile "cma_test.c" and run it
n RUN MODE 0: No CMA
n RUN MODE 1-3: CMA
l 1: Cache Enabled
l 2: Cache Disabled
l 3: Cache Disabled, Write-merged
Shinya T-Y, NAIST 93
(on zynq) gcc -O2 -I ../lib/ -o cma.out cma_test.c
(on zynq) ./cma.out 10000000 0
(on zynq) ./cma.out 10000000 1
(on zynq) ./cma.out 10000000 2
(on zynq) ./cma.out 10000000 3
95. Method1: Replace zynq.bit in /sdcard/
n The bitstream on SD card can be replaced on host PC
n Since 1st partition of SD card is mounted on /sdcard/, the
bistream can be replaced directly by Zynq software
n No modifications of U-boot and Linux kernel are required
n If you don't chage the address mapping for GPIO, no
modification of device tree is required
Shinya T-Y, NAIST 95
(on zynq) sudo cp new_zynq.bit /sdcard/zynq.bit
(on zynq) sudo reboot
96. Method2: Reconfigure via /dev/xdevcfg
n Logic part (PL) can be dynamically changed from SW
n If you change the CPU settings, such as frequency, port
configuration, etc., this flow is not perfect.
Replace "zynq.bit" on SD card and reboot, instead of this
flow
Shinya T-Y, NAIST 96
(on zynq) cat new_zynq.bit > /dev/xdevcfg
98. Reference
n Yet Another Guide to Running Linaro Ubuntu Linux Desktop
on Xilinx Zynq on the ZedBoard
l https://fpgacpu.wordpress.com/2013/05/24/yet-another-guide-to-
running-linaro-ubuntu-desktop-on-xilinx-zynq-on-the-zedboard/
n Building a pure Debian armhf rootfs
l https://blog.night-shade.org.uk/2013/12/building-a-pure-debian-
armhf-rootfs/
n FPGA Magazine (No.12, March 2016)
l http://www.kumikomi.net/fpga/contents/0012.php
Shinya T-Y, NAIST 98