1. Overview[edit source]
This stage explains how modify, rebuild and reload the Linux® kernel.
You will first be guided to install the Linux® kernel source code in the Developer Package directory. Then you will execute step by step procedures to modify, rebuild and reload the Linux® kernel.
2. Download OpenSTLinux BSP that includes the Linux® kernel source code[edit source]
The software package is provided AS IS, and by downloading it, you agree to be bound to the terms of the software license agreement (SLA0048). The detailed content licenses can be found here.
- The OpenSTLinux BSP package is delivered through a tarball file named en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26.tar.gz for STM32MP157x-EV1 , STM32MP157x-DKx and STM32MP135x-DK boards.
- Download and install the STM32MP1 OpenSTLinux BSP package.
STM32MP1 Developer Package - STM32MP1 ecosystem v5.1.0 release | |
---|---|
Download |
|
Installation |
cd <working directory path>/Developer-Package
tar xvf en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26.tar.gz |
Release note |
Details about the content of the OpenSTLinux BSP package are available in the associated STM32 MPU OpenSTLinux release note. For information on older releases, go to Archives. |
3. Download OpenSTLinux BSP that includes the Linux® kernel source code[edit source]
STM32MPU Developer Package - OpenSTLinux BSP
4. Prepare the Linux® kernel source code[edit source]
cd stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.82-stm32mp-r2-r0
Extract the Linux® kernel source
tar xvf linux-6.1.82.tar.xz
Apply ST patches
cd linux-6.1.82 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
Apply fragments
make ARCH=arm64 defconfig "fragment*.config" for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done yes '' | make ARCH=arm64 oldconfig
5. Build the Linux® kernel source code for the first time[edit source]
- Build kernel images (uImage and vmlinux) and device tree (dtbs)
make ARCH=arm64 all dtbs
- Generate output build artifacts (and optionally, strip kernel modules (to reduce the size of each kernel modules) with INSTALL_MOD_STRIP=1)
mkdir -p $PWD/install_artifact/ make ARCH=arm64 INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH="$PWD/install_artifact" modules_install
6. Build the Linux® kernel source code for the first time[edit source]
- Build kernel images (uImage and vmlinux) and device tree (dtbs)
make Image.gz vmlinux dtbs LOADADDR=0xC2000040 make modules
- Generate output build artifacts
make INSTALL_MOD_PATH="$PWD/install_artifact" modules_install mkdir -p $PWD/install_artifact/boot/ cp $PWD/arch/$ARCH/boot/Image.gz $PWD/install_artifact/boot/ cp $PWD/arch/$ARCH/boot/dts/st/st*.dtb $PWD/install_artifact/boot/
7. Deploy the Linux® kernel on the board[edit source]
7.1. Push the Linux® kernel onto the board[edit source]
scp arch/arm64/boot/Image.gz root@<board ip address>:/boot
7.2. Push the devicetree into the board[edit source]
scp arch/arm64/boot/dts/st/stm32mp2xx*.dtb root@<board ip address>:/boot
7.3. Push the kernel modules onto the board[edit source]
- Remove the link created inside the install_artifact/lib/modules/<kernel version> directory
rm install_artifact/lib/modules/6.1.28/build install_artifact/lib/modules/6.1.28/source
- Copy kernel modules
scp -r install_artifact/lib/modules/* root@<ip of board>:/lib/modules
- Using the Linux® console, regenerate the list of module dependencies (modules.dep) and the list of symbols provided by modules (modules.symbols)
/sbin/depmod -a
- Synchronize data on disk with memory
sync
7.4. Reboot the board[edit source]
reboot
8. Deploy the Linux® kernel on the board[edit source]
8.1. Push the Linux® kernel onto the board[edit source]
cd $HOME/STM32MPU_workspace/STM32MPU-Ecosystem-v5.1.0/Developer-Package/st-image-weston-openstlinux-weston-stm32mp25-openstlinux-23-11-17/sources/aarch64-ostl-linux/linux-stm32mp-6.1.28-stm32mp25-beta-r1-rc3-r0/linux-6.1.28/install_artifact/ scp -r boot/* root@<board ip address>:/boot/
8.2. Push the devicetree into the board[edit source]
scp arch/arm64/boot/dts/st/stm32mp2xx*.dtb root@<board ip address>:/boot
8.3. Push the kernel modules onto the board[edit source]
- Remove the link created inside the install_artifact/lib/modules/<kernel version> directory
rm lib/modules/6.1.28/source lib/modules/6.1.28/build find . -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
- Copy kernel modules
scp -r lib/modules/* root@<board ip address>:/lib/modules/
- Using the Linux® console, regenerate the list of module dependencies (modules.dep) and the list of symbols provided by modules (modules.symbols)
/sbin/depmod -a
- Synchronize data on disk with memory
sync
8.4. Reboot the board[edit source]
reboot
9. Modify a built-in Linux® kernel device driver[edit source]
This simple example adds unconditional log information when the display driver is probed.
- Using the Linux® console, check that there is no log information when the display driver is probed
dmesg | grep -i stm_drm_platform_probe
- Go to the Linux® kernel source directory
cd $HOME/STM32MPU_workspace/STM32MP1-Ecosystem-v5.0.0/Developer-Package/stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.82-stm32mp-r2-r0/linux-6.1.82
- Edit the ./drivers/gpu/drm/stm/drv.c source file
- Add a log information in the stm_drm_platform_probe function as follows
static int stm_drm_platform_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct drm_device *ddev;
int ret;
[...]
DRM_INFO("Simple example - %s\n", __func__);
return 0;
[...]
}
- Save the file
- Rebuild the Linux® kernel
make all
- Update the Linux kernel image into board
scp arch/arm64/boot/Image.gz root@<board ip address>:/boot
- Reboot the board
reboot
- Check that log information is now present when the display driver is probed
dmesg | grep -i stm_drm_platform_probe [ 2.764080] [drm] Simple example - stm_drm_platform_probe
10. Modify a built-in Linux® kernel device driver[edit source]
This simple example adds unconditional log information when the display driver is probed.
- Using the Linux® console, check that there is no log information when the display driver is probed
dmesg | grep -i stm_drm_platform_probe
- Go to the Linux® kernel source directory
cd $HOME/STM32MPU_workspace/STM32MPU-Ecosystem-v5.1.0/Developer-Packagest-image-weston-openstlinux-weston-stm32mp25-openstlinux-23-11-17/sources/aarch64-ostl-linux/linux-stm32mp-6.1.28-stm32mp25-r2-rc7-r0/linux-6.1.28
- Edit the ./drivers/gpu/drm/stm/drv.c source file
- Add a log information in the stm_drm_platform_probe function as follows
static int stm_drm_platform_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct drm_device *ddev;
int ret;
[...]
DRM_INFO("Simple example - %s\n", __func__);
return 0;
[...]
}
- Save the file
- Rebuild the Linux® kernel
make Image.gz vmlinux dtbs LOADADDR=0xC2000040
- Update the Linux kernel image into board
scp arch/arm64/boot/Image.gz root@<board ip address>:/boot
- Reboot the board
reboot
- Check that log information is now present when the display driver is probed
dmesg | grep -i stm_drm_platform_probe [ 2.623158] [drm] Simple example - stm_drm_platform_probe
11. STM32MP257F-EV1 Evaluation board with OSTL device tree[edit source]
For compilation of OSTL device tree in the external Git, linux/stm32mp257f-ev1-ca35tdcid-ostl.dts , you can add this git inside Linux® kernel tree or outside Linux® kernel tree.
11.1. External git inside Linux® kernel tree[edit source]
git submodule add https://github.com/STMicroelectronics/dt-stm32mp arch/arm64/boot/dts/st/external-dt make dtbs or make stm32mp257f-ev1-ca35tdcid-ostl.dtb
11.2. External git outside Linux® kernel tree with KBUILD_EXTDTS[edit source]
git clone https://github.com/STMicroelectronics/dt-stm32mp ../dt-stm32mp make dtbs KBUILD_EXTDTS=$PATH/dt-stm32mp or make stm32mp257f-ev1-ca35tdcid-ostl.dtb KBUILD_EXTDTS=$PATH/dt-stm32mp