Zynq linux on qspi flash

install linux on microzed board

The microzed development board has Xilinx zynq7000 chip. It has an application process unit with cortex a9 and FPGA fabric. The board also contains interfaces like SDIO and QSPI. I want to install Linux on it directly with yocto and without petalinux, which runs yocto behind the scene, so I tried to eliminate the need to use it. Why do so?

  • It is interesting, and I have a lot of experience with yocto and it very easy to work with its script once you know it
  • easy porting to other processors: IMX, stm32Mp157, etc’
  • using build tools like CMake,Autotools, and yocto scripts make it very easy to port SW between different processors.

I found that meta-xilinx layer and used it to build a Linux system for the microzed board. Refer here for a list supported bords and creating a custom board can be very easy if one tracks the existing ones.

yocto installation

The basic yocto installation includes poky and meta-Xilinx layers; check out the following yocto layers and switch to zeus branch:

mkdir yocto cd yocto git clone git://git.yoctoproject.org/poky.git git clone https://github.com/Xilinx/meta-xilinx git clone http://github.com/Xilinx/meta-xilinx-tools . ./poky/oe-init-build-env 

add the meta-xilinx layers:

bitbake-layers add-layer /path/to/meta-xilinx bitbake-layers add-layer /path/to/meta-xilinx-tools 

and change the configration file conf/local.conf:

# to build microzed board MACHINE ??= "microzed-zynq7" # to allow c++ IMAGE_INSTALL_append = " libstdc++" TOOLCHAIN_TARGET_TASK_append = " libstdc++-staticdev" 

Use the following yocto builds:

# to create minimal CPIO image (3M Bytes) + kernel + u-boot bitbake core-image-minimal bitbake u-boot 

flash image on QSPI

FSBL

The next step is to generate FSBL application for microzed platform board. The board definition files (BDF) should be installed on vivado as refer here. So, just create a new HW project in vivado for microzed and the export the XSA (of HDF) file to vitis (of SDK) and then create a new FSBL application.

boot.bin

To create the boot.bin file, we can use bootgen, which is a tool of Xilinx or to use mkbootimage which is an open-source replacement for Xilinx bootgen tool. I took the values of the parameters load and offset address from the u-boot file zynq-common.h.

#!/bin/bash UIMAGE_LOAD=0x3000000 DTB_LOAD=0x2a00000 FS_LOAD=0x2000000 KERNEL_ENTRY=0x100000 DTS_ENTRY=0x600000 RAM_FS_ENTRY=0x620000 cat  boot.bif img :  [bootloader]/home/yair/workspace2/fsbl_microzed/Release/fsbl_microzed.elf /home/yair/xilinx/yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/u-boot/1_2019.07-r0/build/u-boot.elf [load=$,offset=$]yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.2+gitAUTOINC+b983d5fd71-r0/deploy-linux-xnx/uImage [load=$,offset=$]yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.2+gitAUTOINC+b983d5fd71-r0/deploy-linux-xlnx/zynq-microzed-microzed-zynq7.dtb [load=$,offset=$]yocto/build/tmp/deploy/images/microzed-zynq7/core-image-minimal-microzed-zynq7.cpio.gz.u-boot > EOF bootgen -image boot.bif -o i boot.bin -w 

flash the board

To flash the image on the qspi is has to set the board at jtag mode and run the following command:

program_flash -f /path/to/boot.bin -offset 0 -flash_type qspi_single -fsbl /path/to/fsbl_microzed.elf -blank_check -verify -cable type xilinx_tcf url TCP:127.0.0.1:3121 

also so, it can refer here about how to eliminate the need for JTAG mode by adding this line to FSBL at main.c

/* * Read bootmode register */ BootModeRegister = Xil_In32(BOOT_MODE_REG); BootModeRegister &= BOOT_MODES_MASK; //add this line to trick boot mode to JTAG BootModeRegister = JTAG_MODE; 

manual boot

This u-boot commands will read files from QSPI and will load the Linux kernel it can also automated using u-boot enviroment variables and scripts.

sf probe 0 0 0 sf read 0x2000000 0x620000 0x500000 sf read 0x3000000 0x100000 0x5e0000 sf read 0x2a00000 0x600000 0x20000 bootm 0x3000000 0x2000000 0x2a00000 

boot image on sd card

