This is an old revision of the document!
<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/zynq_fsbl.elf --fpga ./images/linux/<bit_filename>.bit --u-boot