====== Boot and Kernel configure & build with PetaLinux without BSP (board support package) ======
- Create Vivado design and export the hardware with bitstream.\\ Default hdf (hardware description file) location is:
/.sdk/
In case you need it (but usually you shouldn't), default bitstream location is:
/.runs/impl_1/
- Setup PetaLinux enviroment (see [[hw:zynq:linux:petalinux:start|Install PetaLinux]])\\ \\
- Create PetaLinux project:
petalinux-create --type project --template zynqMP --name
cd
- Get hardware description from Vivado project:
petalinux-config --get-hw-description /.sdk/
- Set booting from SD card by navigating through settings tree and choosing the proper options:
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
- Check whether all required drivers/modules are enabled in kernel config:
petalinux-config -c kernel
Hint: you can use vim-like search ''/'' 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
- Make the I2C multiplexers drivers compiled as kernel module (not build up - there should be '', not '<*>'):
Device Drivers -> <*> I2C support -> Multiplexer I2C chip support -> NXP PCA9541 I2C Master Selector
Philips PCA954x I2C Mux/switches
- In order to use the generic UIO driver ''uio_pdrv_genirq'' enable kernel modules in kernel config by navigating through settings tree and enabling modules (there should be '', not '<*>'):
Device Drivers -> <*> Userspace I/O drivers -> Userspace I/O platform driver with generic IRQ handling
Userspace platform driver with generic irq and dynamic memory
- Fix device tree for TEBF0808. In file
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>;
};
};
};
- In order to use the generic UIO driver modify the device tree to assign the compatibility with this driver to your hardware:
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!
- Fix the u-boot bug -- a typo in default boot command.\\ The proper boot configure entry:
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
- Build the boot and kernel:
petalinux-build
- Determinate the bit file name in PetaLinux project (it is copied automatically from Vivado design by ''--get-hw-description''):
ls ./images/linux/*.bit
- Create ''BOOT.BIN'' image:
petalinux-package --boot --format BIN --fsbl ./images/linux/zynqmp_fsbl.elf --fpga ./images/linux/.bit --u-boot