Successfully reported this slideshow.
Your SlideShare is downloading. ×

Debian Linux on Zynq (Xilinx ARM-SoC FPGA) Setup Flow (Vivado 2015.4)

Loading in …3

Check these out next

1 of 98 Ad
1 of 98 Ad

More Related Content

Slideshows for you (19)

Similar to Debian Linux on Zynq (Xilinx ARM-SoC FPGA) Setup Flow (Vivado 2015.4) (20)


More from Shinya Takamaeda-Y (20)


Debian Linux on Zynq (Xilinx ARM-SoC FPGA) Setup Flow (Vivado 2015.4)

  1. 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:
  2. 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. 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. 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
  5. 5. Download and setup FPGA board file Shinya T-Y, NAIST 5
  6. 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 l Follow the procedure on the web page Shinya T-Y, NAIST 6
  7. 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/
  8. 8. Hardware development on Vivado Shinya T-Y, NAIST 8
  9. 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/ source /opt/Xilinx/Vivado/2015.4/settings64.csh cd ~/ mkdir zybo_debian mkdir zybo_debian/hw cd zybo_debian/hw vivado &
  10. 10. Create a new project Shinya T-Y, NAIST 10
  11. 11. Shinya T-Y, NAIST 11
  12. 12. Shinya T-Y, NAIST 12
  13. 13. Shinya T-Y, NAIST 13
  14. 14. Shinya T-Y, NAIST 14
  15. 15. Shinya T-Y, NAIST 15
  16. 16. Shinya T-Y, NAIST 16
  17. 17. Shinya T-Y, NAIST 17 Select your board
  18. 18. Shinya T-Y, NAIST 18
  19. 19. Add a block design Shinya T-Y, NAIST 19
  20. 20. Shinya T-Y, NAIST 20
  21. 21. Add IP Shinya T-Y, NAIST 21
  22. 22. Add CPU Shinya T-Y, NAIST 22
  23. 23. Add GPIO for LED and switch Shinya T-Y, NAIST 23
  24. 24. Customize CPU Shinya T-Y, NAIST 24 Double click
  25. 25. Connect to DRAM Shinya T-Y, NAIST 25
  26. 26. Customize GPIO Shinya T-Y, NAIST 26 Double click
  27. 27. Connect to LED and switches Shinya T-Y, NAIST 27
  28. 28. Connect CPU and GPIO Shinya T-Y, NAIST 28
  29. 29. Connect S_AXI and GPIO by auto Shinya T-Y, NAIST 29
  30. 30. Connect LED and GPIO Shinya T-Y, NAIST 30
  31. 31. Connect switches and GPIO2 Shinya T-Y, NAIST 31
  32. 32. Complete HW block design Shinya T-Y, NAIST 32
  33. 33. Modify address value Shinya T-Y, NAIST 33 0x43c0_0000 is recommended
  34. 34. Validate design Shinya T-Y, NAIST 34
  35. 35. Create HDL wrapper Shinya T-Y, NAIST 35 Then right click the block design, and select "Create HDL Wrapper"
  36. 36. Shinya T-Y, NAIST 36
  37. 37. Generate Bitstream Shinya T-Y, NAIST 37 Click "Generate Bitstream"
  38. 38. Bitstream has been Generated Shinya T-Y, NAIST 38
  39. 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
  40. 40. Export Hardware with Bitstream (only once) Shinya T-Y, NAIST 40
  41. 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. 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. 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
  44. 44. U-boot SPL and U-boot Shinya T-Y, NAIST 44
  45. 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 emacs include/configs/zynq-common.h cd u-boot-xlnx git checkout xilinx-v2015.4
  46. 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"
  47. 47. Edit "CONFIG_EXTRA_ENV_SETTINGS" and "CONFIG_BOOTCOMMAND" n Example in PNG (Check carefully!) Shinya T-Y, NAIST 47
  48. 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/ 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. 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. 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. 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. 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/
  53. 53. Linux kernel Shinya T-Y, NAIST 53
  54. 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 cd linux-xlnx git checkout xilinx-v2015.4.01
  55. 55. Edit device tree file n Edit "zynz-zybo.dts" l if you use other device, please find the corresponding device tree file in "linux-xlnx/arch/arm/boot/dts/" n Edit it to add UIO (user-space I/O) interfaces Shinya T-Y, NAIST 55 emacs arch/arm/boot/dts/zynq-zybo.dts axis0 { compatible = "dmem-uio"; reg = < 0x43c00000 0x010000 >; // (address, size) }; axis1 { compatible = "dmem-uio"; reg = < 0x43c10000 0x010000 >; // (address, size) }; axis2 { compatible = "dmem-uio"; reg = < 0x43c20000 0x010000 >; // (address, size) }; axis3 { compatible = "dmem-uio"; reg = < 0x43c30000 0x010000 >; // (address, size) }; axis4 { compatible = "dmem-uio"; reg = < 0x43c40000 0x010000 >; // (address, size) }; axis5 { compatible = "dmem-uio"; reg = < 0x43c50000 0x010000 >; // (address, size) }; axis6 { compatible = "dmem-uio"; reg = < 0x43c60000 0x010000 >; // (address, size) }; axis7 { compatible = "dmem-uio"; reg = < 0x43c70000 0x010000 >; // (address, size) }; Insert these lines
  56. 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
  57. 57. Device Drivers-> Shinya T-Y, NAIST 57
  58. 58. Device Drivers->Userspace I/O drivers Shinya T-Y, NAIST 58
  59. 59. Enable UIO Shinya T-Y, NAIST 59
  60. 60. Device Drivers->Generic Driver Options Shinya T-Y, NAIST 60
  61. 61. Edit Size in Mega Bytes of CMA Shinya T-Y, NAIST 61 Set 256
  62. 62. (Option) File systems->Network File Systems Shinya T-Y, NAIST 62
  63. 63. Check "linux-xlnx/.config" n At linux-xlnx n Especially, check the size of CMA Shinya T-Y, NAIST 63 less .config
  64. 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. 65. Build Linux kernel and device tree n Example in PNG Shinya T-Y, NAIST 65
  66. 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
  67. 67. Debian root file sytem Shinya T-Y, NAIST 67
  68. 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. 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 $distro main contrib non-free deb-src $distro main contrib non-free deb $distro-updates main contrib non-free deb-src $distro-updates main contrib non-free deb $distro/updates main contrib non-free deb-src $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. 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 netmask gateway dns-nameservers EOT
  71. 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 EOT vi /etc/ssh/sshd_config
  72. 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. 73. Build rootfs with QEMU n ntp.conf n Insert a new server (in my case "") Shinya T-Y, NAIST 73 vi /etc/ntp.conf #server iburst #server iburst #server iburst #server iburst server
  74. 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 service ntp start exit 0
  75. 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. 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. 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 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
  78. 78. Setup SD card Shinya T-Y, NAIST 78
  79. 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. 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/
  81. 81. Boot from SD card Shinya T-Y, NAIST 81
  82. 82. Jumper pin (Zybo): Set SD boot Shinya T-Y, NAIST 82
  83. 83. Jumper pin (ZedBoard) Shinya T-Y, NAIST 83
  84. 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. 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
  86. 86. CMA (Continuous memory allocator) driver Shinya T-Y, NAIST 86
  87. 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 sudo mkdir /media/yourname/rootfs/drivers sudo cp -a udmabuf /media/yourname/rootfs/drivers/
  88. 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/ /drivers/
  89. 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/ exit 0 (on zynq) sudo vi /etc/rc.local (on zynq) sudo reboot
  90. 90. Run test applications Shinya T-Y, NAIST 90
  91. 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 scp -r zynq-linux username@
  92. 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. 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
  94. 94. How to replace the bitstream Shinya T-Y, NAIST 94
  95. 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. 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
  97. 97. Reference Shinya T-Y, NAIST 97
  98. 98. Reference n Yet Another Guide to Running Linaro Ubuntu Linux Desktop on Xilinx Zynq on the ZedBoard l running-linaro-ubuntu-desktop-on-xilinx-zynq-on-the-zedboard/ n Building a pure Debian armhf rootfs l armhf-rootfs/ n FPGA Magazine (No.12, March 2016) l Shinya T-Y, NAIST 98