Last edited 2 months ago

How to customize the Linux kernel


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-requesites[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/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 \
   "