meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp/README.HOW_TO.txt

392 lines
16 KiB
Plaintext

Compilation of kernel:
1. Pre-requisite
2. Initialize cross-compilation via SDK
3. Prepare kernel source code
4. Manage kernel source code
5. Configure kernel source code
6. Compile kernel source code
7. Update software on board
8. Update Starter Package with kernel compilation outputs
----------------
1. Pre-requisite
----------------
OpenSTLinux SDK must be installed.
For kernel build, you need to install:
- libncurses and libncursesw dev package
Ubuntu: sudo apt-get install libncurses5-dev libncursesw5-dev
Fedora: sudo yum install ncurses-devel
- mkimage
Ubuntu: sudo apt-get install u-boot-tools
Fedora: sudo yum install u-boot-tools
Only if you like to have a git management of the code (see section 4
[Manage the kernel source code]):
- git:
Ubuntu: sudo apt-get install git-core gitk
Fedora: sudo yum install git
If you have never configured your git configuration, run the following commands:
$ git config --global user.name "your_name"
$ git config --global user.email "your_email@example.com"
---------------------------------------
2. Initialize cross-compilation via SDK
---------------------------------------
Source SDK environment:
$ source <path to SDK>/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
To verify if your cross-compilation environment has been put in place correctly,
run the following command:
$ set | grep CROSS
CROSS_COMPILE=arm-ostl-linux-gnueabi-
Warning: the environment is valid only on the shell session where you have
sourced the SDK environment.
------------------------
3. Prepare kernel source
------------------------
If not already done, extract the sources from Developer Package tarball, for example:
$ tar xf en.SOURCES-stm32mp1-*.tar.xz
In the kernel source directory (sources/*/##BP##-##PR##),
you have one kernel source tarball, the patches and one Makefile:
- ##LINUX_TARNAME##.tar.xz
- 00*.patch
- Makefile.sdk
If you would like to have a git management for the source code move to
to section 4 [Management of kernel source code with GIT].
Otherwise, to manage kernel source code without git, you must extract the
tarball now and apply the patch:
$> tar xf ##LINUX_TARNAME##.tar.xz
$> cd ##LINUX_TARNAME##
$> for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
You can now move to section 5 [Configure kernel source code].
-------------------------------------
4. Manage kernel source code with GIT
-------------------------------------
If you like to have a better management of change made on kernel source, you
have 3 solutions to use git.
4.1 Get STMicroelectronics kernel source code from GitHub
---------------------------------------------------------
URL: https://github.com/STMicroelectronics/linux.git
Branch: ##ARCHIVER_ST_BRANCH##
Revision: ##ARCHIVER_ST_REVISION##
$ git clone https://github.com/STMicroelectronics/linux.git
$ git checkout -b WORKING ##ARCHIVER_ST_REVISION##
4.2 Create Git from tarball
---------------------------
$ cd <directory to kernel source code>
$ test -d .git || git init . && git add . && git commit -m "new kernel" && git gc
$ git checkout -b WORKING
Apply patches:
$ for p in `ls -1 ../*.patch`; do git am $p; done
NB: this is the fastest way to get your kernel source code ready for development
4.3 Get Git from Linux kernel community and apply STMicroelectronics patches
---------------------------------------------------------------
URL: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Branch: ##ARCHIVER_COMMUNITY_BRANCH##
Revision: ##ARCHIVER_COMMUNITY_REVISION##
$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
$ cd linux-stable
$ git checkout -b WORKING ##ARCHIVER_COMMUNITY_REVISION##
$ for p in `ls -1 <path to patch>/*.patch`; do git am $p; done
NB: this way is slightly slower than the tarball extraction but you get
advantage of all git history.
4.4 Predefined kernel version vs auto-generated kernel version
--------------------------------------------------------------
If you are using git for managing your source code, kernel makefile get the SHA1
of current git and add it to kernel version number generated.
ex.: 4.9.23-g3e866b0 (kernel version + SHA1 of current git commit)
To bypass this auto-generation of kernel version number:
$ cd <directory to kernel source code>
$ echo "" > .scmversion
This file avoid to have a kernel version with SHA1:
- With scmversion file: 4.9.23
- Without scmversion file: 4.9.23-g3e866b0
This configuration allows to build new kernel from modified source code without
any issue when using the new kernel binary on target regarding any external
kernel module already available on target rootfs (as built without scmversion).
-------------------------------
5. Configure kernel source code
-------------------------------
There are two methods to configure and compile kernel source code:
- Inside kernel source tree directory
- Outside kernel source tree in a build directory
We highly preconized the build is a build directory method as:
- It avoids mixing files generated by the build with the source files inside
same directories
- To remove all the files generated by the build, it's enough to remove the
build directory
- You can build for different configurations in several build directories, e.g.:
1) build in "build_1" for a first kernel configuration
2) build in "build_2" for a second kernel configuration
Then this leaves the 2 images available for tests
* Configure on a build directory (different of kernel source code directory)
Here for example, build directory is located at the same level of kernel
source code
$ cd <directory to kernel source code>
$> mkdir -p ../build
$> make ARCH=arm O="$PWD/../build" multi_v7_defconfig fragment*.config
If there are some fragments, apply them
* manually one by one:
$ scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-01-xxx.config
$ scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config ../fragment-02-xxx.config
...
$ (yes '' || true) | make ARCH=arm oldconfig O="$PWD/../build"
* or, by loop:
$> for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config $f; done
$> (yes '' || true) | make ARCH=arm oldconfig O="$PWD/../build"
* Configure on the current source code directory
$ cd <directory to kernel source code>
$ make ARCH=arm multi_v7_defconfig fragment*.config
If there are some fragments, apply them
* manually one by one:
$ scripts/kconfig/merge_config.sh -m -r .config ../fragment-01-xxxx.config
$ scripts/kconfig/merge_config.sh -m -r .config ../fragment-02-xxxx.config
...
$ (yes '' || true) | make oldconfig
* or, by loop:
$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
$ (yes '' || true) | make ARCH=arm oldconfig
NB: Two types of fragments are provided:
* official fragments (fragment-xxx.config)
* optional fragments as example (optional-fragment-xxx.config) to add a
feature not enabled by default.
The order in which fragments are applied is determined by the number of the
fragment filename (fragment-001, fragment-002, e.g.).
Please pay special attention to the naming of your optional fragments to
ensure you select the right features.
-----------------------------
6. Compile kernel source code
-----------------------------
You MUST compile from the directory on which the configuration has been done (i.e.
the directory which contains the '.config' file).
It's preconized to use the method with dedicated build directory for a better
managment of changes made on source code (as all build artifacts will be located
inside the dedicated build directory).
* Compile and install on a build directory (different of kernel source code directory)
$ cd <directory to kernel source code>
* Build kernel images (uImage and vmlinux) and device tree (dtbs)
$> make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"
* Build kernel module
$> make ARCH=arm modules O="$PWD/../build"
* Generate output build artifacts
$> make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
$> mkdir -p $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
or
$ cd <build directory>
* 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
$ make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install
$ mkdir -p $PWD/../build/install_artifact/boot/
$ cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
$ cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
* Compile and install on the current source code directory
$ cd <directory to kernel source code>
* 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
$ make ARCH=arm INSTALL_MOD_PATH="$PWD/install_artifact" modules_install
$ mkdir -p $PWD/install_artifact/boot/
$ cp $PWD/arch/arm/boot/uImage $PWD/install_artifact/boot/
$ cp $PWD/arch/arm/boot/dts/st*.dtb $PWD/install_artifact/boot/
Generated files are :
- $PWD/install_artifact/boot/uImage
- $PWD/install_artifact/boot/<stm32-boards>.dtb
---------------------------
7. Update software on board
---------------------------
7.1 Partitioning of binaries
----------------------------
* Bootfs:
Bootfs contains the kernel and the devicetree.
* Rootfs:
Rootfs contains the external kernel modules.
Please refer to User guide for more details.
7.2 Update via network
----------------------
* kernel + devicetree
$ cd <path to install_artifact dir>/install_artifact
if bootfs are not monted on target, mount it
$ ssh root@<ip of board> df to see if there is a partition mounted on /boot
else
$ ssh root@<ip of board> mount <device corresponding to bootfs> /boot
$ scp -r boot/* root@<ip of board>:/boot/
$ ssh root@<ip of board> umount /boot
* kernel modules
$ cd <path to install_artifact dir>/install_artifact
Remove the link on install_artifact/lib/modules/<kernel version>/
$ rm lib/modules/<kernel version>/source lib/modules/<kernel version>/build
Optionally, strip kernel modules (to reduce the size of each kernel modules)
$ find . -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
Copy kernel modules:
$ scp -r lib/modules/* root@<ip of board>:/lib/modules/
Generate a list of module dependencies (modules.dep) and a list of symbols
provided by modules (modules.symbols):
$ ssh root@<ip of board> /sbin/depmod -a
Synchronize data on disk with memory
$ ssh root@<ip of board> sync
Reboot the board in order to take update into account
$ ssh root@<ip of board> reboot
7.3 Update via SDCARD on your Linux PC
--------------------------------------
* kernel + devicetree
$ cd <path to install_artifact dir>/install_artifact
Verify sdcard are mounted on your Linux PC: /media/$USER/bootfs
$ cp -r boot/* /media/$USER/bootfs/
Depending of your Linux configuration, you may call the command under sudo
$ sudo cp -r boot/* /media/$USER/bootfs/
Don't forget to unmount properly sdcard
* kernel modules
$ cd <path to install_artifact dir>/install_artifact
Remove the link on install_artifact/lib/modules/<kernel version>/
$ rm lib/modules/<kernel version>/source lib/modules/<kernel version>/build
Optionally, strip kernel modules (to reduce the size of each kernel modules)
$ find . -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
Verify sdcard are mounted on your Linux PC: /media/$USER/rootfs
Copy kernel modules:
$ cp -r lib/modules/* /media/$USER/rootfs/lib/modules/
Depending of your Linux configuration, you may call the command under sudo
$ sudo cp -r lib/modules/* /media/$USER/rootfs/lib/modules/
Don't forget to unmount properly sdcard
Generate a list of module dependencies (modules.dep) and a list of symbols
provided by modules (modules.symbols):
$ ssh root@<ip of board> depmod -a
Synchronize data on disk with memory
$ ssh root@<ip of board> sync
Reboot the board in order to take update into account
$ ssh root@<ip of board> reboot
7.4 Update via SDCARD on your BOARD (via U-Boot)
------------------------------------------------
You MUST configure first, via U-Boot, the board into usb mass storage:
* Plug the SDCARD on Board.
* Start the board and stop on U-boot shell:
Hit any key to stop autoboot: 0
STM32MP>
* plug an USB cable between the PC and the board via USB OTG port.
* On U-Boot shell, call the usb mass storage functionnality:
STM32MP> ums 0 mmc 0
ums <USB controller> <dev type: mmc|usb> <dev[:part]>
Example:
For SDCARD: ums 0 mmc 0
For USB Disk: ums 0 usb 0
* kernel + devicetree
$ cd <path to install_artifact dir>/install_artifact
Remove the link on install_artifact/lib/modules/<kernel version>/
$ rm lib/modules/<kernel version>/source lib/modules/<kernel version>/build
Optionally, strip kernel modules (to reduce the size of each kernel modules)
$ find . -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
Verify sdcard mount point are mounted on your Linux PC: /media/$USER/bootfs
$ cp -r boot/* /media/$USER/bootfs/
Depending of your Linux configuration, you may call the command under sudo
$ sudo cp -rf boot/* /media/$USER/bootfs/
Don't forget to unmount properly sdcard
Warning: kernel and device tree file name must be aligned between
extlinux.conf file and file system.
* kernel modules
$ cd <path to install_artifact dir>/install_artifact
Remove the link on install_artifact/lib/modules/<kernel version>/
$ rm lib/modules/<kernel version>/source lib/modules/<kernel version>/build
Optionally, strip kernel modules (to reduce the size of each kernel modules)
$ find . -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
Verify sdcard mount point are mounted on your Linux PC: /media/$USER/rootfs
Copy kernel modules:
$ cp -rf lib/modules/* /media/$USER/rootfs/lib/modules/
Depending of your Linux configuration, you may call the command under sudo
$ sudo cp -r lib/modules/* /media/$USER/rootfs/lib/modules/
Don't forget to unmount properly sdcard
At next runtime, don't forget to generate a list of module dependencies
(modules.dep) and a list of symbols provided by modules (modules.symbols):
$on board> depmod -a
Synchronize data on disk with memory
$on board> sync
Reboot the board in order to take update into account
$on board> reboot
7.5 Useful information
---------------------
* How to re-generate kernel database on board:
$on board> depmod -a
(don't forget to synchronize the filesystem before to reboot)
$on board> sync
* How to see the list of external kernel modules loaded:
$on board> lsmod
* How to see information about kernel module:
$on board> modinfo /lib/modules/5.4.31/kernel/drivers/leds/led-class-flash.ko
filename: /lib/modules/5.4.31/kernel/drivers/leds/led-class-flash.ko
license: GPL v2
description: LED Flash class interface
author: Jacek Anaszewski <j.anaszewski@samsung.com>
depends:
intree: Y
name: led_class_flash
vermagic: 5.4.31 SMP preempt mod_unload modversions ARMv7 p2v8
---------------------------
8. Update Starter Package with kernel compilation outputs
---------------------------
<-- Section under construction -->
If not already done, extract the artifacts from Starter Package tarball, for example:
# tar xf en.FLASH-stm32mp1-*.tar.xz
Move to Starter Package root folder,
#> cd <your_starter_package_dir_path>
Cleanup Starter Package from original kernel artifacts first
#> echo "*** Section under construction ***"
<-- Section under construction -->