You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
9.3 KiB
210 lines
9.3 KiB
#!/bin/bash
|
|
# The script utilizes `sources_sync.sh` provided as
|
|
# part of NVidia SDK installer
|
|
|
|
echo -e "\e[32mThe script patches and applies in-tree kernel modules required for Librealsense SDK\e[0m"
|
|
set -e
|
|
|
|
#Locally suppress stderr to avoid raising not relevant messages
|
|
exec 3>&2
|
|
exec 2> /dev/null
|
|
con_dev=$(ls /dev/video* | wc -l)
|
|
exec 2>&3
|
|
|
|
if [ $con_dev -ne 0 ];
|
|
then
|
|
echo -e "\e[32m"
|
|
read -p "Remove all RealSense cameras attached. Hit any key when ready"
|
|
echo -e "\e[0m"
|
|
fi
|
|
|
|
#Include usability functions
|
|
source ./scripts/patch-utils.sh
|
|
|
|
# Get the required tools to build the patched modules
|
|
sudo apt-get install build-essential git libssl-dev -y
|
|
|
|
#Activate fan to prevent overheat during KM compilation
|
|
if [ -f /sys/devices/pwm-fan/target_pwm ]; then
|
|
echo 200 | sudo tee /sys/devices/pwm-fan/target_pwm || true
|
|
fi
|
|
|
|
#Tegra-specific
|
|
KERNEL_RELEASE="4.9"
|
|
#Identify the Jetson board
|
|
JETSON_BOARD=$(tr -d '\0' </proc/device-tree/model)
|
|
echo -e "\e[32mJetson Board (proc/device-tree/model): ${JETSON_BOARD}\e[0m"
|
|
|
|
JETSON_L4T=""
|
|
# With L4T 32.3.1, NVIDIA added back /etc/nv_tegra_release
|
|
if [ -f /etc/nv_tegra_release ]; then
|
|
JETSON_L4T_STRING=$(head -n 1 /etc/nv_tegra_release)
|
|
JETSON_L4T_RELEASE=$(echo $JETSON_L4T_STRING | cut -f 2 -d ' ' | grep -Po '(?<=R)[^;]+')
|
|
# Extract revision + trim trailing zeros to convert 32.5.0 => 32.5 to match git tags
|
|
JETSON_L4T_REVISION=$(echo $JETSON_L4T_STRING | cut -f 2 -d ',' | grep -Po '(?<=REVISION: )[^;]+' | sed 's/.0$//g')
|
|
JETSON_L4T_VERSION=$JETSON_L4T_RELEASE.$JETSON_L4T_REVISION
|
|
echo -e "\e[32mJetson L4T version: ${JETSON_L4T_VERSION}\e[0m"
|
|
else
|
|
echo -e "\e[41m/etc/nv_tegra_release not present, aborting script\e[0m"
|
|
exit;
|
|
fi
|
|
|
|
PATCHES_REV=""
|
|
#Select the kernel patches revision that matches the paltform configuration
|
|
case ${JETSON_L4T_VERSION} in
|
|
|
|
"32.2.1" | "32.2.3" | "32.3.1" | "32.4.3")
|
|
PATCHES_REV="4.4" # Baseline for the patches
|
|
echo -e "\e[32mNote: the patch makes changes to kernel device tree to support HID IMU sensors\e[0m"
|
|
;;
|
|
"32.4.4" | "32.5" | "32.5.1" | "32.6.1" | "32.7.1")
|
|
PATCHES_REV="4.4.1" # JP 4.4.1, 32.7.1 is JP 4.6.1
|
|
;;
|
|
"35.1")
|
|
PATCHES_REV="5.0.2" # JP 5.0.2
|
|
KERNEL_RELEASE="5.10"
|
|
;;
|
|
*)
|
|
echo -e "\e[41mUnsupported JetPack revision ${JETSON_L4T_VERSION} aborting script\e[0m"
|
|
exit;
|
|
;;
|
|
esac
|
|
echo -e "\e[32mL4T ${JETSON_L4T_VERSION} to use patches revision ${PATCHES_REV}\e[0m"
|
|
|
|
|
|
# Get the linux kernel repo, extract the L4T tag
|
|
echo -e "\e[32mRetrieve the corresponding L4T git tag the kernel source tree\e[0m"
|
|
l4t_gh_dir=../linux-${KERNEL_RELEASE}-source-tree
|
|
if [ ! -d ${l4t_gh_dir} ]; then
|
|
mkdir ${l4t_gh_dir}
|
|
pushd ${l4t_gh_dir}
|
|
git init
|
|
git remote add origin git://nv-tegra.nvidia.com/linux-${KERNEL_RELEASE}
|
|
# Use Nvidia script instead to synchronize source tree and peripherals
|
|
#git clone git://nv-tegra.nvidia.com/linux-${KERNEL_RELEASE}
|
|
popd
|
|
else
|
|
echo -e "Directory ${l4t_gh_dir} is present, skipping initialization...\e[0m"
|
|
fi
|
|
|
|
#Search the repository for the tag that matches the maj.min for L4T
|
|
pushd ${l4t_gh_dir}
|
|
TEGRA_TAG=$(git ls-remote --tags origin | grep ${JETSON_L4T_VERSION} | grep '[^^{}]$' | tail -n 1 | awk -F/ '{print $NF}')
|
|
echo -e "\e[32mThe matching L4T source tree tag is \e[47m${TEGRA_TAG}\e[0m"
|
|
popd
|
|
|
|
|
|
#Retrieve tegra tag version for sync, required for get and sync kernel source with Jetson:
|
|
#https://forums.developer.nvidia.com/t/r32-1-tx2-how-can-i-build-extra-module-in-the-tegra-device/72942/9
|
|
#Download kernel and peripheral sources as the L4T github repo is not self-contained to build kernel modules
|
|
sdk_dir=$(pwd)
|
|
echo -e "\e[32mCreate the sandbox - NVidia L4T source tree(s)\e[0m"
|
|
mkdir -p ${sdk_dir}/Tegra
|
|
TEGRA_SOURCE_SYNC_SH="source_sync.sh"
|
|
if [ "5.0.2" = "$PATCHES_REV" ]; then
|
|
TEGRA_SOURCE_SYNC_SH="source_sync_5.0.2.sh"
|
|
fi
|
|
cp ./scripts/Tegra/$TEGRA_SOURCE_SYNC_SH ${sdk_dir}/Tegra
|
|
#Download NVidia source, disregard errors on module tag sync
|
|
./Tegra/$TEGRA_SOURCE_SYNC_SH -k ${TEGRA_TAG} || true
|
|
KBASE=./Tegra/sources/kernel/kernel-$KERNEL_RELEASE
|
|
echo ${KBASE}
|
|
pushd ${KBASE}
|
|
|
|
echo -e "\e[32mCopy LibRealSense patches to the sandbox\e[0m"
|
|
L4T_Patches_Dir=${sdk_dir}/scripts/Tegra/LRS_Patches/
|
|
if [ ! -d ${L4T_Patches_Dir} ]; then
|
|
echo -e "\e[41mThe L4T kernel patches directory ${L4T_Patches_Dir} was not found, aborting\e[0m"
|
|
exit 1
|
|
else
|
|
cp -r ${L4T_Patches_Dir} .
|
|
fi
|
|
|
|
#Clean the kernel WS
|
|
echo -e "\e[32mPrepare workspace for kernel build\e[0m"
|
|
make ARCH=arm64 mrproper -j$(($(nproc)-1)) && make ARCH=arm64 tegra_defconfig -j$(($(nproc)-1))
|
|
|
|
#Reuse existing module.symver
|
|
kernel_ver=`uname -r`
|
|
LINUX_HEADERS_NAME="linux-headers-${kernel_ver}-ubuntu18.04_aarch64"
|
|
if [ "5.0.2" = "$PATCHES_REV" ]; then
|
|
LINUX_HEADERS_NAME="linux-headers-${kernel_ver}-ubuntu20.04_aarch64"
|
|
fi
|
|
cp /usr/src/$LINUX_HEADERS_NAME/kernel-$KERNEL_RELEASE/Module.symvers .
|
|
cp /usr/src/$LINUX_HEADERS_NAME/kernel-$KERNEL_RELEASE/Makefile .
|
|
|
|
#Jetpack prior to 4.4.1 requires manual reconfiguration of kernel
|
|
if [ "4.4" = "$PATCHES_REV" ]; then
|
|
echo -e "\e[32mUpdate the kernel tree to support HID IMU sensors\e[0m"
|
|
sed -i '/CONFIG_HID_SENSOR_ACCEL_3D/c\CONFIG_HID_SENSOR_ACCEL_3D=m' .config
|
|
sed -i '/CONFIG_HID_SENSOR_GYRO_3D/c\CONFIG_HID_SENSOR_GYRO_3D=m' .config
|
|
sed -i '/CONFIG_HID_SENSOR_IIO_COMMON/c\CONFIG_HID_SENSOR_IIO_COMMON=m\nCONFIG_HID_SENSOR_IIO_TRIGGER=m' .config
|
|
fi
|
|
make ARCH=arm64 prepare modules_prepare LOCALVERSION='' -j$(($(nproc)-1))
|
|
|
|
#Remove previously applied patches
|
|
git reset --hard
|
|
echo -e "\e[32mApply Librealsense Kernel Patches\e[0m"
|
|
patch -p1 < ./LRS_Patches/01-realsense-camera-formats-L4T-${PATCHES_REV}.patch
|
|
patch -p1 < ./LRS_Patches/02-realsense-metadata-L4T-${PATCHES_REV}.patch
|
|
if [ "4.4" = "$PATCHES_REV" ]; then # for Jetpack 4.4 and older
|
|
patch -p1 < ./LRS_Patches/03-realsense-hid-L4T-4.9.patch
|
|
fi
|
|
if [ "5.0.2" != "$PATCHES_REV" ]; then
|
|
patch -p1 < ./LRS_Patches/04-media-uvcvideo-mark-buffer-error-where-overflow.patch
|
|
fi
|
|
patch -p1 < ./LRS_Patches/05-realsense-powerlinefrequency-control-fix.patch
|
|
|
|
echo -e "\e[32mCompiling uvcvideo kernel module\e[0m"
|
|
#sudo -s make -j -C $KBASE M=$KBASE/drivers/media/usb/uvc/ modules
|
|
make -j$(($(nproc)-1)) ARCH=arm64 M=drivers/media/usb/uvc/ modules
|
|
echo -e "\e[32mCompiling v4l2-core modules\e[0m"
|
|
#sudo -s make -j -C $KBASE M=$KBASE/drivers/media/v4l2-core modules
|
|
make -j$(($(nproc)-1)) ARCH=arm64 M=drivers/media/v4l2-core modules
|
|
if [ "4.4" = "$PATCHES_REV" ]; then # for Jetpack 4.4 and older
|
|
echo -e "\e[32mCompiling accelerometer and gyro modules\e[0m"
|
|
make -j$(($(nproc)-1)) ARCH=arm64 M=drivers/iio modules
|
|
fi
|
|
|
|
echo -e "\e[32mCopying the patched modules to (~/) \e[0m"
|
|
sudo cp drivers/media/usb/uvc/uvcvideo.ko ~/${TEGRA_TAG}-uvcvideo.ko
|
|
sudo cp drivers/media/v4l2-core/videobuf-vmalloc.ko ~/${TEGRA_TAG}-videobuf-vmalloc.ko
|
|
sudo cp drivers/media/v4l2-core/videobuf-core.ko ~/${TEGRA_TAG}-videobuf-core.ko
|
|
if [ "4.4" = "$PATCHES_REV" ]; then # for Jetpack 4.4 and older
|
|
sudo cp drivers/iio/common/hid-sensors/hid-sensor-iio-common.ko ~/${TEGRA_TAG}-hid-sensor-iio-common.ko
|
|
sudo cp drivers/iio/common/hid-sensors/hid-sensor-trigger.ko ~/${TEGRA_TAG}-hid-sensor-trigger.ko
|
|
sudo cp drivers/iio/accel/hid-sensor-accel-3d.ko ~/${TEGRA_TAG}-hid-sensor-accel-3d.ko
|
|
sudo cp drivers/iio/gyro/hid-sensor-gyro-3d.ko ~/${TEGRA_TAG}-hid-sensor-gyro-3d.ko
|
|
fi
|
|
popd
|
|
|
|
echo -e "\e[32mMove the modified modules into the modules tree\e[0m"
|
|
if [ "4.4" = "$PATCHES_REV" ]; then # for Jetpack 4.4 and older
|
|
#Optional - create kernel modules directories in kernel tree
|
|
sudo mkdir -p /lib/modules/`uname -r`/kernel/drivers/iio/accel
|
|
sudo mkdir -p /lib/modules/`uname -r`/kernel/drivers/iio/gyro
|
|
sudo mkdir -p /lib/modules/`uname -r`/kernel/drivers/iio/common/hid-sensors
|
|
sudo cp ~/${TEGRA_TAG}-hid-sensor-accel-3d.ko /lib/modules/`uname -r`/kernel/drivers/iio/accel/hid-sensor-accel-3d.ko
|
|
sudo cp ~/${TEGRA_TAG}-hid-sensor-gyro-3d.ko /lib/modules/`uname -r`/kernel/drivers/iio/gyro/hid-sensor-gyro-3d.ko
|
|
sudo cp ~/${TEGRA_TAG}-hid-sensor-iio-common.ko /lib/modules/`uname -r`/kernel/drivers/iio/common/hid-sensors/hid-sensor-iio-common.ko
|
|
sudo cp ~/${TEGRA_TAG}-hid-sensor-trigger.ko /lib/modules/`uname -r`/kernel/drivers/iio/common/hid-sensors/hid-sensor-trigger.ko
|
|
fi
|
|
|
|
# update kernel module dependencies
|
|
sudo depmod
|
|
|
|
echo -e "\e[32mInsert the modified kernel modules\e[0m"
|
|
try_module_insert uvcvideo ~/${TEGRA_TAG}-uvcvideo.ko /lib/modules/`uname -r`/kernel/drivers/media/usb/uvc/uvcvideo.ko
|
|
if [ "4.4" = "$PATCHES_REV" ]; then # for Jetpack 4.4 and older
|
|
try_module_insert hid_sensor_accel_3d ~/${TEGRA_TAG}-hid-sensor-accel-3d.ko /lib/modules/`uname -r`/kernel/drivers/iio/accel/hid-sensor-accel-3d.ko
|
|
try_module_insert hid_sensor_gyro_3d ~/${TEGRA_TAG}-hid-sensor-gyro-3d.ko /lib/modules/`uname -r`/kernel/drivers/iio/gyro/hid-sensor-gyro-3d.ko
|
|
#Preventively unload all HID-related modules
|
|
try_unload_module hid_sensor_accel_3d
|
|
try_unload_module hid_sensor_gyro_3d
|
|
try_unload_module hid_sensor_trigger
|
|
try_unload_module hid_sensor_trigger
|
|
try_module_insert hid_sensor_trigger ~/${TEGRA_TAG}-hid-sensor-trigger.ko /lib/modules/`uname -r`/kernel/drivers/iio/common/hid-sensors/hid-sensor-trigger.ko
|
|
try_module_insert hid_sensor_iio_common ~/${TEGRA_TAG}-hid-sensor-iio-common.ko /lib/modules/`uname -r`/kernel/drivers/iio/common/hid-sensors/hid-sensor-iio-common.ko
|
|
fi
|
|
echo -e "\e[92m\n\e[1mScript has completed. Please consult the installation guide for further instruction.\n\e[0m"
|