[meta-xilinx] [ZynqMP] Booting from QSPI instead of SD Card
Mike Looijmans
mike.looijmans at topic.nl
Thu Nov 16 22:39:01 PST 2017
Much of the zynq booting information on the Xilinx website focuses on
petalinux and the Xilinx SDK and doesn't apply to the Openembedded/Yocto
toolflow at all.
The boot flow can be mostly the same as any ARM based board, but Xilinx
doesn't provide that information anywhere. You can find an example in our repo
though, https://github.com/topic-embedded-products/meta-topic which applies to
the Topic boards, but this should work with the Xilinx boards as well if you
use the appropriate configs and devicetrees.
The QSPI boot procedure for the ZynqMP using Yocto/OE should be:
Partition the QSPI:
- boot.bin (192k)
- ATF (128k or whatever your sector size is)
- u-boot.bin (768k)
- "rootfs"
Building u-boot SPL using OE should deliver boot.bin and u-boot.img. This
should also put the PMU firmware into boot.bin using the configuration option
in u-boot (this isn't done for Xilinx boards by default, see meta-topic how to
patch that in).
The arm-trusted-firmware binary (not the elf but the atf-qspi.bin that is
produced by the arm-trusted-firmware recipe) goes into the second partition.
This should get the bootloader up and running.
If you partition the rootfs using UBI, you can put the kernel, devicetree and
rootfs and FPGA bitstream in there. u-boot can read UBI filesystems so you
don't need separate partitions for these.
Tip: Boot to Linux using SD card, then program the QSPI flash using "flashcp"
commands and "ubiformat" for the root.
Note that you don't need FSBL or bootgen anywhere in this flow.
On 17-11-17 07:17, Giordon Stark wrote:
> Hi Sandeep,
>
> Thanks for the detail! Is this not documented at all anywhere on a Xilinx
> wiki? I'm surprised, given the slight complexity in the steps, that this
> procedure isn't as straightforward as for an SD Card boot [but maybe that's
> me]. I suppose I still have a few more questions using concrete examples:
>
> My BIF looks like
>
> //arch = zynqmp; split = false; format = BIN
> the_ROM_image:
> {
> [fsbl_config]a53_x64
> [bootloader]C:\Users\kratsg\Desktop\zu19eg_3.sdk\fsbl\Debug\fsbl.elf
> [destination_cpu = pmu]Z:\gfex-prototype3\pmu-gfex-prototype3.elf
> [destination_device =
> pl]C:\Users\kratsg\Desktop\zu19eg_3.sdk\zcu19eg_top_hw_platform_0\zcu19eg_top.bit
> [destination_cpu = a53-0, exception_level = el-3,
> trustzone]Z:\gfex-prototype3\arm-trusted-firmware.elf
> [destination_cpu = a53-0, exception_level =
> el-2]Z:\gfex-prototype3\u-boot.elf
> }
>
> *Why does the BIF not contain the kernel image - as you would do so in the
> procedure for SDCard boot?*
> *
> *
> Next, our DTS files are here:
> https://github.com/kratsg/meta-l1calo/tree/master/conf/machine/boards/gfex/prototype3.
> Specifically, I'm looking at "spi1 = &qspi" in system-top.dts and I will
> probably need to add the QSPI partitions under this. The point is that I make
> a flash node flash at 0(???) { partition1; partition2; partition3; .... }. *How
> do I know what to actually write for the flash at 0 stuff? It's not clear to me
> how large these blocks should be and how to make sure the offsets are correct
> and can be picked up via u-boot and so on. [I looked here:
> http://www.wiki.xilinx.com/Linux+ZynqMP+GQSPI+Driver as an example since your
> email about creating MTD partitions wasn't rendered correctly for me, so I
> couldn't read that part, missing an image or something else?]*
> *
> *
> *Finally, I'm a little confused about how you're able to have a Linux prompt
> without the kernel or filesystem.* Since it looks like you're programming QSPI
> with the devicetree, the kernel, and the filesystem -- how would you have a
> linux prompt before linux is on there? Chicken before the egg? Is the
> procedure that you flash the board with the BOOT.bin using the XSDK, get the
> u-boot prompt, and program the QSPI from u-boot prompt?
>
> Thanks!
>
> Giordon
>
> On Thu, Nov 16, 2017 at 11:16 PM Sandeep Gundlupet Raju <SANDEEPG at xilinx.com
> <mailto:SANDEEPG at xilinx.com>> wrote:
>
> Hi Giordon,____
>
> __ __
>
> $ vim boota53.bif //Add below content____
>
> __ __
>
> the_ROM_image:____
>
> {____
>
> [fsbl_config] a53_x64____
>
> [pmufw_image] <PATH_TO_IMAGES>/pmu_fw.elf____
>
> [bootloader] <PATH_TO_IMAGES>/zynqmp_fsbl.elf____
>
> [destination_device=pl] <PATH_TO_IMAGES>/design_1_wrapper.bit____
>
> [destination_cpu=a53-0] <PATH_TO_IMAGES>/bl31.elf____
>
> [destination_cpu=a53-0] <PATH_TO_IMAGES>/u-boot.elf____
>
> }____
>
> __ __
>
> Run below commands to generate the BOOT.bin____
>
> $ source vivado/setting.sh____
>
> $ bootgen -image boota53.bif -arch zynqmp -w -o i BOOT.bin ____
>
> __ __
>
>
> Using QSPI JFFS2 partition as root file system____
>
> __ __
>
> Linux rootfs can be mounted from JFFS2 partition on the qspi. This
> document briefs about the steps to use qspi JFFS2 rootfs. This procedure
> describes generic flow, which can be more simplified if you are using
> petalinux.____
>
> __ __
>
>
> Enabling JFFS2 support in Linux (enabled by default)____
>
> __ __
>
>
> Enable Generic QSPI controller driver____
>
> CONFIG_SPI_ZYNQMP_GQSPI: │____
>
> │ │____
>
> │ Enables Xilinx GQSPI controller driver for Zynq UltraScale+ MPSoC.
> │____
>
> │ │____
>
> │ Symbol: SPI_ZYNQMP_GQSPI [=y] │____
>
> │ Type : tristate │____
>
> │ Prompt: Xilinx ZynqMP GQSPI controller │____
>
> │ Location: │____
>
> │ -> Device Drivers │____
>
> │ -> SPI support (SPI [=y]) │____
>
> │ Defined at drivers/spi/Kconfig:716 │____
>
> │ Depends on: SPI [=y] && SPI_MASTER [=y] && HAS_DMA [=y]____
>
> __ __
>
>
> Enable JFFS2 file system support.____
>
> image001.png____
>
>
> __ __
>
> __ __
>
>
> Create MTD partitions for the QSPI____
>
> MTD partitions can be defined in the qspi device tree node as flash
> device. Example of qspi partition is as below:____
>
> ____
>
> These partition can be seem from Linux prompt:____
>
> root at zcu102-zynqmp <mailto:root at zcu102-zynqmp>:~# cat /proc/mtd
> dev: size erasesize name
> mtd0: 00200000 00002000 "qspi-fsbl-uboot"
> mtd1: 01000000 00002000 "qspi-linux"
> mtd2: 00020000 00002000 "qspi-device-tree"
> mtd3: 04000000 00002000 "qspi-rootfs" ____
>
>
> __ __
>
>
> Preparing and populating rootfs in mtd partition____
>
> __ __
>
> A jffs2 filesystem image can be created using mtd utilities, which can be
> then flashed to the desired mtd partition (mtd3 in our case). While
> creating jffs2 image, make sure to pass correct eraseblock size (can be
> found by sf probe 0 0 0 command on u-boot prompt).____
>
> __ __
>
>
> Generating jffs2 image____
>
> In yocto project you can specify following two parameters in the
> local.conf:____
>
> IMAGE_FSTYPES += " jffs2"____
>
> JFFS2_ERASEBLOCK = "0x2000"____
>
> This will generate <image name>.jffs2 file in the deploy area.____
>
> __ __
>
> __ __
>
> Separately if you have tar.gz or rootfs directory, you can generate the
> rootfs image on the host machine by following command____
>
> mkfs.jffs2 --root=<rootfs directory location> --eraseblock=<erase block
> size> -p -o rootfs.jffs2____
>
>
> __ __
>
> __ __
>
>
> Flashing jffs2 image on the partition____
>
> It is possible to flash the generated image from u-boot as well as from
> the Linux prompt.____
>
> It is necessary to clean /erase the flash before writing new data (though
> Linux will take care).____
>
> __1)__From Linux prompt:____
>
> __a.__Erase the entire partition and also format it to jffs2____
>
> # flash_eraseall -j /dev/mtd3____
>
> __b.__Write the jffs2 image on mtd 3 partition____
>
> # flashcp <path to rootfs.jffs2> /dev/mtd3____
>
> __ __
>
> __2)__From u-boot prompt____
>
> __a.__Probe the flash device____
>
> > sf probe 0 0 0____
>
> __b.__Erase the entire partition (here you need to know the offset and
> size)____
>
> > sf erase 0x1300000 0x4000000____
>
> __c.__Load the jffs2 image in the memory location (ddr) from sd card
> (other tftp from network)____
>
> > fatload mmc 0 0x10000000 rootfs.jffs2____
>
> __d.__Write the image from the memory on to the flash____
>
> > sf write 0x10000000 0x1300000 ${filesize}____
>
> __ __
>
> __3)__From Linux prompt with tar.gz image (not jffs2)____
>
> Rootfs content can be simply copied after mounting jffs2 partition____
>
> __a.__Erase the entire partition and also format it to jffs2 (mandatory) ____
>
> # flash_eraseall -j /dev/mtd3____
>
> __b.__Determine the location of rootfs.tar.gz image (can be on sd card or
> network. Assuming sd card for now)____
>
> __i.__Mount the sd card____
>
> # mount /dev/mmcblk0p1 /media____
>
> __c.__Mount jffs2 partition on the /mnt____
>
> # mount -t jffs2 /dev/mtdblock3 /mnt____
>
> __d.__Copy the file system to the jffs2 partition____
>
> # cd /mnt/____
>
> # tar zxvf /media/rootfs.tar.gz (choose appropriate path here).____
>
>
> Setting kernel rootfs ____
>
> __ __
>
> One can use rootfs from the jffs2 partition regardless of the boot-mode.
> Rootfs path can be specified to kernel through bootargs. One can change
> the bootargs from the u-boot prompt.____
>
> For sd-boot, the the bootargs for the root partition is set by sdroot0
> variable. You can change the sdroot0 variable to add following to the
> bootargs____
>
> root=/dev/mtdblock3 rw rootwait rootfstype=jffs2 ____
>
> u-boot> setenv sdroot0 "setenv bootargs earlycon clk_ignore_unused
> root=/dev/mtdblock3 rw rootwait rootfstype=jffs2"____
>
> u-boot> saveenv # for next boot____
>
> u-boot> run sdboot____
>
> __ __
>
> Similarly for other bootmodes make sure that the bootargs is set properly.____
>
> __ __
>
> *Thanks,____*
>
> *Sandeep____*
>
> __ __
>
> *From:*Giordon Stark [mailto:kratsg at gmail.com <mailto:kratsg at gmail.com>]
> *Sent:* Thursday, November 16, 2017 2:11 PM
> *To:* Sandeep Gundlupet Raju <SANDEEPG at xilinx.com
> <mailto:SANDEEPG at xilinx.com>>
> *Cc:* meta-xilinx at yoctoproject.org <mailto:meta-xilinx at yoctoproject.org>
> *Subject:* Re: [meta-xilinx] [ZynqMP] Booting from QSPI instead of SD Card____
>
> __ __
>
> Thanks a lot Sandeep,____
>
> __ __
>
> Do you know what you are supposed to do with the filesystem? E.G. if you
> create a bif file, that contains what specifically? The linked User Guide
> seems to indicate not using that, but I'm unclear. I suppose I need the
> following in order:____
>
> __ __
>
> - FSBL____
>
> - PMU____
>
> - ATF____
>
> - uramdisk.gz____
>
> - devicetree____
>
> - u-boot____
>
> - Image____
>
> __ __
>
> Correct?____
>
> __ __
>
> Giordon____
>
> On Thu, Aug 17, 2017 at 9:46 PM Sandeep Gundlupet Raju
> <SANDEEPG at xilinx.com <mailto:SANDEEPG at xilinx.com>> wrote:____
>
> ____
>
> *Thanks,*____
>
> *Sandeep*____
>
> ____
>
> *From:*meta-xilinx-bounces at yoctoproject.org
> <mailto:meta-xilinx-bounces at yoctoproject.org>
> [mailto:meta-xilinx-bounces at yoctoproject.org
> <mailto:meta-xilinx-bounces at yoctoproject.org>] *On Behalf Of *Giordon
> Stark
> *Sent:* Thursday, August 17, 2017 6:10 PM
> *To:* meta-xilinx at yoctoproject.org <mailto:meta-xilinx at yoctoproject.org>
> *Subject:* [meta-xilinx] [ZynqMP] Booting from QSPI instead of SD Card____
>
> ____
>
> Hi,____
>
> ____
>
> Many thanks to the folks here for helping me get the SD Card booting
> working (especially with the data duplicator command to burn the SD
> card correctly with partitions). What's the general procedure for
> having the board boot from the QSPI instead of the SD card? Do you
> need specific software on the computer and transfer over JTAG?____
>
> Refer UG1209
> https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_1/ug1209-embedded-design-tutorial.pdf
> ____
>
> ____
>
> It would be great if someone could point me to a set of instructions.____
>
> ____
>
> Giordon____
>
>
>
Kind regards,
Mike Looijmans
System Expert
TOPIC Products
Materiaalweg 4, NL-5681 RJ Best
Postbus 440, NL-5680 AK Best
Telefoon: +31 (0) 499 33 69 79
E-mail: mike.looijmans at topicproducts.com
Website: www.topicproducts.com
Please consider the environment before printing this e-mail
More information about the meta-xilinx
mailing list