The stages for flashing images on the sd card are similar to those that have on the QSPI. But I was to use a completely open-source without FSBL. The idea is to take the boot.bin file ( generated using vivado tools) and replace it with the secondary boot loader (SPL). The most important file is ps7_init_gpl.c which one create it using vivado tools, and it also platforms unique and responsible to initialize the most critical peripherals in the board: The DDR controller, clocks and MIO pins. If a new platform is a design, then, is has to generate a new file for the new platform. It has to copy the following files to the sd card, refer here for more details:

file name on sd card note
boot.bin BOOT.bin It is the SPL and replace the previous boot.bin
yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.2+gitAUTOINC+b983d5fd71-r0/deploy-linux-xlnx/microzed.dtb devicetree.dtb The device tree file
yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/linux-xlnx/4.19-xilinx-v2019.2+gitAUTOINC+b983d5fd71-r0/deploy-linux-xnx/uImage uImage u-boot image of linux kernel
yocto/build/tmp/deploy/images/microzed-zynq7/core-image-minimal-microzed-zynq7.cpio.gz.u-boot uramdisk.image.gz u-boot image of compressed CPIO file system
yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/u-boot/1_2019.07-r0/build/u-boot.img u-boot.img It is a u-boot image that contains u-boot.bin, and the SPL loads it from sd card extract the u-boot.bin and loads it to memory. Reffer here to the default name u-boot.img that is used by SPL

The names mentioned in the table above, are arrived from the file boot.cmd which process of yocto build generates that file.

$ yocto/build/tmp/work/microzed_zynq7-poky-linux-gnueabi/u-boot-zynq-scr/1.0-r0 $ cat boot.cmd fatload mmc 0 0x2000000 zynq-microzed.dtb fatload mmc 0 0x2080000 uImage fatload mmc 0 0x4000000 uramdisk.image.gz bootm 0x2080000 0x4000000 0x2000000 

TO do: Install boot image on QSPI with SPL

To eliminate the FSBL when using QSPI.

Источник

4a4ik

В данной статье будет описано каким образом подготовить все необходимые файлы для запуска Linux с FPGA фирмы Xilinx, а именно отладочной платы Zybo. С последующей записью необходимых файлов на QSPI и запуском готовой системы.

Разработка FPGA части будет производиться в Vivado 2019.1, компиляция необходимых файлов для Linux будет выполнена в виртуальной машине Oracle VM VirtualBox, на которой установлена Ubuntu.

Компиляция будет происходить без использования PetaLinux, как утверждают Xilinx — это платформа, которая содержит всё необходимое для запуска Linux на FPGA и облегчает внесение изменений. В данном руководстве всё будет собираться ручным образом, для того чтобы ближе взглянуть на работу встроенных систем.

Процесс загрузки системы описывается следующей схемой, взятой из UG1165 и UG873:

Рис.1 структурная схема загрузки системы

Boot ROM — выполнение инструкций содержащихся в специально отведённой памяти FPGA, они осуществляют изначальную инициализацию, выбирают носитель в котором будет произведён поиск FSBL и запускают его. Изменить этот код нельзя, остальные файлы необходимо подготовить.

Первым шагом следует создать проект в Vivado. Для проверки работоспособности платы и корректных настроек можно использовать готовый проект от Xilinx расположенный на github, он реализован на версии 2017.4. Но в данном руководстве используется версия 2019.1 и проект создаётся с нуля. Тем не менее там можно посмотреть правильные настройки для DDR и QSPI.

В отладочной плате Zybo используется XC7Z010CLG400С-1 его и следует выбрать при создании проекта. Xilinx рекомендует использовать готовые библиотеки для своих отладочных плат, при создании проекта, вместо конкретной микросхемы. Как они говорят это облегчает подключение различных интерфейсов, подробное описание здесь. Но для того чтобы не привязываться к конкретным библиотекам выберем отдельно необходимую микросхему.

Рис.2 Выбор микросхемы

Далее нужно создать Block Design. В левом меню, под «IP Integrator», нажимаем «Create Block Design», в создавшемся Block Design добавляем новое IP ядро «Zynq7 processing system», далее жмём в верхней части экрана «Run Block Automation» в появившемся окне нажимаем ok. После выполнения данных действий, процессор должен быть корректно подключен к своим основным выводам.
После этого нужно соединить выводы FCLK_CLK0 и M_AXI_GP0_ACLK, таким образом подаётся частота на AXI интерфейс, он использоваться не будет, но без этого нельзя скомпилировать проект.

