1. Overview
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 step by step you will execute procedures to modify, rebuild and reload the Linux® kernel.
2. Download the the Linux® kernel source code
2.1. For ecosystem release v1.1.0
- Download the STM32MP15-Ecosystem-v1.1.0 Developer Package Sources to the following directory:
$HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v1.1.0/Developer-Package - Uncompress the tarball file to get the Linux® kernel tarball, the ST patches and the ST configuration fragments
cd $HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v1.1.0/Developer-Package
tar xvf en.SOURCES-kernel-stm32mp1-openstlinux-4.19-thud-mp1-19-10-09.tar.xz
Expand
2.2. For ecosystem release v1.0.0
3. Prepare the Linux® kernel source code
- Extract the Linux® kernel source
ExpandFor ecosystem release v1.1.0 cd stm32mp1-openstlinux-4.19-thud-mp1-19-10-09/sources/arm-openstlinux_weston-linux-gnueabi/linux-stm32mp-4.19-r0 tar xvf linux-4.19.49.tar.xz For ecosystem release v1.0.0
- Apply the ST patches
cd linux-4.19.49/ /* For ecosystem release v1.1.0 */Expand for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
- Apply fragments
make 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 oldconfig
4. Build the Linux® kernel source code for the first time
- Build kernel images (uImage and vmlinux) and device tree (dtbs)
make uImage vmlinux dtbs LOADADDR=0xC2000040
- Build kernel module
make modules
- Generate output build artifacts
mkdir -p $PWD/install_artifact/
make INSTALL_MOD_PATH="$PWD/install_artifact" modules_install
5. Deploy the Linux® kernel on the board
5.1. Push the Linux® kernel into the board
scp arch/arm/boot/uImage root@<board ip address>:/boot
5.2. Push the devicetree into the board
scp arch/arm/boot/dts/stm32mp157*.dtb root@<board ip address>:/boot
5.3. Push the kernel modules into the board
For ecosystem release v1.1.0 :
- Remove the link created inside the install_artifact/lib/modules/4.19.49 directory
rm install_artifact/lib/modules/4.19.49/build install_artifact/lib/modules/4.19.49/source
Expand
For ecosystem release v1.0.0 :
- 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, re-generate 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
reboot
6. Modifying a built-in Linux kernel device driver
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
ExpandFor ecosystem release v1.1.0 : cd $HOME/STM32MPU_workspace/STM32MP15-Ecosystem-v1.1.0/Developer-Package/stm32mp1-openstlinux-4.19-thud-mp1-19-10-09/sources/arm-openstlinux_weston-linux-gnueabi/linux-stm32mp-4.19-r0/linux-4.19.49 For ecosystem release v1.0.0 :
openstlinux-4.19-thud-mp1-19-02-20/sources/arm-openstlinux_weston-linux-gnueabi/linux-stm32mp-4.19- r0/linux-4.19.9
- Edit the ./drivers/gpu/drm/stm/drv.c source file
- Add a log information in the stm_drm_platform_probe function as follow
DRM_INFO("Simple example - %s\n", __func__); return 0; [...] }static int stm_drm_platform_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct drm_device *ddev; int ret; [...]
- Save the file
- Rebuitd 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 there is now log information when the display driver is probed
dmesg | grep -i stm_drm_platform_probe
[ 2.764080] [drm] Simple example - stm_drm_platform_probe