Last edited 10 months ago

Modify, rebuild and reload the Linux® kernel

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 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.

2.1 For STM32MP13x lines More info.png[edit source]

  • The STM32MP1 Linux kernel is delivered through a tarball file named unknown revision for STM32MP135x-DK More info green.png boards.

  • Download and install the STM32MP1 Linux kernel

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.

STM32MP1 Developer Package Linux kernel - STM32MP13-Ecosystem-v3.1.0.ALPHA release
Download

If you didn't retrieve yet the file unknown revision , please follow instructions on the downloading instructions page.
You will get all source files in the directory you choose when you extracted the .jar file.


  • Uncompress the tarball file to get the Linux® kernel tarball, the ST patches and the ST configuration fragments
 cd $HOME/STM32MPU_workspace/STM32MP13-Ecosystem-v3.1.0/Developer-Package
 tar xvf unknown revision 

2.2 For STM32MP15x lines More info.png[edit source]

  • Download the [unknown revision /unknown revision STM32MP15-Ecosystem-v3.1.0 Developer Package Sources] to the following directory:
    $HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package
  • Uncompress the tarball file to get the Linux® kernel tarball, ST patches and ST configuration fragments
 cd $HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package
 tar xvf unknown revision 

3 Prepare the Linux® kernel source code[edit source]

  • For STM32MP13x lines More info.png:
 cd unknown revision 

Extract the Linux® kernel source

 tar xvf unknown revision 

Apply ST patches

 cd unknown revision 
 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
  • For STM32MP15x lines More info.png:
 cd unknown revision 

Extract the Linux® kernel source

 tar xvf unknown revision 

Apply ST patches

 cd unknown revision 
 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done


Apply fragments

 make ARCH=arm multi_v7_defconfig "fragment*.config"
 for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
 yes '' | make ARCH=arm oldconfig

4 Build the Linux® kernel source code for the first time[edit source]

Info white.png Information
Building the kernel for the first time can take several minutes.
  • Build kernel images (uImage and vmlinux) and device tree (dtbs)
 make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
  • Build kernel module
 make ARCH=arm modules
  • Generate output build artifacts
 mkdir -p $PWD/install_artifact/
 make ARCH=arm INSTALL_MOD_PATH="$PWD/install_artifact" modules_install

5 Deploy the Linux® kernel on the board[edit source]

5.1 Push the Linux® kernel onto the board[edit source]

 scp arch/arm/boot/uImage root@<board ip address>:/boot

5.2 Push the devicetree into the board[edit source]

 scp arch/arm/boot/dts/stm32mp1xx*.dtb root@<board ip address>:/boot

5.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/5.10.61/build install_artifact/lib/modules/5.10.61/source 
  • Optionally, strip kernel modules (to reduce the size of each kernel modules)
 find install_artifact/ -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
  • 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

5.4 Reboot the board[edit source]

 reboot

6 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


For STM32MP13x lines More info.png:

  • Go to the Linux® kernel source directory
 cd $HOME/STM32MPU_workspace/STM32MP13-Ecosystem-v3.1.0/Developer-Package/unknown revision /unknown revision 

For STM32MP15x lines More info.png:

  • Go to the Linux® kernel source directory
 cd $HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/unknown revision /unknown revision 

  • 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 uImage LOADADDR=0xC2000040
  • Update the Linux kernel image into board
 scp arch/arm/boot/uImage 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