TS-4900 Kernel Compile Guide: Difference between revisions

From embeddedTS Manuals
No edit summary
No edit summary
Line 41: Line 41:
# git clone https://github.com/embeddedarm/linux-3.10.17-imx6.git -b imx_4.1.15_1.0.0_ga linux-tsimx6 --depth 1
# git clone https://github.com/embeddedarm/linux-3.10.17-imx6.git -b imx_4.1.15_1.0.0_ga linux-tsimx6 --depth 1
# If you already have it cloned out you can "git pull" to get the latest changes
# If you already have it cloned out you can "git pull" to get the latest changes
# For WIFI support, download qcacld-2.0:
# This is compatible with 4.1.15 or 4.9.11 only
git clone https://github.com/embeddedarm/qcacld-2.0.git -b caf-wlan/CNSS.LEA.NRT_3.1


cd linux-tsimx6
cd linux-tsimx6
Line 54: Line 58:


## Make any changes in "make menuconfig" or driver modifications, then compile
## Make any changes in "make menuconfig" or driver modifications, then compile
make -j8 && make -j8 uImage
make -j8 all uImage zImage
 
# Compile wifi driver:
cd ../qcacld-2.0/
export KERNEL_SRC="../linux-tsimx6/"
make clean
CONFIG_CLD_HL_SDIO_CORE=y make -j8
INSTALL_MOD_PATH="$TEMPDIR" make modules_install
</source>
 
Generate a tar to overlay on your image with:
<source lang=bash>
export TEMPDIR=$(mktemp -d)
mkdir "$TEMPDIR"/boot/
cp arch/arm/boot/uImage "$TEMPDIR"/boot/uImage
cp arch/arm/boot/zImage  "$TEMPDIR"/boot/zImage
cp arch/arm/boot/dts/imx6*-ts*.dtb "$TEMPDIR"/boot/
INSTALL_MOD_PATH="$TEMPDIR" make modules_install
 
fakeroot sh -c "chmod 755 $TEMPDIR;
chown -R root:root $TEMPDIR;
tar cjvf kernel.tar.bz2 -C $TEMPDIR .;
rm -rvf $TEMPDIR";
</source>
</source>


To install this to a board you would use a USB SD reader and plug in the card. You must have an image already written to the card.  This will not install the root filesystem with a bootable OS, only the kernel and drivers. Assuming your Linux rootfs is all on "sdc1":
This will generate a kernel.tar.bz2.  This can be installed on the unit by copying it to a running board and executing:
<source lang=bash>
# Only run this on your board, not on a workstation
tar -xf kernel.tar.bz2 -C /
<source>


This can also be extracted over existing images, or removable media like SD cards mounted on the workstation.  For example, assuming your SD card is /dev/sdc:
<source lang=bash>
<source lang=bash>
export DEV=/dev/sdc1
mkdir /mnt/sd/
sudo mount "$DEV" /mnt/sd
mount /dev/sdc1 /mnt/sd/
sudo rm /mnt/sd/boot/uImage
tar -xf kernel.tar.bz2 -C /mnt/sd/
sudo cp arch/arm/boot/uImage  /mnt/sd/boot/uImage
umount /mnt/sd/
sudo cp arch/arm/boot/dts/imx6*ts*.dtb /mnt/sd/boot/
<source>
INSTALL_MOD_PATH="/mnt/sd" sudo -E make modules_install
INSTALL_HDR_PATH="/mnt/sd" sudo -E make headers_install
sudo umount /mnt/sd/
sync
</source>


== Change Kernel Splash Screen ==
== Change Kernel Splash Screen ==
{{:Imx6 Kernel splash screen}}
{{:Imx6 Kernel splash screen}}

Revision as of 17:02, 2 April 2020

To add drivers or reduce the size of our kernel, or to write custom kernel drivers you may need to build the kernel. These steps allow you to rebuild the kernel which is compatible with most of our Linux distributions.

This board has multiple kernels released and available in our git:

Newer kernels are released on the linux-tsimx git:

  • embeddedarm/linux-tsimx
  • The ts-imx_4.9.11_1.0.0_ga branch is the only one that should be used with our i.MX6 series.