В данном руководстве не будет использоваться FPGA часть устройства, необходимо подключить лишь основные компоненты, большая часть из которых соединились автоматически. Но следует корректно настроить параметры тактовой частоты системы, QSPI и RAM память. Для простоты и уменьшения возможности ошибок желательно использовать готовый проект от Xilinx расположенный на github, но тем не менее далее будут приведены изменения которые необходимо сделать вручную при создании нового проекта.

Подключение и используемые компоненты можно посмотреть на схеме, которая находится в открытом доступе.

Двойным щелчком можно открыть настройки IP ядра процессора, для начала в разделе «Clock configuration» выставим корректное значение тактовой частоты процессора. Тактовые сигналы подаются на вывод PS_CLK_500, его и к чему он подсоединяется можно найти на странице 9:

Рис.4 Генератор тактовой частоты процессора

Как видно на процессор подаются тактовые сигналы с частотой 50 МГц.
Выставим это в Vivado:

Рис.5 Настройка тактовой частоты процессора

В качестве RAM используется 2 блока DDR3 памяти «MT41J128M16JT-125» (стр 12):

Рис.6 RAM память

В разделе «DDR Configuration» следует указать используемую память. Но её не окажется среди доступных, её там нет из-за того, что это устаревшая версия. Новая версия ничем не отличается от предыдущей, но в дополнение может работать при низком напряжении, её код «MT41K128M16JT-125», отличается лишь одной буквой. Её и следует выбрать.

Рис.7 Настройка RAM

Также желательно выставить задержку распространения сигнала, значения из тестового проекта представлены ниже, но начиная с Vivado 2018.1 при сохранении введённых настроек компилятор выдаст предупреждение об отрицательных значениях задержек, подробное описание проблемы находится здесь. Чтобы убрать ошибки нужно отрицательные значения изменить на 0.

Рис.8 Настройка задержек на дорожках печатной платы

Далее следует перейти в «MIO Configuration» изменить «Bank 1 I/O Voltage» на «LVCMOS 1.8V» и в том же окне под «Memory interfaces» поставить галочку напротив «Quad SPI Flash», галочку напротив «Feedback CLK», поменять скорость на fast для всех выводов и отключить «pullup»:

Рис.9 Настройка интерфейсов

U-boot сперва настраивает периферию, по умолчанию он будет инициализировать Ethernet, SDIO, из-за этого их нужно подключить, иначе U-boot зависнет. Отключить их можно в исходниках U-boot /configs/zynq_zybo_defconfig. Для конфигурации в Vivado параметры следующие:

Рис.10 Настройка интерфейсов (2)
Рис.11 Настройка интерфейсов (3)

Также для того чтобы общаться с Linux, следует подключить UART:

Рис.12 Настройка интерфейсов (3)

Далее нужно создать HDL wrapper — во вкладке Sources, правой кнопкой на «design_1» и нажать «Create HDL wrapper. » и оставить вариант по умолчанию с автоматическим созданием.

После этого нужно скомпилировать проект. Затем экспортировать его в SDK, нажав File -> Export -> Hardware. В появившемся окне нужно поставить галочку рядом с «Include bitstream» и нажать ок.

Последним шагом следует запустить SDK через File -> Launch SDK. В дальнейшем в Vivado вводить изменения больше не потребуется.

Внутри SDK, нужно создать FSBL. Он установит правильные настройки частоты и DDR вместе с QSPI. Также загрузит все файлы в RAM. Дополнительная информация: Видео от Xilinx про FSBL. Xilinx wiki FSBL, документация TRM UG585, UG821. Для этого следует создать новый проект File -> New -> Application project.

Рис.13 Создание нового проекта

В появившемся окне ввести имя проекта, нажать Next и выбрать «Zynq FSBL».

Рис.14 Выбор FSBL

FSBL позволяет запустить либо baremetal аппликацию либо сторонний загрузчик который запустит полноценную ОС, в нашем случае используется U-Boot для запуска Linux.

Далее большая часть работы будет происходить в Linux. Также нужно будет переносить файлы между двумя ОС, как это делать в Oracle VM описано здесь.

Все необходимые файлы можно найти на xilinx-wiki.atlassian.net.
Дополнительная информация про U-Boot и про компиляцию: Build U-Boot.
Проще всего скачивать файлы через Git, для того чтобы его установить нужно выполнить:
sudo apt-get install git-core

Источник

Читайте также:  Драйвера принтеров astra linux
Оцените статью
Adblock
detector