====== 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