<project_directory>/<project_name>.sdk/
In case you need it (but usually you shouldn't), default bitstream location is:
<project_directory>/<project_name>.runs/impl_1/
petalinux-create --type project --template zynqMP --name <boot_project_name> cd <boot_project_name>
petalinux-config --get-hw-description <path_to_vivado_project_directory>/<project_name>.sdk/
Subsystem AUTO Hardware Settings -> Advanced bootable images storage Settings -> boot image settings : set ‘image storage media’ option to ‘primary sd’ -> kernel image settings: set ‘image storage media’ option to ‘primary sd’ -> dtb image settings : set ‘image storage media’ option to ‘primary sd’ -> SD/SDIO Settings -> Primary SD/SDIO: set to 'psu_sd_1' Image Packaging Configurations -> ‘Root filesystem type’: set to ‘SD card’ -> 'Device node of SD device': set to '/dev/mmcblk1p2' -> 'Copy final images to tfpboot': uncheck Firmware Version Configuration -> Set 'Hostname', 'Product name' and 'Firmware Version' according to your preferences
Select Exit
to write the configuration.
In case you want to reconfigure boot settings, run:
petalinux-config
petalinux-config -c kernel
Hint: you can use vim-like search /<search_string>
to list all enabled drivers/modules.
Remember to Save changes before exit – it seems taht there is no autosave!
I.e. set hostname:
General setup -> Default hostname: set the hostname
Device Drivers -> <*> I2C support -> Multiplexer I2C chip support -> <M> NXP PCA9541 I2C Master Selector <M> Philips PCA954x I2C Mux/switches
uio_pdrv_genirq
enable kernel modules in kernel config by navigating through settings tree and enabling modules (there should be '<M>', not '<*>'): Device Drivers -> <*> Userspace I/O drivers -> <M> Userspace I/O platform driver with generic IRQ handling <M> Userspace platform driver with generic irq and dynamic memory
vim ./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
and add the entry at the end of this file:
/* SD */ &sdhci1 { // disable-wp; no-1-8-v; }; /* ETH PHY */ &gem3 { phy-handle = <&phy0>; phy0: phy0@1 { device_type = "ethernet-phy"; reg = <1>; }; }; /* QSPI */ &qspi { #address-cells = <1>; #size-cells = <0>; status = "okay"; flash0: flash@0 { compatible = "jedec,spi-nor"; reg = <0x0>; #address-cells = <1>; #size-cells = <1>; }; }; /* I2C */ &i2c0 { i2cswitch@73 { // u compatible = "nxp,pca9548"; #address-cells = <1>; #size-cells = <0>; reg = <0x73>; i2c-mux-idle-disconnect; i2c@2 { // PCIe #address-cells = <1>; #size-cells = <0>; reg = <2>; }; i2c@3 { // i2c SFP #address-cells = <1>; #size-cells = <0>; reg = <3>; }; i2c@4 { // i2c SFP #address-cells = <1>; #size-cells = <0>; reg = <4>; }; i2c@5 { // i2c EEPROM #address-cells = <1>; #size-cells = <0>; reg = <5>; }; i2c@6 { // i2c FMC #address-cells = <1>; #size-cells = <0>; reg = <6>; si570_2: clock-generator3@5d { #clock-cells = <0>; compatible = "silabs,si570"; reg = <0x5d>; temperature-stability = <50>; factory-fout = <156250000>; clock-frequency = <78800000>; }; }; i2c@7 { // i2c USB HUB #address-cells = <1>; #size-cells = <0>; reg = <7>; }; }; i2cswitch@77 { // u compatible = "nxp,pca9548"; #address-cells = <1>; #size-cells = <0>; reg = <0x77>; i2c-mux-idle-disconnect; i2c@0 { // i2c PMOD #address-cells = <1>; #size-cells = <0>; reg = <0>; }; i2c@1 { // i2c Audio Codec #address-cells = <1>; #size-cells = <0>; reg = <1>; /* adau1761: adau1761@38 { compatible = "adi,adau1761"; reg = <0x38>; }; */ }; i2c@2 { // i2c FireFly A #address-cells = <1>; #size-cells = <0>; reg = <2>; }; i2c@3 { // i2c FireFly B #address-cells = <1>; #size-cells = <0>; reg = <3>; }; i2c@4 { // i2c PLL #address-cells = <1>; #size-cells = <0>; reg = <4>; }; i2c@5 { // i2c SC #address-cells = <1>; #size-cells = <0>; reg = <5>; }; i2c@6 { // i2c #address-cells = <1>; #size-cells = <0>; reg = <6>; }; i2c@7 { // i2c #address-cells = <1>; #size-cells = <0>; reg = <7>; }; }; };
vim ./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
and add the entry at the end of this file:
&axi_gpio_0 { compatible = "generic-uio"; };
for every hardware module you have.
Please notice that axi_gpio_0
is only an example of module name!
default_bootcmd=run uenvboot; run cp_kernel2ram && bootm ${netstart}
is created by PetaLinux as
default_bootcmd=run uenvboot; run cp_kernel2ram && run cp_dtb2ram && booti ${netstart} - ${dtbnetstart}
with the typo in booti
instead of bootm
command.
To fix this bug, edit the platform-top.h
file (it would not be overwrite if you reconfigure the boot or kernel):
vim ./project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h
and add the following entry at the end:
/* Due to a bug where having u-boot load dtb from SD card causes the boot * command to default to using booti instead of bootm on Zynq, the defult build * fails to boot. This boot command override is a temporary workaround. */ #ifdef CONFIG_BOOTCOMMAND #undef CONFIG_BOOTCOMMAND #define CONFIG_BOOTCOMMAND "run uenvboot; run cp_kernel2ram && run cp_dtb2ram && bootm ${netstart} - ${dtbnetstart}" #endif
petalinux-build
–get-hw-description
): ls ./images/linux/*.bit
BOOT.BIN
image: petalinux-package --boot --format BIN --fsbl ./images/linux/zynqmp_fsbl.elf --fpga ./images/linux/<bit_filename>.bit --u-boot