For legacy kernels:

  • embeddedarm/linux-3.10.17-imx6
  • The "master" branch is 3.10.17 and is largely outdated and replaced with later kernels. This is used with the old Yocto Dora builds.
  • The "imx_3.10.53_1.1.0_ga" kernel is a stable branch. Use this with Yocto Dizzy, Fido, or compatible with Debian Jessie.
  • The "imx_3.14.52_1.1.0_ga" branch is compatible with Yocto Jethro, and Debian.
  • The "imx_4.1.15_1.0.0_ga" branch is compatible with Yocto Jethro, Yocto Morty and Debian. Includes recent fixes not in older branches. This is recommended for most users.

The kernel can be rebuilt by cross compiling from an X86/X86_64 Linux. Our default kernels are rebuilt using the toolchains built by Yocto. You can download the appropriate cross toolchain for your Linux system here:

Note: Older kernels will require older toolchains. For older Yocto kernels use a matching yocto toolchain. For Debian, the latest kernel is recommended.
chmod a+x poky*.sh
sudo ./poky*.sh

This will ask for the install directory for the toolchain. You can choose another directory than the default, but the following instructions will assume the defaults.

This also requires several tools from your distribution. For Ubuntu/Debian:

sudo apt-get install git build-essential lzop u-boot-tools libncursesw5-dev

Once those are installed:

git clone https://github.com/embeddedarm/linux-tsimx.git -b ts-imx_4.9.11_1.0.0_ga linux-tsimx6 --depth 1

# For legacy kernels instead:
# git clone https://github.com/embeddedarm/linux-3.10.17-imx6.git -b imx_4.1.15_1.0.0_ga linux-tsimx6 --depth 1
# If you already have it cloned out you can "git pull" to get the latest changes

# For WIFI support, download qcacld-2.0:
# This is compatible with 4.1.15 or 4.9.11 only
git clone https://github.com/embeddedarm/qcacld-2.0.git -b caf-wlan/CNSS.LEA.NRT_3.1

cd linux-tsimx6
# These export commands must be run every time before any make commands
export ARCH=arm
# For 64-bit
export CROSS_COMPILE=/opt/poky/2.2.2/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-
# For 32-bit
#export CROSS_COMPILE=/opt/poky/2.2.2/sysroots/i686-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-
export LOADADDR=0x10008000

make ts4900_defconfig

## Make any changes in "make menuconfig" or driver modifications, then compile
make -j8 all uImage zImage

# Compile wifi driver:
cd ../qcacld-2.0/
export KERNEL_SRC="../linux-tsimx6/"
make clean
CONFIG_CLD_HL_SDIO_CORE=y make -j8
INSTALL_MOD_PATH="$TEMPDIR" make modules_install

Generate a tar to overlay on your image with:

export TEMPDIR=$(mktemp -d)
mkdir "$TEMPDIR"/boot/
cp arch/arm/boot/uImage  "$TEMPDIR"/boot/uImage
cp arch/arm/boot/zImage  "$TEMPDIR"/boot/zImage
cp arch/arm/boot/dts/imx6*-ts*.dtb "$TEMPDIR"/boot/
INSTALL_MOD_PATH="$TEMPDIR" make modules_install 

fakeroot sh -c "chmod 755 $TEMPDIR;
	chown -R root:root $TEMPDIR;
	tar cjvf kernel.tar.bz2 -C $TEMPDIR .;
	rm -rvf $TEMPDIR";

This will generate a kernel.tar.bz2. This can be installed on the unit by copying it to a running board and executing: <source lang=bash>

  1. Only run this on your board, not on a workstation

tar -xf kernel.tar.bz2 -C / <source>

This can also be extracted over existing images, or removable media like SD cards mounted on the workstation. For example, assuming your SD card is /dev/sdc: <source lang=bash> mkdir /mnt/sd/ mount /dev/sdc1 /mnt/sd/ tar -xf kernel.tar.bz2 -C /mnt/sd/ umount /mnt/sd/ <source>

Change Kernel Splash Screen

The kernel splashscreen allow for a 224 color image, up to the full screen resolution. For the fastest boot speed, it should be kept as small as possible. The image will be centered around a black background.

To convert an image, for example, "mylogo.png":

convert mylogo.png mylogo.ppm
ppmquant 224 mylogo.ppm > mylogo-224.ppm
pnmnoraw mylogo-224.ppm > logo_user_clut224.ppm
cp logo_user_clut224.ppm <kernel build sources>/drivers/video/logo/

Recompile the kernel following the guide in the previous section to have the splashscreen appear on all future boots.

Add to the kernel cmdline in U-Boot, "logo.nologo" in order to completely disable the splash screen.