Skip to content

Instantly share code, notes, and snippets.

@dudo
Last active June 27, 2024 11:25
Show Gist options
  • Save dudo/7d853fd54f2d3db6e5e44b8b59ae12d5 to your computer and use it in GitHub Desktop.
Save dudo/7d853fd54f2d3db6e5e44b8b59ae12d5 to your computer and use it in GitHub Desktop.
Updating Kernel of Nvidia Jetson
#!/bin/bash
# Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of NVIDIA CORPORATION nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# This script builds kernel sources in this directory.
# Usage: ./${SCRIPT_NAME}.sh [OPTIONS]
set -e
# shellcheck disable=SC2046
SCRIPT_DIR="$(dirname $(readlink -f "${0}"))"
SCRIPT_NAME="$(basename "${0}")"
source "${SCRIPT_DIR}/nvcommon_build.sh"
function usage {
cat <<EOM
Usage: ./${SCRIPT_NAME} [OPTIONS]
This script builds kernel sources in this directory.
It supports following options.
OPTIONS:
-h Displays this help
-o <outdir> Creates kernel build output in <outdir>
-s <suffix> Appends <suffix> to the kernel image name, e.g. -tegra-<suffix>
EOM
}
# parse input parameters
function parse_input_param {
while [ $# -gt 0 ]; do
case ${1} in
-h)
usage
exit 0
;;
-o)
KERNEL_OUT_DIR="${2}"
shift 2
;;
-s)
LOCALVERSION_SUFFIX="-${2}"
shift 2
;;
*)
echo "Error: Invalid option ${1}"
usage
exit 1
;;
esac
done
}
function build_arm64_kernel_sources {
kernel_version="${1}"
local_version="-tegra${LOCALVERSION_SUFFIX}"
echo "Building kernel-${kernel_version}${local_version} sources"
# execute building steps
source_dir="${SCRIPT_DIR}/kernel/kernel-${kernel_version}/"
config_file="tegra_defconfig"
editor="nconfig"
tegra_kernel_out="${source_dir}"
# shellcheck disable=SC2236
if [ ! -z "${KERNEL_OUT_DIR}" ]; then
tegra_kernel_out="${KERNEL_OUT_DIR}/"
O_OPT=(O="${tegra_kernel_out}")
else
O_OPT=()
fi
tegra_modules_out="${tegra_kernel_out}/lib/modules/"
"${MAKE_BIN}" -C "${source_dir}" ARCH=arm64 \
LOCALVERSION="${local_version}" \
CROSS_COMPILE="${CROSS_COMPILE_AARCH64}" \
"${O_OPT[@]}" "${config_file}"
"${MAKE_BIN}" -C "${source_dir}" ARCH=arm64 \
LOCALVERSION="${local_version}" \
CROSS_COMPILE="${CROSS_COMPILE_AARCH64}" \
"${O_OPT[@]}" "${editor}"
"${MAKE_BIN}" -C "${source_dir}" ARCH=arm64 \
LOCALVERSION="${local_version}" \
CROSS_COMPILE="${CROSS_COMPILE_AARCH64}" \
"${O_OPT[@]}" -j"${NPROC}" \
--output-sync=target Image
"${MAKE_BIN}" -C "${source_dir}" ARCH=arm64 \
LOCALVERSION="${local_version}" \
CROSS_COMPILE="${CROSS_COMPILE_AARCH64}" \
"${O_OPT[@]}" -j"${NPROC}" \
--output-sync=target dtbs
"${MAKE_BIN}" -C "${source_dir}" ARCH=arm64 \
LOCALVERSION="${local_version}" \
CROSS_COMPILE="${CROSS_COMPILE_AARCH64}" \
"${O_OPT[@]}" -j"${NPROC}" \
--output-sync=target modules
"${MAKE_BIN}" -C "${source_dir}" ARCH=arm64 \
LOCALVERSION="${local_version}" \
CROSS_COMPILE="${CROSS_COMPILE_AARCH64}" \
"${O_OPT[@]}" INSTALL_MOD_PATH="${tegra_kernel_out}" -j"${NPROC}" \
--output-sync=target modules_install
echo -e "\n"
modules_directory=$(ls -A ${tegra_modules_out})
if [ -z "$modules_directory" ]; then
echo "Error: Missing module directory in ${tegra_modules_out}"
exit 1
else
echo "Module directory located at ${tegra_modules_out}/${modules_directory}"
fi
image="${tegra_kernel_out}/arch/arm64/boot/Image"
if [ ! -f "${image}" ]; then
echo "Error: Missing kernel image ${image}"
exit 1
else
echo "Kernel image located at ${image}"
fi
echo -e "\nKernel sources compiled successfully."
}
# shellcheck disable=SC2068
parse_input_param $@
# Compile kernel sources for "arm64"
build_arm64_kernel_sources "5.10"

