User Tools

Site Tools


hw:zynq:linux:petalinux:boot_kernel_trenz

Boot and Kernel configure & build with PetaLinux without BSP (board support package)

  1. Create Vivado design and export the hardware with bitstream.
    Default hdf (hardware description file) location is:
    <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/
  2. Setup PetaLinux enviroment (see Install PetaLinux)

  3. Create PetaLinux project:
    petalinux-create --type project --template zynqMP --name <boot_project_name>
    cd <boot_project_name>
  4. Get hardware description from Vivado project:
    petalinux-config --get-hw-description <path_to_vivado_project_directory>/<project_name>.sdk/
  5. 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
  6. Check whether all required drivers/modules are enabled in kernel 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
  7. Make the I2C multiplexers drivers compiled as kernel module (not build up - there should be '<M>', not '<*>'):
    Device Drivers -> <*> I2C support -> Multiplexer I2C chip support -> <M> NXP PCA9541 I2C Master Selector
                                                                         <M> Philips PCA954x I2C Mux/switches
  8. 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 '<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
  9. 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>;
            };
        };
    };
  10. 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!

  11. 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
  12. Build the boot and kernel:
    petalinux-build
  13. Determinate the bit file name in PetaLinux project (it is copied automatically from Vivado design by –get-hw-description):
    ls ./images/linux/*.bit
  14. Create BOOT.BIN image:
    petalinux-package --boot --format BIN --fsbl ./images/linux/zynqmp_fsbl.elf --fpga ./images/linux/<bit_filename>.bit --u-boot
/services/www/http/wiki/data/pages/hw/zynq/linux/petalinux/boot_kernel_trenz.txt · Last modified: 2019/08/01 12:39 by jakub.moron