This page is intended to be a collection place for tips and tricks related to Yocto layers and how Yocto works under Petalinux.
Table of Contents
Documentation
The first place you should start to better understand many details of the Yocto project is the Yocto project website.
Working with a User Space Yocto Layer
This tip has been adapted to PetaLinux using the meta-example layer available here
meta-example Code Block |
---|
|
$ git clone https://github.com/DynamicDevices/meta-example |
This example layer is providing 3 build recipes, bbexample, bbexample-rt and bbexample-lt respectively fetching the source code from a git tree, a remote tar file and a local tar file
Code Block |
---|
|
$ petalinux-build -c bbexample
$ petalinux-build -c bbexample-rt
$ petalinux-build -c bbexample-lt |
Configuring the layer path in the PetaLinux build system
Move to your PetaLinux project
build directory,
edit the conf/bblayers.conf file and add your layer path to BBLAYERS Code Block |
---|
|
BBLAYERS := " \
${SDKBASEMETAPATH}/layers/poky/meta \
${SDKBASEMETAPATH}/layers/poky/meta-poky \
add the layer path in below config option.
Code Block |
---|
cd <plnx-proj-root>
petalinux-config --> Yocto Settings --> User Layers --> (/absolute_path_to_meta_layer/meta-example) user \layer " |
The recipe we are going to build is https://github.com/DynamicDevices/meta-example/blob/master/recipes-example/bbexample/bbexample-lt_
Move to your Yocto project build directory, edit the conf/bblayers.conf file and add your layer path to BBLAYERS Code Block |
---|
|
BBLAYERS := " \
${SDKBASEMETAPATH}/layers/poky/meta \
${SDKBASEMETAPATH}/layers/poky/meta-poky \
/absolute_path_to_meta_layer/meta-example \
" |
The recipe we are going to build is https://github.com/DynamicDevices/meta-example/blob/master/recipes-example/bbexample/bbexample-lt_1.0.bbThe recipe bbexample-lt is using some variables
1.
SRC_URI Space-delimited list of URIs to download source code, patches, and other files from git, local absolute path, https, ftp etc.
2.
PN is the Package Name. The value of this variable is derived by BitBake from the base name of the recipe file.
3.
PV is the Package Version. which is derived by BitBake from the base name of the recipe file
Code Block |
---|
|
# Use local tarball
SRC_URI = "file://bbexample-${PV}.tar.gz" |
The recipe
bbexample-lt can invoked using the following command
Code Block |
---|
|
$ petalinux-build -c bbexample-lt |
here is the command output
Code Block |
---|
|
$ petalinux-build -c bbexample-lt
[INFO] building bbexample-lt
[INFO] sourcing bitbake
INFO: bitbake bbexample-lt
Loading cache: 100% |###############################################################################################################################################################################| ETA: 00:00:00
Loaded 2941 entries from dependency cache.
Parsing recipes: 100% |#############################################################################################################################################################################| Time: 00:00:01
Parsing of 2328 .bb files complete (2294 cached, 34 parsed). 2943 targets, 196 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Preparing RunQueue
NOTE: Checking sstate mirror object availability (for 38 objects)
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 872 tasks of which 857 didn't need to be rerun and all succeeded.
INFO: Copying Images from deploy to images
[INFO] successfully built bbexample-lt |
You have now successfully built the layer but you still need to include the binary produced into the kernel root file system
There are two options in order to do so
1. Edit your project
<BUILD_DIR>/conf/local.conf file for YOCTO project <plnx-proj-root>/meta-user/conf/petalinuxbsp.conf file for PetaLinux project and add
Code Block |
---|
|
IMAGE_INSTALL_append = " bbexample-lt" |
2. Adding a package to an image via a
.bbappendYou may wish to add specific packages to specific images, which is generally viewed as better practice. We are using
core-image-minimal bitbake recipe for this tip by creating file
core-image-minimal.bbappend. This .bbappend file is extending the original core-image-minimal recipe in order to include the layer build output into the Linux root file system.
Code Block |
---|
|
recipes-core/images/core-image-minimal.bbappend |
core-image-minimal.bbappend file content
Code Block |
---|
|
IMAGE_INSTALL += " bbexample-lt" |
1. Rebuild your layer
Code Block |
---|
|
$ petalinux-build -c bbexample_lt -x cleansstate |
2. Rebuild your kernel
Code Block |
---|
|
$ petalinux-build -c kernel |
3. Start qemu
Code Block |
---|
|
$ petalinux-boot --qemu --kernel |
4. Log on qemu and start the application
Code Block |
---|
|
root@plnx_arm:/# /usr/bin/bbexample
Hello Yocto World...
Hello World (from a shared library!) |
Patching the Linux Kernel of a PetaLinux Project
1. Copy the patch to project file
<plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx directory.
2. Modify project file
<plnx-proj-root>/project-spec/meta-user/recipes-kernel/linux/linux-xlnx_%.bbappend to use the patch file by adding the patch file name to the SRC_URI_append variable. If the variable does not exist in the file then add a new line with
Code Block |
---|
|
SRC_URI_append = " file://0001-linux-driver-fix.patch"
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" |
3. Make sure the priority for the meta-user layer is 7 in the project file
<plnx-proj-root>/project-spec/meta-user/conf/layer.conf .
Note: Any patches in the project will not be applied to an external source tree for the Linux kernel or u-boot. The user should apply patches to the external source tree.
How to Modify inittab or getty in a PetaLinux Project
1. Create a sysvinit directory in meta-user layer as
Code Block |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-core/sysvinit/sysvinit-inittab |
2. Create a
sysvinit-inittab_%.bbappend file and your own inittab file or your inittab patch
Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/sysvinit/sysvinit-inittab_%.bbappend |
Code Block |
---|
|
SRC_URI_append = " file://inittab"
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" |
Or
Code Block |
---|
|
SRC_URI_append = " file://inittab.patch"
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" |
How to Patch the FSBL in a PetaLinux Project
Note: This method can't be used for v2016.4 PetaLinux Projects. PetaLinux tools use externalsrc methodology to fetch the source code from XSDK. Yocto does not allow patching in this externalsrc mechanism. Hence this method can't be used in Yocto.1. Create a fsbl and files directory in meta-user layer as
Code Block |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/files |
2. Copy
## From 2021.1 onwards
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-bsp/embeddedsw/ |
2. Copy patch files to
<plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/files as
Code Block |
---|
|
$ cp 0001-FSBL.patch <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/files
## From 2021.1 onwards
$ cp 0001-FSBL.patch <plnx-proj-root>/project-spec/meta-user/recipes-bsp/embeddedsw/files |
Note that patches should be generated based on the embeddedsw GIT repo which contains FSBL as the patches require the path into the repo to apply correctly.
3. Create a
fsbl_%.bbappend file and add below content
Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/fsbl_%.bbappend |
Code Block |
---|
|
# Patch for FSBL
# Note: do_configure_prepend task
## From 2021.1 onwards
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/embeddedsw/fsbl-firmware_%.bbappend |
Code Block |
---|
|
# Patch for FSBL
# Note: do_configure_prepend task section is required only for 2017.1 release
# Refer https://github.com/Xilinx/meta-xilinx-tools/blob/rel-v2017.2/classes/xsctbase.bbclass#L29-L35
do_configure_prepend() {
if [ -d "${S}/patches" ]; then
rm -rf ${S}/patches
fi
if [ -d "${S}/.pc" ]; then
rm -rf ${S}/.pc
fi
}
SRC_URI_append = " \
file://0001-FSBL.patch \
"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
#Add debug for FSBL(optional)
XSCTH_BUILD_DEBUG = "1"
#Enable appropriate FSBL debug or compiler flags
YAML_COMPILER_FLAGS_append = " -DXPS_BOARD_ZCU102"
# Note: This is not required if you are using Yocto
# CAUTION!: EXTERNALXSCTSRC and EXTERNALXSCTSRC_BUILD is required only for 2018.2 and below petalinux releases
EXTERNALXSCTSRC = ""
EXTERNALXSCTSRC_BUILD = "" |
4. Remove the
<plnx-proj-root>/components/plnx_workspace and clean your project workspace before rebuilding FSBL components
Code Block |
---|
|
$ petalinux-build -x mrproper
#Note: In v2018.1 PetaLinux release onwards "petalinux-build -x mrproper" command will remove <plnx-proj-root>/components/plnx_workspace directory
$ rm -rf <plnx-proj-root>/components/plnx_workspace |
5. Rebuilding FSBL components
Code Block |
---|
|
$ petalinux-build -c bootloader |
How to Patch the PMU Firmware in a PetaLinux Project
Note: This method can't be used for v2016.4 PetaLinux Projects. PetaLinux tools use externalsrc methodology to fetch the source code from XSDK. Yocto does not allow patching in this externalsrc mechanism. Hence this method can't be used in Yocto.1. Create a pmu/pmu-firmware and files directory in meta-user layer as
Code Block |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu/files
#For v2018.1 release onwards
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu-firmware/files |
2. Copy patch files to
<plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu/files as
Code Block |
---|
|
$ cp 0001-PMUFW.patch <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu/files
#For v2018.1 release onwards
$ cp 0001-PMUFW.patch <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu-firmware/files |
3. Create a
pmu-firmware_%.bbappend file and add below content
Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu/pmu-firmware_%.bbappend
#For v2018.1 or later PetaLinux releases only
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu-firmware/pmu-firmware_%.bbappend |
Code Block |
---|
|
# Patch for PMUFW
# Note: do_configure_prepend task section is required only for 2017.1 release
# Refer https://github.com/Xilinx/meta-xilinx-tools/blob/rel-v2017.2/classes/xsctbase.bbclass#L29-L35
do_configure_prepend() {
if [ -d "${S}/patches" ]; then
rm -rf ${S}/patches
fi
if [ -d "${S}/.pc" ]; then
rm -rf ${S}/.pc
fi
}
SRC_URI_append = " \
file://0001-PMUFW.patch \
"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
# Enable appropriate PMUFW debug or compiler flags
YAML_COMPILER_FLAGS_append = " -DENABLE_EM"
# Note: This is not required if you are using Yocto
# CAUTION!: EXTERNALXSCTSRC and EXTERNALXSCTSRC_BUILD is required only for 2018.2 and below petalinux releases
EXTERNALXSCTSRC = ""
EXTERNALXSCTSRC_BUILD = "" |
4. Remove the
<plnx-proj-root>/components/plnx_workspace and clean your project workspace before rebuilding PMUFW components
Code Block |
---|
|
$ petalinux-build -x mrproper
#Note: In v2018.1 or later PetaLinux release "petalinux-build -x mrproper" command will remove <plnx-proj-root>/components/plnx_workspace directory
$ rm -rf <plnx-proj-root>/components/plnx_workspace |
5. Rebuilding PMUFW components
Code Block |
---|
|
$ petalinux-build -c pmufw |
Configuring the FSBL and PMUFW Debugs in a PetaLinux Project
Create a
fsbl _%. bbappend file and add below content
Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsbl/fsbl_%.bbappend
# From 2021.1 onwards
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/embeddedsw/fsbl-firmware_%.bbappend |
To enable debugs in FSBL:
Code Block |
---|
|
#Add debug for FSBL
XSCTH_BUILD_DEBUG = "1" |
To add compiler flags in FSBL:
Code Block |
---|
|
#Add compiler flags for FSBL
YAML_COMPILER_FLAGS_append = " -DFSBL_PROT_BYPASS" |
To add BSP flags(secure mode) in FSBL:
Code Block |
---|
|
#Add BSP flags for FSBL
YAML_BSP_CONFIG += "secure_mode"
YAML_BSP_CONFIG[secure_mode] = "set,true" |
Create a
pmu-firmware_%.bbappend file and add below content
Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu/pmu-firmware_%.bbappend
#For v2018.1 or later PetaLinux releases only
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/pmu-firmware/pmu-firmware_%.bbappend |
To enable debugs in PMUFW refer this
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841724/PMU+Firmware page for DEBUG flags list
Code Block |
---|
|
#Add debug for PMUFW
XSCTH_BUILD_DEBUG = "1" |
To add compiler flags in PMUFW, see
PMU FW Build Flags:
Code Block |
---|
|
#Add compiler flags for PMUFW
YAML_COMPILER_FLAGS_append = " -DDEBUG_MODE -DXPFW_DEBUG_DETAILED" |
To add BSP flags(secure mode) in PMUFW:
Code Block |
---|
|
#Add BSP flags for PMUFW
YAML_BSP_CONFIG += "secure_mode"
YAML_BSP_CONFIG[secure_mode] = "set,true" |
To add BSP flags(debug mode) in PMUFW: For example if you want to enable https://github.com/Xilinx/embeddedsw/blob/release-2018.3/lib/sw_apps/zynqmp_pmufw/misc/xfpga_config.h#L34 debug is Xil BSP libraries
Code Block |
---|
|
#Add BSP flags for PMUFW
YAML_BSP_CONFIG += "debug_mode"
YAML_BSP_CONFIG[debug_mode] = "set,true" |
By pass PMUFW debug logs on different UART console:
Code Block |
---|
|
YAML_SERIAL_CONSOLE_STDIN_forcevariable = "psu_uart_1"
YAML_SERIAL_CONSOLE_STDOUT_forcevariable = "psu_uart_1" |
Remove the
<plnx-proj-root>/components/plnx_workspace and clean you project workspace before rebuilding FSBL or PMUFW components
Code Block |
---|
|
$ petalinux-build -x mrproper
#Note: In v2018.1 or later PetaLinux release "petalinux-build -x mrproper" command will remove <plnx-proj-root>/components/plnx_workspace directory
$ rm -rf <plnx-proj-root>/components/plnx_workspace
$ petalinux-build |
How to Update psu_init Files in PetaLinux Project
Info |
---|
Note: PSU_INIT files are generated based on HDF or XSA parsing, Hence these files can't be patched on top of embedded_sw repo using Yocto SRC_URI variable. Alternatively we can update these files by editing <plnx-proj-root>/project-spec/hw-description/psu_init.c and copy to FSBL build workspace during do_compile_prepend bitbake task. |
1. Modify <plnx-proj-root>/project-spec/hw-description/psu_init.c file as per your requirement
2. Create a FSBL bbappend file under <plnx-proj-root>/project-spec/meta-user/recipes-bsp/fsblembeddedsw/fsbl-firmware_%.bbappend and bbappend and add below content to update psu_init.c changes to FSBL
Code Block |
---|
|
# For 2018.2 and below versions
do_compile_prepend(){
install -m 0644 ${TOPDIR}/../project-spec/hw-description/psu_init.c ${TOPDIR}/../components/plnx_workspace/fsbl/fsbl_hwproj/psu_init.c
}
# For 2018.3 and later versions we removed FSBL and PMUFW external workspace from <plnx-proj-root>/components/plnx_workspace directory
# to align Yocto patching mechanism. Hence we are copying the files to build workspace(${B})
# https://github.com/Xilinx/meta-xilinx-tools/blob/rel-v2018.3/classes/xsctbase.bbclass#L14
do_compile_prepend(){
install -m 0644 ${TOPDIR}/../project-spec/hw-description/psu_init.c ${B}/fsbl/psu_init.c
} |
How to Add Pre-built Libraries in PetaLinux or Yocto
RecipesProjects
1.
Create a new recipe or in existing recipe in meta-user layer as shown Create an application/recipe and copy prebuilt library and header files with the following commands. Assuming prebuilt library name is libcpsample.so.1.0.1. In PetaLinux Flow:
Code Block |
---|
|
$ mkdir -p petalinux-create -t apps --template install --name libcpsample --enable
$ cp libcpsample.so.1.0.1 <plnx-proj-root>/project-spec/meta-user/recipes-apps/libcpsample/files |
2. Copy pre-built libraries files and header file required for libraries to <plnx-proj-
$ cp cpsample.h <plnx-proj-root>/project-spec/meta-user/recipes-apps/libcpsample/files |
as(or) You can use the below single command to achieve the above functionality. Code Block |
---|
|
$ cp petalinux-create -t apps --template install --name libcpsample --enable --srcuri "<path-to-dir>/libcpsample.so.1.0.1 <plnx<path-projto-root>/project-spec/meta-userdir>/cpsample.h>" |
In Yocto Flow:
Code Block |
---|
|
$ mkdir -p <layer-path>/recipes-apps/libcpsample/files
$ cp cpsample.h <plnx-proj-root>/project-spec/meta-usertouch <layer-path>/recipes-apps/libcpsample/libcpsample.bb
$ cp libcpsample.so.1.0.1 <layer-path>/recipes-apps/libcpsample/files
$ cp cpsample.h <layer-path>/recipes-apps/libcpsample/files |
32. Add the below content to recipe
(bb) file
Code Block |
---|
|
#
# This file is the libcpsample recipe.
#
SUMMARY = "Sample pre-built library copy to rootfs"
SECTION = "libs"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = " \
file://libcpsample.so.1.0.1 \
file://cpsample.h \
"
S = "${WORKDIR}"
# Add dependency libraireslibraries if any
# for example DEPENDS = "libpcap"
# If you need to create a symbolic link using the pre-built libraries you should use oe_soinstall.
# This copies libraries to "{TARGET_ROOTFS}/usr/lib" directory and create a symlink as
# lrwxrwxrwx libcpsample.so.1.0 -> libcpsample.so.1.0.1
# -rwxr-xr-x libcpsample.so.1.0.1
do_install() {
install -d ${D}${libdir}
oe_soinstall ${S}/libcpsample.so.1.0.1 ${D}${libdir}
install -d -m 0655 ${D}${includedir}/CPSAMPLE
install -m 0644 ${S}/*.h ${D}${includedir}/CPSAMPLE/
}
# Inhibit warnings about files being stripped
INSANE_SKIP_${PN} = "ldflags"
INSANE_SKIP_${PN} = "already-stripped"
# If you don't have .h file to copy to /usr/include add something like below
# FILES_${PN} = "${libdir}/*.so.*"
FILES_${PN} = "${libdir}/*.so.* ${includedir}/*"
FILES_${PN}-dev = "${libdir}/*.so" |
4. Build the pre-built library recipe
Code Block |
---|
|
$ petalinux-build -c libcpsamplerootfs |
Creating Libraries in a PetaLinux Project
1. Create a library using
petalinux PetaLinux tools
Code Block |
---|
|
$ petlainux-create -t apps --template c --name libsample --enable |
2. Modify the
libsample.bb recipe file
<plnx-proj-root>/project-spec/meta-user/recipes-apps/libsample/libsample.bb as
Code Block |
---|
|
#
# This file is the libsample recipe.
#
SUMMARY = "Simple libsample application"
SECTION = "libs"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI = " \
file://sample.c \
file://sample.h \
file://Makefile \
"
S = "${WORKDIR}"
PACKAGE_ARCH = "${MACHINE_ARCH}"
PROVIDES = "sample"
TARGET_CC_ARCH += "${LDFLAGS}"
do_install() {
install -d ${D}${libdir}
install -d ${D}${includedir}
oe_libinstall -so libsample ${D}${libdir}
# This is optional and depends if you have any headers to copied along with libraries
# This example includes sample.h to to copied to <TARGET_ROOTFS>/usr/lib/SAMPLE/sample.h
install -d -m 0655 ${D}${includedir}/SAMPLE
install -m 0644 ${S}/*.h ${D}${includedir}/SAMPLE/
}
FILES_${PN} = "${libdir}/*.so.* ${includedir}/*"
FILES_${PN}-dev = "${libdir}/*.so" |
3. Modify the
<plnx-proj-root>/project-spec/meta-user/recipes-apps/libsample/files/Makefile generated from
petalinux PetaLinux tools as
Code Block |
---|
|
APP = sample
LIBSOURCES=*.c
OUTS = *.o
NAME := sample
MAJOR = 1.0
MINOR = 1
VERSION = $(MAJOR).$(MINOR)
all: lib$(NAME).so
lib$(NAME).so.$(VERSION): $(OUTS)
$(CC) $(LDFLAGS) $(OUTS) -shared -Wl,-soname,lib$(NAME).so.$(MAJOR) -o lib$(NAME).so.$(VERSION)
lib$(NAME).so: lib$(NAME).so.$(VERSION)
rm -f lib$(NAME).so.$(MAJOR) lib$(NAME).so
ln -s lib$(NAME).so.$(VERSION) lib$(NAME).so.$(MAJOR)
ln -s lib$(NAME).so.$(MAJOR) lib$(NAME).so
%.o: %.c
$(CC) $(CFLAGS) -c -fPIC $(LIBSOURCES)
clean:
rm -rf *.o *.so *.so.* |
4. Build the library recipe
Code Block |
---|
|
$ petalinux-build -c libsample |
Creating Apps(which uses libraries) in PetaLinux Project
...
1. Create a library using
petalinux PetaLinux tools
Code Block |
---|
|
$ petlainux-create -t apps --template c --name sampleapp --enable |
2. Modify the
sampleapp.bb recipe file
<plnx-proj-root>/project-spec/meta-user/recipes-apps/sampleapp/sampleapp.bb as
Code Block |
---|
|
#
# This file is the sampleapp recipe.
#
SUMMARY = "Simple sampleapp application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI = " \
file://sampleapp.c \
"
S = "${WORKDIR}"
DEPENDS += " libsample"
#This uses libsample.so.1.0.1 (-lsample)
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} -o sampleapp sampleapp.c -lsample
}
do_install() {
install -d ${D}${bindir}
install -d -m 0755 sampleapp ${D}${bindir}
}
FILES_${PN} += "sampleapp" |
3. Modify the
<plnx-proj-root>/project-spec/meta-user/recipes-apps/libsample/files/sampleapp.c generated from
petalinux PetaLinux tools as
Code Block |
---|
|
#include <stdio.h>
#include <SAMPLE/sample.h> // From above libs <TARGET_ROOTFS>/usr/lib/SAMPLE/sample.h
int main(int argc, char **argv)
{
printf("Hello World!\n");
sample_hello();
return 0;
} |
4. Build the apps recipe
Code Block |
---|
|
$ petalinux-build -c sampleapp |
How to
Auto Mount SD card in Yocto RecipesAuto Run Application at Startup
1. Create a
base-files directory in meta-user layer aslibrary using PetaLinux tools
Code Block |
---|
|
$ mkdirpetalinux-create -pt apps <plnx-proj-root>/project-spec/meta-user/recipes-core/base-files |
2. Create a base-files_%.bbappend file and add below content Code Block |
---|
|
$ vim -template install -n myapp-init --enable |
2. Edit the file <plnx-proj-root>/project-spec/meta-user/recipes-
coreapps/
basemyapp-
files/base-files_%.bbappend
#base-files_%.bbappend content
dirs755 += "/media/card"
do_install_append() {
sed -i '/mmcblk0p1/s/^#//g' ${D}${sysconfdir}/fstab
}3. Rebuild rootfs Code Block |
---|
|
$ petalinux-build |
Method 1: Append auto eth1 to existing interfaces file
1. Create a init-ifupdown directory in meta-user layer as Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ mkdir -p init/myappinit.bb. The file should look like the following:
Code Block |
---|
|
#this file is the myapp-init recipe.
#
SUMMARY = "Simple myapp-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://myapp-init \
"
S = "${WORKDIR}"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
inherit update-rc.d
INITSCRIPT_NAME = "myapp-init"
INITSCRIPT_PARAMS = "start 99 S ."
do_install() {
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/myapp-init ${D}${sysconfdir}/init.d/myapp-init
}
FILES_${PN} += "${sysconfdir}/*"
|
3. To run myapp as daemon, edit the file <plnx-proj-root>/project-spec/meta-user/recipes-
coreapps/myapp-init
-ifupdown/2. Create a init_ifupdown_%.bbappend file and add below content Code Block |
---|
language | bash/files/myapp-init.
Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown_%.bbappend
# init-ifupdown_%.bbappend content
do_install_append() {
sed -i '/iface eth0 inet dhcp/ a auto eth1' ${D}${sysconfdir}/network/interfaces
} |
3. Rebuild rootfs Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ petalinux-build |
Method 2: Use your own interfaces file
1. Create a init-ifupdown directory in meta-user layer as Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/files |
2. Create your own network interface file as show below Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/files/myinterfaces
# myinterfaces content
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
# The loopback interface
auto lo
iface lo inet loopback
# Wireless interfaces
iface wlan0 inet dhcp
wireless_mode managed
wireless_essid any
wpa-driver wext
wpa-conf /etc/wpa_supplicant.conf
iface atml0 inet dhcp
# Wired or wireless interfaces
auto eth0
iface eth0 inet dhcp
# Add auto config for eth1
auto eth1
iface eth1 inet dhcp
# Ethernet/RNDIS gadget (g_ether)
# ... or on host side, usbnet and random hwaddr
iface usb0 inet static
address 192.168.7.2
netmask 255.255.255.0
network 192.168.7.0
gateway 192.168.7.1
# Bluetooth networking
iface bnep0 inet dhcp |
3. Create a init_ifupdown_%.bbappend file and add below content Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown_%.bbappend
# init-ifupdown_%.bbappend content
SRC_URI += " \#!/bin/sh
DAEMON=/usr/bin/myapp-init
start ()
{
echo " Starting myapp-init"
start-stop-daemon -S -o --background -x $DAEMON
}
stop ()
{
echo " Stoping myapp-init"
start-stop-daemon -K -x $DAEMON
}
restart()
{
stop
start
}
[ -e $DAEMON ] || exit 1
case "$1" in
start)
start; ;;
stop)
stop; ;;
restart)
restart; ;;
*)
file://myinterfaces \ " FILESEXTRAPATHS_prependecho "Usage:= $0 "${THISDIR}/files:"{start|stop|restart}"
# Overwrite interface file with myinterface file in rootfs do_install_append() { install -m 0644 ${WORKDIR}/myinterfaces ${D}${sysconfdir}/network/interfaces
} |
4. Rebuild rootfs Code Block |
---|
language | bash exit 1
esac
exit $? |
---|
4. Build the project
Code Block |
---|
|
$ petalinux-build |
How to
Run RootFS Post Process Command in PetaLinuxBelow is one of the example and you can add rootfs post process command in Auto Mount SD card in Yocto Recipes
1. Create a base-files directory in meta-user layer as Code Block |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-core/ |
images/petalinuxbsp-user-image.bbappend file. You add a function which can perform modifying file, deleting and adding file and directories.Create a petalinux-user-image.bbappend file in meta-user layer as show below if doesn't exists(Note: Don't use project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend(2018.3 or later) or petalinux-image.bbappend(2018.2 or below))
2. Create a base-files_%.bbappend file and add below content Code Block |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/ |
...
...
Create a post process function as shown below in petalinux-user-image.bbappend
...
language | bash |
---|
theme | Midnight |
---|
title | petalinux-user-image.bbappend |
---|
...
base-files_%.bbappend
#base-files_%.bbappend content
|
...
...
...
+= "/media/card"
do_install_append() {
|
...
...
...
...
...
...
...
...
Clean petalinux-user-image sstate and rebuild petalinux-user-image recipe.
...
language | bash |
---|
theme | Midnight |
---|
...
3. Rebuild rootfs Code Block |
---|
|
$ petalinux-build |
Add Users and Set Passwords for Users in PetaLinuxCreate a petalinux-user-image.bbappend file Method 1: Append auto eth1 to existing interfaces file
1. Create a init-ifupdown directory in meta-user layer as show below (Note: Don't use project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend(2018.3 or later) or petalinux-image.bbappend(2018.2 or below)) Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ mkdir |
vim-p <plnx-proj-root>/project-spec/meta-user/recipes-core/ |
images/petalinux-user-image.bbappendInherit extrausers.bbclass from openembedded-core and add users in petalinux-user-image.bbappend 2. Create a init_ifupdown_%.bbappend file and add below content Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
title | petalinux-user-image.bbappend |
# petalinux-user-image$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown_%.bbappend
# init-ifupdown_%.bbappend content
|
inheritextrausers
EXTRAUSERSPARAMS="\ usermodProot root; \
useradd -P test@123 test1; \
useradd -P test@987 test2; \
"'/iface eth0 inet dhcp/ a auto eth1' ${D}${sysconfdir}/network/interfaces
} |
3. Rebuild rootfs Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ petalinux-build |
-x cleanall
$ petalinux-build How to Override a Recipe Variable in PetaLinux
...
Create a directory recipes-devtools/protobuf directory in <plnx-porj-root>/project-spec/meta-user
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-devtools/protobuf |
...
Method 2: Use your own interfaces file
1. Create a init-ifupdown directory in meta-user layer as Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/files |
2. Create your own network interface file as show below Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/files/myinterfaces
# myinterfaces content
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
# The loopback interface
auto lo
iface lo inet loopback
# Wireless interfaces
iface wlan0 inet dhcp
wireless_mode managed
wireless_essid any
wpa-driver wext
wpa-conf /etc/wpa_supplicant.conf
iface atml0 inet dhcp
# Wired or wireless interfaces
auto eth0
iface eth0 inet dhcp
# Add auto config for eth1
auto eth1
iface eth1 inet dhcp
# Ethernet/RNDIS gadget (g_ether)
# ... or on host side, usbnet and random hwaddr
iface usb0 inet static
address 192.168.7.2
netmask 255.255.255.0
network 192.168.7.0
gateway 192.168.7.1
# Bluetooth networking
iface bnep0 inet dhcp |
3. Create a init_ifupdown_%.bbappend file and add below content Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/init-ifupdown/init-ifupdown_%.bbappend
# init-ifupdown_%.bbappend content
SRC_URI += " \
file://myinterfaces \
"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
# Overwrite interface file with myinterface file in rootfs
do_install_append() {
install -m 0644 ${WORKDIR}/myinterfaces ${D}${sysconfdir}/network/interfaces
} |
4. Rebuild rootfs Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ petalinux-build |
How to Run RootFS Post Process Command in PetaLinux
Below is one of the example and you can add rootfs post process command in <plnx-proj-root>/project-spec/meta-user/recipes-core/images/petalinuxbsp-user-image.bbappend file. You add a function which can perform modifying file, deleting and adding file and directories.
Create a petalinux-user-image.bbappend file in meta-user layer as show below if doesn't exists(Note: Don't use project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend(2018.3 or later) or petalinux-image.bbappend(2018.2 or below))
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/images/petalinux-user-image.bbappend |
Create a post process function as shown below in petalinux-user-image.bbappend
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | petalinux-user-image.bbappend |
---|
|
# petalinux-user-image.bbappend content
# Auto DHCP for second network interface
rootfs_postprocess_function() {
if [ -e ${IMAGE_ROOTFS}/etc/network/interfaces ]; then
sed -i '/iface eth0 inet dhcp/ a auto eth1' ${IMAGE_ROOTFS}/etc/network/interfaces
fi
}
ROOTFS_POSTPROCESS_COMMAND_append = " \
rootfs_postprocess_function; \
" |
Clean petalinux-user-image sstate and rebuild petalinux-user-image recipe.
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ petalinux-build -x cleansstate
$ petalinux-build |
How to Add Users and Set Passwords for Users in PetaLinux
Create a petalinux-user-image.bbappend file in meta-user layer as show below (Note: Don't use project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend(2018.3 or later) or petalinux-image.bbappend(2018.2 or below))
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-core/images/petalinux-user-image.bbappend |
Inherit extrausers.bbclass from openembedded-core and add users in petalinux-user-image.bbappend
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | petalinux-user-image.bbappend |
---|
|
# petalinux-user-image.bbappend content
inherit extrausers
EXTRA_USERS_PARAMS = "\
usermod -P root root; \
useradd -P test@123 test1; \
useradd -P test@987 test2; \
" |
Rebuild rootfs
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ petalinux-build -x cleanall
$ petalinux-build |
How to Override a Recipe Variable in PetaLinux
- First step is to find the recipe directory hierarchy, search the recipe in https://layers.openembedded.org/layerindex/branch/rocko/recipes/
- Here we are taking Protobuf package as example as SRC_URI like is broken in Yocto 2.4 release. Same concept applies to all the recipes. Protobuf is categorized in meta-openembedded/meta-oe/recipes-devtools/protobuf
Create a directory recipes-devtools/protobuf directory in <plnx-porj-root>/project-spec/meta-user
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ mkdir -p <plnx-proj-root>/project-spec/meta-user/recipes-devtools/protobuf |
Create a protobuf_%.bbappend file. Note: The % wildcard is actually allow matching of the name and version up to the point of encountering the %. This approach will allow for matching of the major or major.minor. version of recipes.
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ vim <plnx-proj-root>/project-spec/meta-user/recipes-devtools/protobuf/protobuf_%.bbappend |
Now override a recipe variable for protobuf recipe.
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | protobuf_%.bbappend |
---|
|
# protobuf_%.bbappend content
SRC_URI = "git://github.com/google/protobuf.git" |
Build protobuf
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
$ petalinux-build -c protobuf -x cleanall
$ petalinux-build -c protobuf |
...
In order to utilize the sstate cache feature in PetaLinux projects follow these steps.
...
these steps.
- Download and untar the PetaLinux release sstate-cache files from https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html. Here we are taking 2019.2 as an example.
Go to your 2019.2 PetaLinux project and set the following options using petalinux-config
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | SSTATE Template |
---|
|
$ petalinux-config ---> Yocto Settings ---> Add pre-mirror url ---> file://<path_to_downloads>
$ petalinux-config ---> Yocto Settings ---> Local sstate feeds settings ---> local sstate feeds url ---> <path_to_sstate_aarch64_2019.2/aarch64> |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | SSTATE Template | | SSTATE Example Usage |
---|
|
$ petalinux-config ---> Yocto Settings ---> Add pre-mirror url ---> file:///opt/xilinx/petalinux/2019.2/downloads
$ petalinux-config ---> Yocto Settings ---> Add pre-mirror url ---> file://<path_to_downloads>
$ petalinux-config ---> Yocto Settings ---> Local sstate feeds settings ---> local sstate feeds url ---> <path_to_sstate_aarch64_2019.2/aarch64> Local sstate feeds settings ---> local sstate feeds url ---> /opt/xilinx/petalinux/2019.2/sstate_aarch64_2019.2/aarch64 |
Info |
---|
Note: For PREMIRRORS usage you need to add the file, git, http or https protocol followed by the path, but this is not true for SSTATE feeds. |
For setting up the download and shared state directories add the following variables in the <plnx-proj-root>/project-spec/meta-user/conf/petalinuxbsp.conf file.
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | DL_DIR and SSTATE_DIR Template |
---|
|
DL_DIR = "<PATH-TO-DOWNLOADS-DIRECTORY>/<PetaLinux-Version>/downloads"
SSTATE_DIR = "<PATH-TO-SSTATE-DIRECTORY>/<PetaLinux-Version>/sstate-cache/<ARCH>" |
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | SSTATE Example Usage |
---|
| $ petalinux-config ---> Yocto Settings ---> Add pre-mirror url ---> file:///opt/xilinx/petalinux/2019.2/downloads
$ petalinux-config ---> Yocto Settings ---> Local sstate feeds settings ---> local sstate feeds url ---> /opt/xilinx/petalinuxDL_DIR and SSTATE_DIR example usage |
|
DL_DIR = "/home/$USER/plnx-workspace/2019.2/downloads"
SSTATE_DIR = "/home/$USER/plnx-workspace/2019.2/sstate_aarch64_2019.2-cache/aarch64" |
Info |
---|
Note: For PREMIRRORS usage DL_DIR and SSTATE_DIR directories should have read and write permission. |
Now you need to
add the file, git, http or https protocol followed by the path, but this is not true for SSTATE feeds.For setting up the download and shared state directories add the following variables in the <plnx-proj-root>/project-spec/meta-user/conf/petalinuxbsp.conf file.start the build and if you are building the SDK (petalinux --sdk) then enabling the network is mandatory for a fresh build.
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | DL_DIR and SSTATE_DIR Template |
---|
| DL_DIR = "<PATH-TO-DOWNLOADS-DIRECTORY>/<PetaLinux-Version>/downloads"
SSTATE_DIR = "<PATH-TO-SSTATE-DIRECTORY>/<PetaLinux-Version>/sstate-cache/<ARCH>" |
$ petalinux-build
$ petalinux-build --sdk |
If you are building without network access then set the BB_NO_NETWORK variable.
Now you need to start the build and if you are building the SDK (petalinux --sdk) then enabling the network is mandatory for a fresh build.
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | Build Commands |
---|
|
$ petalinux-build
$ petalinux-build --sdk |
If you are building without network access then set the BB_NO_NETWORK variable Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
title | DL_DIR and SSTATE_DIR example usage |
---|
|
DL_DIR = "/home/$USER/plnx-workspace/2019.2/downloads"
SSTATE_DIR = "/home/$USER/plnx-workspace/2019.2/sstate-cache/aarch64" |
Info |
---|
Note: DL_DIR and SSTATE_DIR directories should have read and write permission. |
|
$ petalinux-config ---> Yocto Settings ---> [*] Enable BB NO NETWORK |
Info |
---|
Note: In case the project was built previously, run petalinux-build -x mrproper with above variables to reduce build time especially when using petalinux-build --sdk. |
How to disable hwcodecs(Xilinx vcu firmware) in PetaLinux for ZynqMP EV devices
By default hwcodecs are enabled in petalinux project when zynqmp ev device xsa is parsed while creating the project. To disable hwcodecs add below variable in <plnx-proj-root>/project-spec/meta-user/conf/petaliuxbsp.conf
Code Block |
---|
language | bash |
---|
theme | Midnight |
---|
|
IMAGE_FEATURES_remove = "hwcodecs" |
Clean and rebuild complete project.
Code Block |
---|
language | bash |
---|
theme | Midnight | title | Set BB_NO_NETWORK |
---|
|
$ petalinux-configbuild --->x Yocto Settings ---> [*] Enable BB NO NETWORK |
Info |
---|
Note: In case the project was built previously, run petalinux-build -x mrproper with above variables to reduce build time especially when using petalinux-build --sdk.mrproper
$ petalinux-build |
Yocto References
...