The license on this file makes me nervous. It can be found here.

  • Look for "Driver Package (BSP) Sources", download, and extract. This will provide a ./Linux_for_Tegra directory.
  • Extract ./Linux_for_Tegra/source/public/kernel_src.tbz2 to obtain the following scripts:
    • ./Linux_for_Tegra/source/public/kernel_src/nvbuild.sh
      • A modified copy of this script is provided within this Gist
    • ./Linux_for_Tegra/source/public/kernel_src/nvcommon_build.sh
      • nvbuild.sh depends on this script, so keep it in the same directory
#!/bin/bash
# Copyright (c) 2012-2022 NVIDIA CORPORATION. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of NVIDIA CORPORATION nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# This script sync's NVIDIA's version of
# 1. the kernel source
# from nv-tegra, NVIDIA's public git repository.
# The script also provides opportunities to the sync to a specific tag
# so that the binaries shipped with a release can be replicated.
#
# Usage:
# By default it will download all the listed sources
# ./source_sync.sh
# Use the -t <TAG> option to provide the TAG to be used to sync all the sources.
# Use the -k <TAG> option to download only the kernel and device tree repos and optionally sync to TAG
# For detailed usage information run with -h option.
#
# verify that git is installed
if ! which git > /dev/null ; then
echo "ERROR: git is not installed. If your linux distro is 10.04 or later,"
echo "git can be installed by 'sudo apt-get install git-core'."
exit 1
fi
# source dir
LDK_DIR=$(cd `dirname $0` && pwd)
LDK_DIR="${LDK_DIR}/sources"
# script name
SCRIPT_NAME=`basename $0`
# info about sources.
# NOTE: *Add only kernel repos here. Add new repos separately below. Keep related repos together*
# NOTE: nvethrnetrm.git should be listed after "linux-nvidia.git" due to nesting of sync path
SOURCE_INFO="
k:kernel/kernel-5.10:nv-tegra.nvidia.com/linux-5.10.git:
k:kernel/nvgpu:nv-tegra.nvidia.com/linux-nvgpu.git:
k:kernel/nvidia:nv-tegra.nvidia.com/linux-nvidia.git:
k:kernel/nvidia/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm:nv-tegra.nvidia.com/kernel/nvethernetrm.git:
k:hardware/nvidia/platform/tegra/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/tegra/common.git:
k:hardware/nvidia/soc/t19x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t19x.git:
k:hardware/nvidia/platform/t19x/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/common.git:
k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/stardust-dts.git:
k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/jakku-dts.git:
k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/mccoy-dts.git:
k:hardware/nvidia/platform/t19x/galen-industrial/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git:
k:hardware/nvidia/platform/t23x/common/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/common-dts.git:
k:hardware/nvidia/platform/t23x/concord/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/concord-dts.git:
k:hardware/nvidia/soc/t23x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t23x.git:
k:hardware/nvidia/soc/tegra:nv-tegra.nvidia.com/device/hardware/nvidia/soc/tegra.git:
k:tegra/kernel-src/nv-kernel-display-driver:nv-tegra.nvidia.com/tegra/kernel-src/nv-kernel-display-driver.git:
o:3rdparty/libnl/3.5.0:nv-tegra.nvidia.com/3rdparty/libnl/3.5.0.git:
o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra.nvidia.com/tegra/cuda-src/nvsample_cudaprocess.git:
o:tegra/gfx-src/nv-xconfig:nv-tegra.nvidia.com/tegra/gfx-src/nv-xconfig.git:
o:tegra/gst-src/gst-egl:nv-tegra.nvidia.com/tegra/gst-src/gst-egl.git:
o:tegra/gst-src/gst-jpeg:nv-tegra.nvidia.com/tegra/gst-src/gst-jpeg.git:
o:tegra/gst-src/gst-nvarguscamera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvarguscamera.git:
o:tegra/gst-src/gst-nvcompositor:nv-tegra.nvidia.com/tegra/gst-src/gst-nvcompositor.git:
o:tegra/gst-src/gst-nvtee:nv-tegra.nvidia.com/tegra/gst-src/gst-nvtee.git:
o:tegra/gst-src/gst-nvv4l2camera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvv4l2camera.git:
o:tegra/gst-src/gst-nvvidconv:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvidconv.git:
o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvideo4linux2.git:
o:tegra/gst-src/nvgstapps:nv-tegra.nvidia.com/tegra/gst-src/nvgstapps.git:
o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra.nvidia.com/tegra/gst-src/libgstnvdrmvideosink.git:
o:tegra/gst-src/libgstnvvideosinks:nv-tegra.nvidia.com/tegra/gst-src/libgstnvvideosinks.git:
o:tegra/gst-src/libnvgstreamer:nv-tegra.nvidia.com/tegra/gst-src/libnvgstreamer.git:
o:tegra/nv-sci-src/nvsci_headers:nv-tegra.nvidia.com/tegra/nv-sci-src/nvsci_headers.git:
o:tegra/optee-src/atf:nv-tegra.nvidia.com/tegra/optee-src/atf.git:
o:tegra/optee-src/nv-optee:nv-tegra.nvidia.com/tegra/optee-src/nv-optee.git:
o:tegra/v4l2-src/v4l2_libs:nv-tegra.nvidia.com/tegra/v4l2-src/v4l2_libs.git:
"
# exit on error on sync
EOE=0
# after processing SOURCE_INFO
NSOURCES=0
declare -a SOURCE_INFO_PROCESSED
# download all?
DALL=1
function Usages {
local ScriptName=$1
local LINE
local OP
local DESC
local PROCESSED=()
local i
echo "Use: $1 [options]"
echo "Available general options are,"
echo " -h : help"
echo " -e : exit on sync error"
echo " -d [DIR] : root of source is DIR"
echo " -t [TAG] : Git tag that will be used to sync all the sources"
echo ""
echo "By default, all sources are downloaded."
echo "Only specified sources are downloaded, if one or more of the following options are mentioned."
echo ""
echo "$SOURCE_INFO" | while read LINE; do
if [ ! -z "$LINE" ]; then
OP=$(echo "$LINE" | cut -f 1 -d ':')
DESC=$(echo "$LINE" | cut -f 2 -d ':')
if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then
echo " -${OP} [TAG]: Download $DESC source and optionally sync to TAG"
PROCESSED+=("${OP}")
else
echo " and download $DESC source and sync to the same TAG"
fi
fi
done
echo ""
}
function ProcessSwitch {
local SWITCH="$1"
local TAG="$2"
local i
local found=0
for ((i=0; i < NSOURCES; i++)); do
local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':')
if [ "-${OP}" == "$SWITCH" ]; then
SOURCE_INFO_PROCESSED[i]="${SOURCE_INFO_PROCESSED[i]}${TAG}:y"
DALL=0
found=1
fi
done
if [ "$found" == 1 ]; then
return 0
fi
echo "Terminating... wrong switch: ${SWITCH}" >&2
Usages "$SCRIPT_NAME"
exit 1
}
function UpdateTags {
local SWITCH="$1"
local TAG="$2"
local i
for ((i=0; i < NSOURCES; i++)); do
local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':')
if [ "${OP}" == "$SWITCH" ]; then
SOURCE_INFO_PROCESSED[i]=$(echo "${SOURCE_INFO_PROCESSED[i]}" \
| awk -F: -v OFS=: -v var="${TAG}" '{$4=var; print}')
fi
done
}
function DownloadAndSync {
local WHAT_SOURCE="$1"
local LDK_SOURCE_DIR="$2"
local REPO_URL="$3"
local TAG="$4"
local OPT="$5"
local RET=0
if [ -d "${LDK_SOURCE_DIR}" ]; then
echo "Directory for $WHAT, ${LDK_SOURCE_DIR}, already exists!"
pushd "${LDK_SOURCE_DIR}" > /dev/null
git status 2>&1 >/dev/null
if [ $? -ne 0 ]; then
echo "But the directory is not a git repository -- clean it up first"
echo ""
echo ""
popd > /dev/null
return 1
fi
git fetch --all 2>&1 >/dev/null
popd > /dev/null
else
echo "Downloading default $WHAT source..."
git clone "$REPO_URL" -n ${LDK_SOURCE_DIR} 2>&1 >/dev/null
if [ $? -ne 0 ]; then
echo "$2 source sync failed!"
echo ""
echo ""
return 1
fi
echo "The default $WHAT source is downloaded in: ${LDK_SOURCE_DIR}"
fi
if [ -z "$TAG" ]; then
echo "Please enter a tag to sync $2 source to"
echo -n "(enter nothing to skip): "
read TAG
TAG=$(echo $TAG)
UpdateTags $OPT $TAG
fi
if [ ! -z "$TAG" ]; then
pushd ${LDK_SOURCE_DIR} > /dev/null
git tag -l 2>/dev/null | grep -q -P "^$TAG\$"
if [ $? -eq 0 ]; then
echo "Syncing up with tag $TAG..."
git checkout -b mybranch_$(date +%Y-%m-%d-%s) $TAG
echo "$2 source sync'ed to tag $TAG successfully!"
else
echo "Couldn't find tag $TAG"
echo "$2 source sync to tag $TAG failed!"
RET=1
fi
popd > /dev/null
fi
echo ""
echo ""
return "$RET"
}
# prepare processing ....
GETOPT=":ehd:t:"
OIFS="$IFS"
IFS=$(echo -en "\n\b")
SOURCE_INFO_PROCESSED=($(echo "$SOURCE_INFO"))
IFS="$OIFS"
NSOURCES=${#SOURCE_INFO_PROCESSED[*]}
for ((i=0; i < NSOURCES; i++)); do
OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':')
GETOPT="${GETOPT}${OP}:"
done
# parse the command line first
while getopts "$GETOPT" opt; do
case $opt in
d)
case $OPTARG in
-[A-Za-z]*)
Usages "$SCRIPT_NAME"
exit 1
;;
*)
LDK_DIR="$OPTARG"
;;
esac
;;
e)
EOE=1
;;
h)
Usages "$SCRIPT_NAME"
exit 1
;;
t)
TAG="$OPTARG"
PROCESSED=()
for ((i=0; i < NSOURCES; i++)); do
OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':')
if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then
UpdateTags $OP $TAG
PROCESSED+=("${OP}")
fi
done
;;
[A-Za-z])
case $OPTARG in
-[A-Za-z]*)
eval arg=\$$((OPTIND-1))
case $arg in
-[A-Za-Z]-*)
Usages "$SCRIPT_NAME"
exit 1
;;
*)
ProcessSwitch "-$opt" ""
OPTIND=$((OPTIND-1))
;;
esac
;;
*)
ProcessSwitch "-$opt" "$OPTARG"
;;
esac
;;
:)
case $OPTARG in
#required arguments
d)
Usages "$SCRIPT_NAME"
exit 1
;;
#optional arguments
[A-Za-z])
ProcessSwitch "-$OPTARG" ""
;;
esac
;;
\?)
echo "Terminating... wrong switch: $@" >&2
Usages "$SCRIPT_NAME"
exit 1
;;
esac
done
shift $((OPTIND-1))
GRET=0
for ((i=0; i < NSOURCES; i++)); do
OPT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':')
WHAT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 2 -d ':')
REPO=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 3 -d ':')
TAG=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 4 -d ':')
DNLOAD=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 5 -d ':')
if [ $DALL -eq 1 -o "x${DNLOAD}" == "xy" ]; then
DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "git://${REPO}" "${TAG}" "${OPT}"
tRET=$?
let GRET=GRET+tRET
if [ $tRET -ne 0 -a $EOE -eq 1 ]; then
exit $tRET
fi
fi
done
exit $GRET
@fentonfentonfenton
Copy link

Will this work on a jetson nano 4gb ?

Unfortunately not, it's very specific

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment