Difference between revisions of "How to customize the Linux kernel"

[quality revision] [quality revision]
m
m
 
Applicable for STM32MP13x lines, STM32MP15x lines

1 Purpose of article[edit]

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

2 Pre-requesites[edit]

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]

  • 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]

  • 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:
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 How to cross-compile with the Distribution Package#modifying_kernel_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]

Info white.png Information
The example given below is associated with the STM32MP15 Evaluation board, but the method is independent of the board.

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>/
Warning white.png Warning
Patches are linked to a kernel version, which means that these patches are rebuilt if the kernel version changes, and copied to the according kernel version sub-folder
  • 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 \
   "


<noinclude>{{ApplicableFor
|MPUs list=STM32MP13x, STM32MP15x
|MPUs checklist=STM32MP13x,STM32MP15x
}}</noinclude>

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

==Pre-requesites==
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.<br>


We describe here what you must do once you have:
* [[How to cross-compile with the Distribution Package#modifying_kernel_configuration|modified the kernel configuration]]
* [[How to cross-compile with the Distribution Package#Modifying_the_Linux_kernel_device_tree|modified the Linux kernel device tree]]
* [[How to cross-compile with the Distribution Package#Modifying_a_built-in_Linux_kernel_device_driver|modified a built-in device driver]]
so that these modifications are taken into account in your build process.

==Adding kernel customization (including Linux kernel device tree, configuration, driver modification)==

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

===Adding kernel configuration modifications===
* Identify all new configs you set or unset with: {{PC$}} bitbake <name of kernel recipe> -c menuconfig
* Put them inside a new fragment file and copy the fragment here:
 {{PC$}} cp <custom-fragment>.config  ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>/<kernel version>/
* Update accordingly <name of kernel recipe>.bbappend:
 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 [[How to cross-compile with the Distribution Package#modifying_kernel_configuration|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 = " <nowiki>"file://${LINUX_VERSION}/fragment-cma-size.config;subdir=fragments ""</nowiki>


===Adding kernel driver or device tree modifications==={{Info| The example given below is associated with the STM32MP15 Evaluation board, but the method is independent of the board. 
}}
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:
 {{PC$}} cd <build dir>/workspace/sources/<name of kernel recipe>/
 {{PC$}} git format-patch -2
* Copy these patch files into the custom layer
 {{PC$}} cp *.patch ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>/<kernel version>/<kernel version>.<revision>/
{{Warning|Patches are linked to a kernel version, which means that these patches are rebuilt if the kernel version changes, and copied to the according kernel version sub-folder}}
* Update <name of kernel recipe>.bbappend accordingly:
 SRC_URI_:append = " \<nowiki>file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0001-DT-leds-change.patch \ file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-Driver-change.patch \</nowiki>

    "<noinclude>

[[Category:How to customize software]]
[[Category:Distribution Package]]
{{PublicationRequestId | 8461 | 2018-08-29 | PhilipS}}</noinclude>
(3 intermediate revisions by 2 users not shown)
Line 27: Line 27:
 
  {{PC$}} cp <custom-fragment>.config  ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>/<kernel version>/
 
  {{PC$}} cp <custom-fragment>.config  ../meta-my-custo-layer/recipes-kernel/linux/<name of kernel recipe>/<kernel version>/
 
* Update accordingly <name of kernel recipe>.bbappend:
 
* Update accordingly <name of kernel recipe>.bbappend:
  KERNEL_CONFIG_FRAGMENTS_append += "${WORKDIR}/fragments/<kernel version>/<custom-fragment>.config"
+
  KERNEL_CONFIG_FRAGMENTS:append += "${WORKDIR}/fragments/<kernel version>/<custom-fragment>.config"
  SRC_URI_append = " file://<kernel version>/<custom-fragment>.config;subdir=fragments "
+
  SRC_URI:append = " file://<kernel version>/<custom-fragment>.config;subdir=fragments "
   
For the use case described in the [[How to cross-compile with the Distribution Package#modifying_kernel_configuration]] example, you should:
+
For the use case described in the [[How to cross-compile with the Distribution Package#modifying_kernel_configuration|modified the kernel configuration]] example, you should:
 
* Create fragment-cma-size.config with the following line:
 
* Create fragment-cma-size.config with the following line:
 
CONFIG_CMA_SIZE_MBYTES=256
 
CONFIG_CMA_SIZE_MBYTES=256
 
* Copy fragment-cma-size.config to ../meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp/<kernel version>
 
* 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:
 
* 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"
+
  KERNEL_CONFIG_FRAGMENTS:append += "${WORKDIR}/fragments/${LINUX_VERSION}/fragment-cma-size.config"
  SRC_URI_append = " file://${LINUX_VERSION}/fragment-cma-size.config;subdir=fragments "
+
 
  +
  SRC_URI:append = <nowiki>"file://${LINUX_VERSION}/fragment-cma-size.config;subdir=fragments"</nowiki>
   
 
===Adding kernel driver or device tree modifications===
 
===Adding kernel driver or device tree modifications===
The example given below is associated with the STM32MP15 Evaluation board, but the method is independent of the board.
+
{{Info| The example given below is associated with the STM32MP15 Evaluation board, but the method is independent of the board. }}
   
 
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:
 
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:
Line 50: Line 51:
 
{{Warning|Patches are linked to a kernel version, which means that these patches are rebuilt if the kernel version changes, and copied to the according kernel version sub-folder}}
 
{{Warning|Patches are linked to a kernel version, which means that these patches are rebuilt if the kernel version changes, and copied to the according kernel version sub-folder}}
 
* Update <name of kernel recipe>.bbappend accordingly:
 
* Update <name of kernel recipe>.bbappend accordingly:
  SRC_URI_append = " \
+
  SRC_URI:append = " \
     file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0001-DT-leds-change.patch \
+
     <nowiki>file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0001-DT-leds-change.patch \
    file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-Driver-change.patch \
+
  file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-Driver-change.patch \</nowiki>
 
     "
 
     "
 
<noinclude>
 
<noinclude>