Last edited 8 months ago

How to customize the Linux kernel

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

1. Purpose of article[edit | edit source]

This article gives the main steps needed to add kernel customization within the Yocto build process (with a Distribution Package).

2. Pre-requisites[edit | edit source]

You are already familiar with the Yocto build process and OpenSTLinux distribution.

You have already created a customer layer (How to create a new open embedded layer) to update, for your own needs, the OpenSTLinux distribution.

We describe here what you must do once you have:

so that these modifications are taken into account in your build process.

3. Adding kernel customization (including Linux kernel device tree, configuration, driver modification)[edit | edit source]

  • First, create (in your custom layer) a <name of kernel recipe>.bbappend file
touch ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>.bbappend

3.1. Adding kernel configuration modifications[edit | edit source]

  • Identify all new configs you set or unset with: bitbake <name of kernel recipe> -c menuconfig
  • Put them inside a new fragment file and copy the fragment here:
cp <custom-fragment>.config  ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>/<kernel version>/
  • Update accordingly <name of kernel recipe>.bbappend:
# Needed to tell Yocto to search inside this path
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/fragments/<kernel version>/<custom-fragment>.config"
SRC_URI:append = " file://<kernel version>/<custom-fragment>.config;subdir=fragments "

For the use case described in the modified the kernel configuration example, you should:

  • Create fragment-cma-size.config with the following line:

CONFIG_CMA_SIZE_MBYTES=256

  • Copy fragment-cma-size.config to ../meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp/<kernel version>
  • Update ../meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp.bbappend accordingly by adding these lines:
KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/fragments/${LINUX_VERSION}/fragment-cma-size.config"
SRC_URI:append = " file://${LINUX_VERSION}/fragment-cma-size.config;subdir=fragments"

3.2. Adding kernel driver or device tree modifications[edit | edit source]

Once you have made the changes for the device tree in <build dir>/workspace/sources/<name of kernel recipe>/arch/arm/boot/dts/st/stm32mp157c-ed1.dts AND, for built-in device driver in <build dir>/workspace/sources/<name of kernel recipe>/drivers/gpu/drm/stm/drv.c, you must:

  • Create the corresponding patch files:
cd <build dir>/workspace/sources/<name of kernel recipe>/
git format-patch -2
  • Copy these patch files into the custom layer
cp *.patch ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>/<kernel version>/<kernel version>.<revision>/
  • Update <name of kernel recipe>.bbappend accordingly:
SRC_URI:append = " \
   file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0001-DT-leds-change.patch \
   file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-Driver-change.patch \
   "