As explained [[Logical_structure_of_Bora_and_BoraX_Embedded_Linux_Kits_(BELK/BXELK)|here]], BELK/BXELK structure is not based on the [https://www.xilinx.com/products/design-tools/embedded-software/petalinux-sdk.html PetaLinux build system](*). Instead, BELK/BXELK make use of a standardized Yocto-based build system to build all the software components—U-Boot, Linux kernel, and root filesystem—that run on the Processing System (PS). This choice approach is more flexible and more modularized but it requires a little bit more knowledge of embedded Linux systems.
That being said, there are cases in which it can be convenient to build such components with PetaLinux build system, however. This technical note shows how to use the PetaLinux build system to build the Linux kernel image released with BELK/BXELK with PetaLinux build system.
The procedure was tested with the following configuration.
| style="text-align: center;" |BELK/BXELK
|4.0.0
|-
| style="text-align: center;" |Host operating system
|Ubuntu 14.04.5 LTS
|-
|}
It is assumed that PetaLinux is already installed on the host machine (for more details, please refer to [https://www.xilinx.com/support/documentation-navigation/see-all-versions.html?xlnxproducttypes=Design%20Tools&xlnxdocumentid=UG1144 ''UG1144 - PetaLinux Tools Documentation: Reference Guide'']). (*) Please note that PetaLinux itself works on top of the Yocto build system. == Building the Linux kernel Kernel ==First of all, set up the PetaLinux environment has to be set up.:
Then, create a project from the <code>zynq</code> template:
<pre class="workstation-terminal">
dvdk@osboxes:~/devel/bora/prj$ petalinux-create --type project --template zynq --name bora_1INFO: Create project: bora_1INFO: New project successfully created in /home/dvdk/devel/bora/prj/bora_1
</pre>
Import the hardware specification file (.hdf) generated by your Vivado project. This step will open automatically the text-based configuration menu of PetaLinux build system:when it shows up, just exit and save the configuration without changing anything.
<pre class="workstation-terminal">
dvdk@osboxes:~/devel/bora/prj/bora_1$ petalinux-config --get-hw-description=/home/dvdk/devel/bora/bora-minimal/bora-minimal.sdk/INFO: Getting hardware description...INFO: Rename bora_wrapper.hdf to system.hdf[INFO] generating Kconfig for project [INFO] menuconfig project/home/dvdk/devel/bora/prj/bora_1/build/misc/config/Kconfig.syshw:30:warning: defaults for choice values not supported/home/dvdk/devel/bora/prj/bora_1/build/misc/config/Kconfig:574:warning: config symbol defined without typeconfiguration written to /home/dvdk/devel/bora/prj/bora_1/project-spec/configs/config *** End of the configuration.*** Execute 'make' to start the build or try 'make help'. [INFO] sourcing bitbake[INFO] generating plnxtool conf[INFO] generating meta-plnx-generated layer~/devel/bora/prj/bora_1/build/misc/plnx-generated ~/devel/bora/prj/bora_1~/devel/bora/prj/bora_1[INFO] generating machine configuration[INFO] generating bbappends for project . This may take time ! ~/devel/bora/prj/bora_1/build/misc/plnx-generated ~/devel/bora/prj/bora_1~/devel/bora/prj/bora_1[INFO] generating u-boot configuration files [INFO] generating kernel configuration files[INFO] generating kconfig for RootfsGenerate rootfs kconfig[INFO] oldconfig rootfs[INFO] generating petalinux-user-image.bb
Replace Open the file <code>xilinx_zynq_defconfig</code> with a symbolic link to <code>bora_defconfig</code>:PetaLinux configuration menu and set up the kernel source
dvdk@osboxesConfigure the build system in order to use an external kernel (''Linux Components Selection'' item):~[[File:Belk petalinux kernel2.png|thumb|center|600px]] Set the path of the directory containing the BELK/devel/bora/prjBXELK Linux kernel tree (<code>${TOPDIR}/bora1../components/ext_sources/linux-xlnx$ cd arch/arm/configs</code>):[[File:Belk petalinux kernel3.png|thumb|center|600px]] dvdk@osboxesConfigure the build system in order to use a custom directory for device tree include files:~/devel/bora/prj/bora1/components/ext_sources/linuxenable the ''Auto Config Settings --xlnx/arch/arm/configs> Specify a manual device tree include directory'' item and set the ''Manual device tree include directory'' to <code>$ rm xilinx_zynq_defconfig dvdk@osboxes:~/devel/bora{TOPDIR}/prj/bora1../components/ext_sources/linux-xlnx/arch/arm/configs$ ln -s bora_defconfig xilinx_zynq_defconfigdvdk@osboxes:~boot/develdts/borainclude</prj/bora1/components/ext_sources/linux-xlnx/arch/arm/configs$ ll xilinx_zynq_defconfig code>:lrwxrwxrwx 1 dvdk dvdk 14 set 21 10[[File:30 xilinx_zynq_defconfig -> bora_defconfigBelk petalinux kernel4.png|thumb|center|600px]]
Set the ''Root file system type'' to ''NFS'' in order to generate a <code>uImage</code> that doesn't include any file system:[[File:Belk petalinux kernel5.png|thumb|center|600px]] Exit and save the configuration. Add in the following lines to the file <code>project-spec/meta-user/conf/petalinuxbsp.conf</code>:
<pre class="workstation-terminal">
LINUX_VERSION_EXTENSION = "-belk-4.0.0"
</pre>
Configure the build system in order to use an external kernel:
Configure the build system in order to use a custom directory for device tree include files:
linux-xlnx-4.9-belk-4.0.0+git999-r0 do_compile: NOTE: linux-xlnx: compiling from external source tree /home/dvdk/devel/bora/prj/bora1bora_1/build/../components/ext_sources/linux-xlnxfsbl-2017.2+gitAUTOINC+122565ec40-r0 do_compile: NOTE: fsbl: compiling from external source tree /opt/petalinux/tools/hsm/data/embeddedswNOTE: Tasks Summary: Attempted 2410 tasks of which 2349 1869 didn't need to be rerun and all succeeded.
linux-xlnx-4.9-belk-4.0.0+git999-r0 do_compile: NOTE: linux-xlnx: compiling from external source tree /home/dvdk/devel/bora/prj/bora_1/build/../components/ext_sources/linux-xlnx
NOTE: Tasks Summary: Attempted 2410 tasks of which 2349 didn't need to be rerun and all succeeded.
NOTE: Tasks Summary: Attempted 748 tasks of which 748 didn't need to be rerun and all succeeded.
INFO: Copying Images from deploy to images
[INFO] successfully built device-tree
</pre>
After the build is completed, the <code>uImage</code> file and the device tree blob (<code>system.dtb</code>) are located in the <code>images/linux</code> directory.===Device tree handling===One of the most appreciated features of PetaLinux is the automatic generation of the Linux Device Tree including the nodes associated with the IPs instantiated in the PL. When used in combination with the Device Tree provided by the BELK/BXELK, this generation process works as depicted in the following image. [[File:BELK-PetaLinux-DTB.png|thumb|center|600px|Combined Device Tree generation process]] In essence, PetaLinux combines the original Bora/BoraX device tree (<code>bora.dts</code>) with another auxiliary device tree generated on the base of hardware description file (.hdf). The resulting DTB (<code>system.dtb</code>) provides all the nodes required by the system to operate properly. It is worth remembering that the user can add further customizations to the resulting DTB by editing this file <code><plnx-projroot>/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi</code>. For more details, please refer to the ''Xilinx UG1144 PetaLinux Tools Documentation - Reference Guide''.