Difference between revisions of "How to customize the Linux kernel"
[unchecked revision] | [quality revision] |
m
|
m
|
Applicable for | STM32MP13x lines, STM32MP15x lines |
Contents
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:
- modified the kernel configuration
- modified the Linux kernel device tree
- modified a built-in device driver
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 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]
![]() |
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>/
![]() |
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>
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" |
|
− | + | 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: |
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: |
||
Line 35: | Line 35: | ||
* 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" |
|
− | + | 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=== |
||
Line 51: | 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 = " \ |
|
<nowiki>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 \</nowiki> |
file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0002-Driver-change.patch \</nowiki> |