Go to file
Alex Davies 1b97851c82 Use proper kernel name. 2024-02-02 17:13:27 -04:00
.github/workflows More minor tweaks to github workflows 2024-02-02 13:30:00 -04:00
CTI-L4T@af2e8ef832 Update submodules commits 2021-02-11 19:01:20 -06:00
doc documentation: Add architecture diagram 2021-02-19 23:00:33 -06:00
source Use proper kernel name. 2024-02-02 17:13:27 -04:00
.dockerignore Building in a docker container for easy linking to tx2-rootfs 2024-02-02 12:39:51 -04:00
.gitmodules Update submodules to follow Master 2021-03-17 17:02:40 -06:00
Dockerfile Use proper kernel name. 2024-02-02 17:13:27 -04:00
README.md Bumped readme to trigger a build, sorry 2024-02-02 12:42:09 -04:00
extlinux.conf Building in a docker container for easy linking to tx2-rootfs 2024-02-02 12:39:51 -04:00


The installation consists on creating a build area locatated at:


From this directory you might call the targets tegra_defconfig, dtbs, Image, modules to compile the Kernel. Please, add your projects under builds/.

The Make targets gets sourced from the source/ directory on the Jetpack workspace root, which is where this project Kernel sources are installed.

  • The -C flag for the make allows to change the directory where the Kernel source is.
  • The -O stands for the output of the build process files.
  • CROSS_COMPILE=${CROSS_COMPILE}, passes the C cross compiler. The recomended for this CTI release it's /opt/gcc-linaro-7.3.1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-.
  • The -jNis the flag for the parallel jobs to build with. You can find it out at your host with the command nproc.

1. Download the Toolchain for crosscompiling

wget http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz
sudo tar xf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz -C /opt/gcc-linaro-7.3.1/

echo "export CROSS_COMPILE=/opt/gcc-linaro-7.3.1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-" >> ~/.bashrc

source ~/.bashrc

2. Clone recursively the repository to the workspace's root to add the Jetpack+CTI 4.4.1 and Drivers MT9M021 and EG25-G

LINUX_FOR_TEGRA=<Linux_for_Tegra/ path>


git clone --recurse-submodules  https://git.spirirobotics.com/dchvs/spiri-project.git
cd spiri-project

git checkout master
git submodule update --init --recursive --remote

3. Install the CTI BSP

cd CTI-L4T/
sudo ./install.sh

4. Build the Spiri cameras project Kernel


mkdir -p builds/build_<this build name> && cd builds/build_<this build name>
mkdir build

# Create the Kernel configuration file
make -C $KERNEL_LOCATION ARCH=arm64 O=$PWD/build/ tegra_defconfig
# Check for the Drivers with the "spiri" keyword
make -C $KERNEL_LOCATION ARCH=arm64 O=$PWD/build/ menuconfig

By default the Drivers are installed, the tegra_defconfig include them as: CONFIG_VIDEO_I2C_SPIRI_CAM=y CONFIG_VIDEO_I2C_SPIRI_GSM=y You can review it on the Kernel Menuconfig, and find it out in the following paths:

+----------------+     +--------------------+     +-------------------------------------------------------------------+     +-------------------------------------+
| Device Drivers | --> | Multimedia support | --> | NVIDIA overlay Encoders, decoders, sensors and other helper chips | --> | Spiri MT9M021 camera sensor support |
+----------------+     +--------------------+     +-------------------------------------------------------------------+     +-------------------------------------+

+----------------+     +------------------------+     +----------------------+     +----------------------+
| Device Drivers | --> | Network device support | --> | USB Network Adapters | --> | USB Network Adapters |
+----------------+     +------------------------+     +----------------------+     +----------------------+
# Build the Kernel, DTBs and modules
make -C $KERNEL_LOCATION ARCH=arm64 O=$PWD/build/ CROSS_COMPILE=${CROSS_COMPILE} -j8 --output-sync=target zImage dtbs modules

The deployed Kernel binaries after compilation could check if it has the Drivers in it, inspecting on it with rgrep:

rgrep mt9m021 build/arch/arm64/boot/Image
rgrep eg25-g build/arch/arm64/boot/Image

5. Flash the Spiri Mu

Once the Kernel it's compiled, the output binaries should get installed on the Jetpack workspace, letting the flash scripts deploy them into the target device. The update for the flash scripts deployment it's ilustrated as follows:

# Location for the Kernel files to be found by Tegra flash.sh script in full image installation
+------------------------------------+     +---------------------+
|    build/arch/arm64/boot/Image     | --> |     kernel/Image    |
+------------------------------------+     +---------------------+
+------------------------------------+     +---------------------+
|    build/arch/arm64/boot/dts/*     | --> |     kernel/dtb/     |
+------------------------------------+     +---------------------+
+------------------------------------+     +---------------------+
| modules/lib/modules/4.9.140-tegra/ | --> | rootfs/lib/modules/ |
+------------------------------------+     +---------------------+
# Add the Kernel files for full image installation

# Install the Kernel Image and DTBs
make -C $KERNEL_LOCATION ARCH=arm64 O=$PWD/build/ kernel_install INSTALL_PATH=$PWD/../../kernel/

# Install the Drivers modules
sudo make -C $KERNEL_LOCATION ARCH=arm64 O=$PWD/build/ modules_install INSTALL_MOD_PATH=$PWD/../../rootfs/

In order to flash the target device, do the following commands from the workspace's root:


# Full OS installation 
sudo ./flash.sh jetson-tx2 mmcblk0p1

# Device tree installation
sudo ./flash.sh -r -k kernel-dtb -d kernel/dtb/tegra186-tx2-spiri-revF+.dtb jetson-tx2 mmcblk0p1

# Kernel image installation
sudo ./flash.sh -r -k kernel -K kernel/Image jetson-tx2 mmcblk0p1