-
Notifications
You must be signed in to change notification settings - Fork 4.8k
/
Copy pathpatch-realsense-ubuntu-lts.sh
executable file
·314 lines (274 loc) · 13.6 KB
/
patch-realsense-ubuntu-lts.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
#!/bin/bash
#Break execution on any error received
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
#Parse user inputs
reset_driver=0
xhci_patch=0
build_usbcore_modules=0
rebuild_ko=0
debug_uvc=0
retpoline_retrofit=0
#Parse input
while test $# -gt 0; do
case "$1" in
--help)
;&
-h)
echo "Parse user-provided flags"
echo "[Flag] [Operation]"
echo " "
echo "options:"
echo "-h, --help Show script activation flags"
echo "reset Remove custom kernel patches and rebuild ko with Ubuntu stock driver"
echo "xhci-patch Rebuild XHCI host controller modules to retrofit kernel fixes. Applicable for Kernel 4.4 only"
echo "build_usbcore_modules Rebuilds usbcore/usbhost kernel modules"
echo "ko Rebuild modified kernel modules w/o modifying the source tree"
echo "uvc_dbg Add profyling messages to uvcvideo and videobuf2 modules"
exit 0
;;
reset)
reset_driver=1; shift;;
build_usbcore_modules)
build_usbcore_modules=1 ;& # fallthrough: usbcore implies xhci
xhci-patch)
xhci_patch=1; shift ;;
ko)
rebuild_ko=1; shift ;;
uvc_dbg)
debug_uvc=1; shift ;;
*)
echo -e "\e[36mUnrecognized flag: $1\e[0m"; shift;;
esac
done
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 and headers to build the kernel
sudo apt-get install linux-headers-generic build-essential git bc -y
#Packages to build the patched modules
require_package libusb-1.0-0-dev
require_package libssl-dev
LINUX_BRANCH=$(uname -r)
#Get kernel major.minor
IFS='.' read -a kernel_version <<< ${LINUX_BRANCH}
k_maj_min=$((${kernel_version[0]}*100 + ${kernel_version[1]}))
if [[ ( ${xhci_patch} -eq 1 ) && ( ${k_maj_min} -ne 404 ) ]]; then
echo -e "\e[43mThe xhci_patch flag is compatible with LTS branch 4.4 only, currently selected kernel is $(uname -r)\e[0m"
exit 1
fi
# Construct branch name from distribution codename {xenial,bionic,..} and kernel version
ubuntu_codename=`. /etc/os-release; echo ${UBUNTU_CODENAME/*, /}`
if [ -z "${ubuntu_codename}" ];
then
# Trusty Tahr shall use xenial code base
ubuntu_codename="xenial"
retpoline_retrofit=1
fi
kernel_branch=$(choose_kernel_branch ${LINUX_BRANCH} ${ubuntu_codename})
kernel_name="ubuntu-${ubuntu_codename}-$kernel_branch"
echo -e "\e[32mCreate patches workspace in \e[93m${kernel_name} \e[32mfolder\n\e[0m"
#Distribution-specific packages
if { [ ${ubuntu_codename} == "bionic" ] || [ ${ubuntu_codename} == "focal" ]; } ;
then
require_package libelf-dev
require_package elfutils
#Ubuntu 18.04 kernel 4.18 + 20.04/ 5.4
require_package bison
require_package flex
fi
# Get the linux kernel and change into source tree
if [ ! -d ${kernel_name} ]; then
mkdir ${kernel_name}
cd ${kernel_name}
git init
git remote add origin https://kernel.ubuntu.com/ubuntu/ubuntu-${ubuntu_codename}.git
cd ..
fi
cd ${kernel_name}
if [ $rebuild_ko -eq 0 ];
then
#Search the repository for the tag that matches the mmaj.min.patch-build of Ubuntu kernel
kernel_full_num=$(echo $LINUX_BRANCH | cut -d '-' -f 1,2)
kernel_git_tag=$(git ls-remote --tags origin | grep "${kernel_full_num}\." | grep '[^^{}]$' | tail -n 1 | awk -F/ '{print $NF}')
echo -e "\e[32mFetching Ubuntu LTS tag \e[47m${kernel_git_tag}\e[0m \e[32m to the local kernel sources folder\e[0m"
git fetch origin tag ${kernel_git_tag} --no-tags --depth 1
# Verify that there are no trailing changes., warn the user to make corrective action if needed
if [ $(git status | grep 'modified:' | wc -l) -ne 0 ];
then
echo -e "\e[36mThe kernel has modified files:\e[0m"
git status | grep 'modified:'
echo -e "\e[36mProceeding will reset all local kernel changes. Press 'n' within 3 seconds to abort the operation"
set +e
read -n 1 -t 3 -r -p "Do you want to proceed? [Y/n]" response
set -e
response=${response,,} # tolower
if [[ $response =~ ^(n|N)$ ]];
then
echo -e "\e[41mScript has been aborted on user requiest. Please resolve the modified files are rerun\e[0m"
exit 1
else
echo -e "\e[0m"
printf "Resetting local changes in %s folder\n " ${kernel_name}
git reset --hard
fi
fi
echo -e "\e[32mSwitching to LTS tag ${kernel_git_tag}\e[0m"
git checkout ${kernel_git_tag}
if [ $reset_driver -eq 1 ];
then
echo -e "\e[43mUser requested to rebuild and reinstall ubuntu-${ubuntu_codename} stock drivers\e[0m"
else
# Patching kernel for RealSense devices
echo -e "\e[32mApplying patches for \e[36m${ubuntu_codename}-${kernel_branch}\e[32m line\e[0m"
echo -e "\e[32mApplying realsense-uvc patch\e[0m"
patch -p1 < ../scripts/realsense-camera-formats-${ubuntu_codename}-${kernel_branch}.patch || patch -p1 < ../scripts/realsense-camera-formats-${ubuntu_codename}-master.patch
echo -e "\e[32mApplying realsense-metadata patch\e[0m"
patch -p1 < ../scripts/realsense-metadata-${ubuntu_codename}-${kernel_branch}.patch || patch -p1 < ../scripts/realsense-metadata-${ubuntu_codename}-master.patch
echo -e "\e[32mApplying realsense-hid patch\e[0m"
patch -p1 < ../scripts/realsense-hid-${ubuntu_codename}-${kernel_branch}.patch || patch -p1 < ../scripts/realsense-hid-${ubuntu_codename}-master.patch
echo -e "\e[32mApplying realsense-powerlinefrequency-fix patch\e[0m"
patch -p1 < ../scripts/realsense-powerlinefrequency-control-fix.patch
# Applying 3rd-party patch that affects USB2 behavior
# See reference https://patchwork.kernel.org/patch/9907707/
if [ ${k_maj_min} -lt 418 ];
then
echo -e "\e[32mRetrofit UVC bug fix rectified in 4.18+\e[0m"
if patch -N --dry-run -p1 < ../scripts/v1-media-uvcvideo-mark-buffer-error-where-overflow.patch; then
patch -N -p1 < ../scripts/v1-media-uvcvideo-mark-buffer-error-where-overflow.patch
else
echo -e "\e[36m Skip the patch - it is already found in the source tree\e[0m"
fi
fi
if [ $xhci_patch -eq 1 ]; then
echo -e "\e[32mApplying streamoff hotfix patch in videobuf2-core\e[0m"
patch -p1 < ../scripts/01-Backport-streamoff-vb2-core-hotfix.patch
echo -e "\e[32mApplying 01-xhci-Add-helper-to-get-hardware-dequeue-pointer-for patch\e[0m"
patch -p1 < ../scripts/01-xhci-Add-helper-to-get-hardware-dequeue-pointer-for.patch
echo -e "\e[32mApplying 02-xhci-Add-stream-id-to-to-xhci_dequeue_state-structur patch\e[0m"
patch -p1 < ../scripts/02-xhci-Add-stream-id-to-to-xhci_dequeue_state-structur.patch
echo -e "\e[32mApplying 03-xhci-Find-out-where-an-endpoint-or-stream-stopped-fr patch\e[0m"
patch -p1 < ../scripts/03-xhci-Find-out-where-an-endpoint-or-stream-stopped-fr.patch
echo -e "\e[32mApplying 04-xhci-remove-unused-stopped_td-pointer patch\e[0m"
patch -p1 < ../scripts/04-xhci-remove-unused-stopped_td-pointer.patch
fi
echo -e "\e[32mIncrease UVC_URBs in uvcvideo\e[0m"
patch -p1 < ../scripts/uvcvideo_increase_UVC_URBS.patch
if [ $debug_uvc -eq 1 ]; then
echo -e "\e[32mApplying uvcvideo and videobuf2 debug patch\e[0m"
patch -p1 < ../scripts/uvc_debug.patch
fi
fi
#Copy configuration
sudo cp /usr/src/linux-headers-$(uname -r)/.config .
sudo cp /usr/src/linux-headers-$(uname -r)/Module.symvers .
# Basic build for kernel modules
echo -e "\e[32mPrepare kernel modules configuration\e[0m"
#Retpoline script manual retrieval. based on https://github.com/IntelRealSense/librealsense/issues/1493
#Required since the retpoline patches were introduced into Ubuntu kernels
if [ ! -f scripts/ubuntu-retpoline-extract-one ]; then
pwd
for f in $(find . -name 'retpoline-extract-one'); do cp ${f} scripts/ubuntu-retpoline-extract-one; done;
echo $$$
fi
#Reuse current kernel configuration. Assign default values to newly-introduced options.
sudo make olddefconfig modules_prepare
#Replacement of USBcore modules implies usbcore is modular
[ ${build_usbcore_modules} -eq 1 ] && sudo make menuconfig modules_prepare
#Vermagic identity is required
sudo sed -i "s/\".*\"/\"$LINUX_BRANCH\"/g" ./include/generated/utsrelease.h
sudo sed -i "s/.*/$LINUX_BRANCH/g" ./include/config/kernel.release
#Patch for Trusty Tahr (Ubuntu 14.05) with GCC not retrofitted with the retpoline patch.
[ $retpoline_retrofit -eq 1 ] && sudo sed -i "s/#ifdef RETPOLINE/#if (1)/g" ./include/linux/vermagic.h
if [[ ( $xhci_patch -eq 1 ) && ( $build_usbcore_modules -eq 0 ) ]]; then
sudo make -j$(($(nproc)-1))
sudo make modules -j$(($(nproc)-1))
sudo make modules_install -j$(($(nproc)-1))
sudo make install
echo -e "\e[92m\n\e[1m`sudo make kernelrelease` Kernel has been successfully installed."
echo -e "\e[92m\n\e[1mScript has completed. Please reboot and load the newly installed Kernel from GRUB list.\n\e[0m"
exit 0
fi
fi # rebuild_ko==0
# Build the uvc, accel and gyro modules
KBASE=`pwd`
cd drivers/media/usb/uvc
sudo cp $KBASE/Module.symvers .
echo -e "\e[32mCompiling uvc module\e[0m"
sudo make -j -C $KBASE M=$KBASE/drivers/media/usb/uvc/ modules
echo -e "\e[32mCompiling accelerometer and gyro modules\e[0m"
sudo make -j -C $KBASE M=$KBASE/drivers/iio/accel modules
sudo make -j -C $KBASE M=$KBASE/drivers/iio/gyro modules
echo -e "\e[32mCompiling v4l2-core modules\e[0m"
sudo make -j -C $KBASE M=$KBASE/drivers/media/v4l2-core modules
if [[ ( $xhci_patch -eq 1 ) || ( $debug_uvc -eq 1 ) ]]; then
echo -e "\e[32mCompiling media/common modules\e[0m"
sudo make -j -C $KBASE M=$KBASE/drivers/media/common/videobuf2 modules
fi
# Copy the patched modules to a location
sudo cp $KBASE/drivers/media/usb/uvc/uvcvideo.ko ~/$LINUX_BRANCH-uvcvideo.ko
sudo cp $KBASE/drivers/iio/accel/hid-sensor-accel-3d.ko ~/$LINUX_BRANCH-hid-sensor-accel-3d.ko
sudo cp $KBASE/drivers/iio/gyro/hid-sensor-gyro-3d.ko ~/$LINUX_BRANCH-hid-sensor-gyro-3d.ko
sudo cp $KBASE/drivers/media/v4l2-core/videodev.ko ~/$LINUX_BRANCH-videodev.ko
if [[ ( $xhci_patch -eq 1 ) || ( $debug_uvc -eq 1 ) ]]; then
sudo cp $KBASE/drivers/media/common/videobuf2/videobuf2-common.ko ~/$LINUX_BRANCH-videobuf2-common.ko
sudo cp $KBASE/drivers/media/common/videobuf2/videobuf2-v4l2.ko ~/$LINUX_BRANCH-videobuf2-v4l2.ko
fi
if [ $build_usbcore_modules -eq 1 ]; then
sudo make -j -C $KBASE M=$KBASE/drivers/usb/core modules
sudo make -j -C $KBASE M=$KBASE/drivers/usb/host modules
sudo make -j -C $KBASE M=$KBASE/drivers/hid/usbhid modules
sudo cp $KBASE/drivers/media/v4l2-core/videobuf2-v4l2.ko ~/$LINUX_BRANCH-videobuf2-v4l2.ko
sudo cp $KBASE/drivers/media/v4l2-core/videobuf2-core.ko ~/$LINUX_BRANCH-videobuf2-core.ko
sudo cp $KBASE/drivers/media/v4l2-core/v4l2-common.ko ~/$LINUX_BRANCH-v4l2-common.ko
sudo cp $KBASE/drivers/usb/core/usbcore.ko ~/$LINUX_BRANCH-usbcore.ko
sudo cp $KBASE/drivers/usb/host/ehci-hcd.ko ~/$LINUX_BRANCH-ehci-hcd.ko
sudo cp $KBASE/drivers/usb/host/ehci-pci.ko ~/$LINUX_BRANCH-ehci-pci.ko
sudo cp $KBASE/drivers/usb/host/xhci-hcd.ko ~/$LINUX_BRANCH-xhci-hcd.ko
sudo cp $KBASE/drivers/usb/host/xhci-pci.ko ~/$LINUX_BRANCH-xhci-pci.ko
sudo cp $KBASE/drivers/hid/usbhid/usbhid.ko ~/$LINUX_BRANCH-usbhid.ko
fi
echo -e "\e[32mPatched kernels modules were created successfully\n\e[0m"
# Load the newly-built modules
# As a precausion start with unloading the core uvcvideo:
try_unload_module uvcvideo
try_unload_module videobuf2_v4l2
[ ${k_maj_min} -ge 500 ] && try_unload_module videobuf2_common
try_unload_module videodev
if [ $build_usbcore_modules -eq 1 ]; then
echo -e "\e[32mReplacing USB Core modules\e[0m"
try_unload_module videobuf2_core
try_unload_module v4l2_common
#Replace usb subsystem modules
try_unload_module usbhid
try_unload_module xhci-pci
try_unload_module xhci-hcd
try_unload_module ehci-pci
try_unload_module ehci-hcd
try_module_insert usbcore ~/$LINUX_BRANCH-usbcore.ko /lib/modules/`uname -r`/kernel/drivers/usb/core/usbcore.ko
try_module_insert ehci-hcd ~/$LINUX_BRANCH-ehci-hcd.ko /lib/modules/`uname -r`/kernel/drivers/usb/host/ehci-hcd.ko
try_module_insert ehci-pci ~/$LINUX_BRANCH-ehci-pci.ko /lib/modules/`uname -r`/kernel/drivers/usb/host/ehci-pci.ko
try_module_insert xhci-hcd ~/$LINUX_BRANCH-xhci-hcd.ko /lib/modules/`uname -r`/kernel/drivers/usb/host/xhci-hcd.ko
try_module_insert xhci-pci ~/$LINUX_BRANCH-xhci-pci.ko /lib/modules/`uname -r`/kernel/drivers/usb/host/xhci-pci.ko
try_module_insert videodev ~/$LINUX_BRANCH-videodev.ko /lib/modules/`uname -r`/kernel/drivers/media/v4l2-core/videodev.ko
try_module_insert v4l2-common ~/$LINUX_BRANCH-v4l2-common.ko /lib/modules/`uname -r`/kernel/drivers/media/v4l2-core/v4l2-common.ko
try_module_insert videobuf2_core ~/$LINUX_BRANCH-videobuf2-core.ko /lib/modules/`uname -r`/kernel/drivers/media/v4l2-core/videobuf2-core.ko
try_module_insert videobuf2_v4l2 ~/$LINUX_BRANCH-videobuf2-v4l2.ko /lib/modules/`uname -r`/kernel/drivers/media/v4l2-core/videobuf2-v4l2.ko
fi
try_module_insert videodev ~/$LINUX_BRANCH-videodev.ko /lib/modules/`uname -r`/kernel/drivers/media/v4l2-core/videodev.ko
if [[ ( ${k_maj_min} -ge 500 ) && ( $debug_uvc -eq 1 ) ]]; then
try_module_insert videobuf2-common ~/$LINUX_BRANCH-videobuf2-common.ko /lib/modules/`uname -r`/kernel/drivers/media/common/videobuf2/videobuf2-common.ko
fi
try_module_insert uvcvideo ~/$LINUX_BRANCH-uvcvideo.ko /lib/modules/`uname -r`/kernel/drivers/media/usb/uvc/uvcvideo.ko
try_module_insert hid_sensor_accel_3d ~/$LINUX_BRANCH-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 ~/$LINUX_BRANCH-hid-sensor-gyro-3d.ko /lib/modules/`uname -r`/kernel/drivers/iio/gyro/hid-sensor-gyro-3d.ko
echo -e "\e[92m\n\e[1mScript has completed. Please consult the installation guide for further instruction.\n\e[0m"