3.2.1. Users Guide
3.2.1.1. Overview
This document will cover the basic steps for building the Linux kernel.
3.2.1.2. Getting the Kernel Source Code
The easiest way to get access to the kernel source code is by downloading and installing the Processor SDK Linux. You can download the latest Processor SDK Linux installer from AM335X-Linux-SDK-Download-page. Once installed, the kernel source code is included in the SDK’s board-support directory. For your convenience the sources also includes the kernel’s git repository including commit history. Alternatively, Kernel sources can directly be fetched from GIT.
You can find the details about the git repository, branch and commit id in the release-specific-build-information-kernel section of the release notes.
3.2.1.3. Preparing to Build
It is important that when using the GCC toolchain provided with the SDK or stand alone from TI that you do NOT source the environment-setup file included with the toolchain when building the kernel. Doing so will cause the compilation of host side components within the kernel tree to fail.
Note
The following commands are intended to be run from the root of the kernel tree unless otherwise specified. The root of the kernel tree is the top-level directory and can be identified by looking for the “MAINTAINERS” file.
3.2.1.3.1. Compiler
Before compiling the kernel or kernel modules the SDK’s toolchain needs to be added to the PATH environment variable
export PATH=<sdk path>/linux-devkit/sysroots/x86_64-arago-linux/usr/bin:$PATH
The current compiler supported for this release along with download location can be found in the release notes for the kernel release.
3.2.1.3.2. Cleaning the Kernel Sources
Prior to compiling the Linux kernel it is often a good idea to make sure that the kernel sources are clean and that there are no remnants left over from a previous build.
Note
The next step will delete any saved .config file in the kernel tree as well as the generated object files. If you have done a previous configuration and do not wish to lose your configuration file you should save a copy of the configuration file (.config) before proceeding.
The command to clean the kernel is:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- distclean
3.2.1.4. Configuring the Kernel
Before compiling the Linux kernel it needs to be configured to select what components will become part of the kernel image, which components will be build as dynamic modules, and which components will be left out all together. This is done using the Linux kernel configuration system.
It is often easiest to start with a base default configuration and then customize it for your use case if needed. Apply Linux kernel configurations with a command of the form:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- <defconfig>
3.2.1.4.1. Using Default Configurations
For this sdk, the defconfig found in arch/arm/configs is used to create the prebuilt
files. We recommend users to use this kernel configuration (or at least use it
as a starting point).
For example, to apply the default AM335x kernel configuration, use:
For Linux,
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- multi_v7_defconfig ti_multi_v7_prune.config no_smp.config
For RT-Linux,
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- multi_v7_defconfig ti_multi_v7_prune.config no_smp.config ti_rt.config
The config fragments found in <path-to-ti-linux-kernel>/kernel/configs can be used to trim/add features when building a kernel that targets only TI EVMs. Append a config fragment to the end of “make” command like above to add/remove features.
After the configuration step has run the full configuration file is saved to the root of the kernel tree as .config. Any further configuration changes are based on this file until it is cleaned up by doing a kernel clean as mentioned above.
3.2.1.4.2. Customizing the Configuration
When you want to customize the kernel configuration the easiest way is to use the built in kernel configuration systems. One popular configuration system is menuconfig. menuconfig is an ncurses based configuration utility.
To invoke the kernel configuration you simply use a command like:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- <config type>
i.e. for menuconfig the command would look like
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
Once the configuration window is open you can then select which kernel components should be included in the build. Exiting the configuration will save your selections to a file in the root of the kernel tree called .config.
3.2.1.5. Compiling the Sources
3.2.1.5.1. Compiling the Kernel
Once the kernel has been configured it must be compiled to generate the bootable kernel image as well as any dynamic kernel modules that were selected.
By default U-boot expects a compressed, self-extracting kernel image called
zImage as the type of kernel image used.
To build, use this command:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- zImage
This will result in a kernel image file being created in the
arch/arm/boot/ directory called zImage.
3.2.1.5.2. Compiling the Device Tree Binaries
Starting with the 3.8 kernel each TI evm has an unique device tree
binary file required by the kernel. Therefore, you will need to build
and install the correct dtb for the target device. All device tree files
are located at arch/arm/boot/dts/ti/omap. Below list various TI evms and the
matching device tree file.
Boards |
Device Tree File |
|---|---|
Beaglebone Black |
am335x-boneblack.dts |
Beaglebone Green ECO |
am335x-bonegreen-eco.dts |
AM335x General Purpose EVM |
am335x-evm.dts |
AM335x Starter Kit |
am335x-evmsk.dts |
AM335x Industrial Communications Engine |
am335x-icev2.dts |
AM437x General Purpose EVM |
am437x-gp-evm.dts, am437x-gp-evm-hdmi.dts (HDMI) |
AM437x Starter Kit |
am437x-sk-evm.dts |
AM437x Industrial Development Kit |
am437x-idk-evm.dts |
AM57xx EVM |
am57xx-evm.dts, am57xx-evm-reva3.dts (revA3 EVMs ) |
AM572x IDK |
am572x-idk.dts |
AM571x IDK |
am571x-idk.dts |
AM574x IDK |
am574x-idk.dts |
K2H/K2K EVM |
keystone-k2hk-evm.dts |
K2E EVM |
keystone-k2e-evm.dts |
K2L EVM |
keystone-k2l-evm.dts |
K2G EVM |
keystone-k2g-evm.dts |
K2G ICE EVM |
keystone-k2g-ice.dts |
OMAP-L138 LCDK |
da850-lcdk.dts |
To build an individual device tree file find the name of the dts file for the board you are using and replace the .dts extension with .dtb. Then run the following command:
make DTC_FLAGS=-@ ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- <dt filename>.dtb
The compiled device tree file with be located in arch/arm/boot/dts/ti/omap.
For example, the Beaglebone Black device tree file is named
am335x-boneblack.dts. To build the device tree binary you would run:
make DTC_FLAGS=-@ ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- am335x-boneblack.dtb
Alternatively, you can build every device tree binary with command
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- dtbs
3.2.1.5.3. Compiling the Kernel Modules
By default the majority of the Linux drivers used in the sdk are not
integrated into the kernel image file zImage. These drivers are built as
dynamic modules. The command to build these modules is:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- modules
This will result in .ko (kernel object) files being placed in the kernel tree. These .ko files are the dynamic kernel modules.
Note
If you make a change to the kernel which requires you to recompile the kernel, then you should also recompile the kernel modules and reinstall the kernel modules. Otherwise your kernel modules may refuse to load, which will result in a loss of functionality.
3.2.1.6. FIT Image
FIT Image documentation is pending for AM335x reach out to: Help e2e for additional information.
3.2.1.7. Installing the Kernel
Once the Linux kernel, dtb files and modules have been compiled they must be installed. In the case of the kernel image this can be installed by copying the kernel image file to the location where it is going to be read from. The device tree binaries should also be copied to the same directory that the kernel image was copied to.
3.2.1.7.1. Installing the Kernel Image and Device Tree Binaries
cd <kernel sources dir>
sudo cp arch/arm/boot/zImage $boot
sudo cp arch/arm/boot/dts/ti/omap/<dt file>.dtb $boot
For example, if you wanted to copy the kernel image and BeagleBone Black device tree file to the SD card partition, you would enter the below commands:
cd <kernel sources dir>
sudo cp arch/arm/boot/zImage $boot
sudo cp arch/arm/boot/dts/ti/omap/am335x-boneblack.dtb $boot
Where $boot is the mount point for the boot partition of the SD card.
Starting with U-boot 2013.10, the kernel and device tree binaries are read from
the root file system’s boot directory when booting from MMC/EMMC. (NOT from the
/boot/ partition on the MMC). This would mean you copy the kernel image and device
tree binaries to /media/rootfs/boot instead of /media/boot.
3.2.1.7.2. Installing the Kernel Modules
To install the kernel modules you use another make command similar to the others, but with an additional parameter which give the base location where the modules should be installed. This command will create a directory tree from that location like lib/modules/<kernel version> which will contain the dynamic modules corresponding to this version of the kernel. The base location should usually be the root of your target file system. The general format of the command is:
sudo make ARCH=arm INSTALL_MOD_PATH=<path to root of file system> modules_install
For example if you are installing the modules on the rootfs partition of the SD card you would do:
sudo make ARCH=arm INSTALL_MOD_PATH=/media/rootfs modules_install
Note
Append INSTALL_MOD_STRIP=1 to the make modules_install command to reduce the size of the resulting installation