-
-
Save sighmon/a5030b46e21c304c5697f31bb43dcc22 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
#set -e | |
# install-wifi - 12/02/2018 - by MrEngman. | |
UPDATE_SELF=${UPDATE_SELF:-1} | |
UPDATE_URI="http://downloads.fars-robotics.net/wifi-drivers/install-wifi" | |
ROOT_PATH=${ROOT_PATH:-"/"} | |
WORK_PATH=${WORK_PATH:-"${ROOT_PATH}/root"} | |
OPTION=${1:-""} | |
DRIVE=${2:-""} | |
COMMIT=${3:-""} | |
function update_self() { | |
echo " *** Performing self-update" | |
_tempFileName="$0.tmp" | |
if ! curl -Ls --output "${_tempFileName}" "${UPDATE_URI}"; then | |
echo " !!! Failed to download update for install-wifi!" | |
echo " !!! Make sure you have ca-certificates installed and that the time is set correctly" | |
exit 1 | |
fi | |
OCTAL_MODE=$(stat -c '%a' "$0") | |
if ! chmod ${OCTAL_MODE} "${_tempFileName}" ; then | |
echo " !!! Failed: Error while trying to set mode on ${_tempFileName}" | |
exit 1 | |
fi | |
cat > "${WORK_PATH}/.updateScript.sh" << EOF | |
if mv "${_tempFileName}" "$0"; then | |
rm -- "\$0" | |
exec env UPDATE_SELF=0 /bin/bash "$0" "${OPTION}" "${DRIVE}" "${COMMIT}" | |
else | |
echo " !!! Failed!" | |
fi | |
EOF | |
echo " *** Relaunching after update" | |
exec /bin/bash "${WORK_PATH}/.updateScript.sh" | |
} | |
display_help() { | |
echo "#" | |
echo "# usage:" | |
echo "#" | |
echo "# sudo install-wifi [[-h | --help] |" | |
echo "# [-c | --check [driver] [rpi-update | commit_id]] |" | |
echo "# [-u | --update [driver] [rpi-update | commit_id]] |" | |
echo "# [driver [rpi-update | commit_id]]]" | |
echo "#" | |
echo "# options:" | |
echo "# none - install the driver for the wifi module connected to the Pi for the currently running kernel." | |
echo "#" | |
echo "# -h|--help - display usage." | |
echo "#" | |
echo "# -c|--check [driver] [option] - check if a driver is available, does not install it." | |
echo "# driver - specific driver to check for, one of: 8188eu, 8192eu, 8812au, 8822bu, mt7610 or mt7612" | |
echo "# [option]:- blank - check driver for currently running kernel" | |
echo "# rpi-update - check driver for latest version of rpi-update" | |
echo "# commit-id - check driver for specific commit-id of rpi-update" | |
echo "#" | |
echo "# -u|--update [driver] [option] - update/install driver, can be used after running, but before rebooting, rpi-update" | |
echo "# to update the driver to the one needed for the new kernel installed by rpi-update." | |
echo "# driver - specific driver to update/install, one of: 8188eu, 8192eu, 8812au, 8822bu, mt7610 or mt7612" | |
echo "# [option]:- blank - update/install driver for currently running kernel" | |
echo "# rpi-update - update/install driver for latest version of rpi-update" | |
echo "# commit-id - update/install driver for specific commit-id of rpi-update" | |
echo "#" | |
echo "# driver [option] - install specific driver, enables installing the driver for a module not currently connected to" | |
echo "# the Pi, or installing a driver for a different module if you want to change your wifi module." | |
echo "# driver - specific driver to install, one of: 8188eu, 8192eu, 8812au, 8822bu, mt7610 or mt7612" | |
echo "# [option]:- blank - update/install driver for currently running kernel" | |
echo "# rpi-update - update/install driver for latest version of rpi-update" | |
echo "# commit-id - update/install driver for specific commit-id of rpi-update" | |
echo "#" | |
read -n1 -r -p "Press any key to continue..." | |
echo | |
echo "#" | |
echo "# install-wifi examples:" | |
echo "#" | |
echo "# Install/update the wifi driver for the wifi module connected to the Pi for the currently running kernel" | |
echo "#" | |
echo "# sudo install-wifi" | |
echo "#" | |
echo "# If you want to change your wifi module to one using a different driver that is compatible with this script" | |
echo "# you can install the driver for the new wifi module, one of: 8188eu, 8192eu, 8812au, 8822bu, mt7610 or mt7612" | |
echo "# In this example it will install the 8192eu wifi module driver. After installing the driver shutdown the" | |
echo "# Pi, remove the currently connected wifi module and connect the new 8192eu wifi module and restart your Pi" | |
echo "# and it should start up with the new wifi adapter connected to your network." | |
echo "#" | |
echo "# sudo install-wifi 8192eu - this will install the 8192eu module for the current kernel" | |
echo "#" | |
echo "# if you want to run rpi-update, first check a driver is available before you update your code. If the check" | |
echo "# indicates a driver is available run rpi-update to update the firmware/kernel and then before rebooting" | |
echo "# update the wifi driver." | |
echo "#" | |
echo "# sudo install-wifi -c rpi-update - check for driver if rpi-update is run." | |
echo "# sudo rpi-update - if a driver is available you can run rpi-update to update firmware." | |
echo "# sudo install-wifi -u rpi-update - then update the driver for the new kernel installed by rpi-update." | |
echo "# sudo reboot - now reboot to update the kernel with the new wifi driver." | |
echo "#" | |
echo "# if you want to run, say rpi-update b2f6c103e5 to install 3.18.7+ #755, first check a driver is available" | |
echo "# before you update your code. Then, if a driver is available update the code, and then before rebooting" | |
echo "# update the wifi driver." | |
echo "#" | |
echo "# sudo install-wifi -c b2f6c103e5 - check for driver if rpi-update b2f6c103e5 is run to install kernel 3.18.7+ #755." | |
echo "# sudo rpi-update b2f6c103e5 - if a driver is available you can run rpi-update b2f6c103e5 to update firmware." | |
echo "# sudo install-wifi -u b2f6c103e5 - then update the driver for the new kernel installed by rpi-update b2f6c103e5." | |
echo "# sudo reboot - now reboot to update the kernel with the new wifi driver." | |
echo "#" | |
echo "# and finally, you can change the wifi module you are using and install the new driver for it as well as" | |
echo "# running rpi-update to update the kernel, and assuming in this example the new adapter uses the 8812au" | |
echo "# driver, using something like:" | |
echo "#" | |
echo "# sudo install-wifi -c 8812au rpi-update - check for 8812au driver if rpi-update is run." | |
echo "# sudo rpi-update - if a driver is available you can run rpi-update to update firmware." | |
echo "# sudo install-wifi -u 8812au rpi-update - install the 8812au driver for the new kernel installed by rpi-update." | |
echo "# sudo halt - shutdown the Pi, replace the wifi adapter with the 8812au wifi adapter." | |
echo "# - restart the Pi with the new kernel and new 8812au wifi module." | |
echo "#" | |
} | |
fetch_driver() { | |
echo "Checking for a wifi module to determine the driver to install." | |
echo | |
echo -n "Your wifi module is " | |
lsusb > .lsusb | |
# check for rtl8188eu compatible driver | |
if cat .lsusb | grep -i 'OBDA:FFEF\|2357:010C\|056E:4008\|2001:3311\|0DF6:0076\|2001:3310\|2001:330F\|07B8:8179\|0BDA:0179\|0BDA:8179' ; then | |
driver=8188eu | |
# check for rtl8192eu compatible driver | |
elif cat .lsusb | grep -i '2019:AB33\|2357:0109\|2357:0108\|2357:0107\|2001:3319\|0BDA:818C\|0BDA:818B' ; then | |
driver=8192eu | |
# check for rtl8812au compatible driver | |
elif cat .lsusb | grep -i '0411:029B\|0411:025D\|056E:400F\|056E:400E\|056E:4007\|7392:A813\|7392:A812\|7392:A811\|2019:AB32\|2001:3318\|2001:3314\|0E66:0023\|0846:9052\|04BB:0953\|0411:0242\|0BDA:0823\|0BDA:0820\|0BDA:A811\|0BDA:8822\|0BDA:0821\|0BDA:0811\|2357:0122\|2357:010F\|2357:010E\|2357:010D\|7392:A822\|2357:0103\|2357:0101\|20F4:805B\|2019:AB30\|2001:3316\|2001:3315\|2001:3313\|2001:330E\|1740:0100\|148F:9097\|13B1:003F\|1058:0632\|0E66:0022\|0DF6:0074\|0B05:17D2\|07B8:8812\|0789:016E\|0586:3426\|050D:1109\|050D:1106\|04BB:0952\|0409:0408\|0BDA:881C\|0BDA:881B\|0BDA:881A\|0BDA:8812' ; then | |
driver=8812au | |
# check for rtl8822bu compatible driver | |
elif cat .lsusb | grep -i '0BDA:B82C\|7392:C822\|0B05:184C\|7392:B822\|0B05:1812\|0BDA:B812' ; then | |
driver=8822bu | |
# check for mt7610u compatible driver | |
elif cat .lsusb | grep -i '0E8D:7650\|0E8D:7630\|2357:0105\|0DF6:0079\|7392:C711\|20F4:806B\|293C:5702\|057C:8502\|04BB:0951\|07B8:7610\|0586:3425\|2001:3D02\|2019:AB31\|0DF6:0075\|0B05:17DB\|0B05:17D1\|148F:760A\|148F:761A\|7392:A711\|0E8D:7610\|13B1:003E\|148F:7610' ; then | |
driver=mt7610 | |
# check for mt7612u compatible driver | |
elif cat .lsusb | grep -i '0E8D:7662\|0E8D:7632\|0E8D:7612\|0B05:17C9\|045E:02E6\|0B05:17EB\|0846:9053\|0B05:180B\|0846:9014\|7392:B711\|057C:8503\|0E8D:761B' ; then | |
driver=mt7612 | |
fi | |
if [[ ! $driver ]] ; then | |
echo "unrecognised." | |
echo | |
echo "**** Unable to identify your wifi module ****" | |
echo | |
echo "The script only works for wifi modules using the rtl8188eu, rtl8192eu, rtl8812au, 8822bu, mt7610 and mt7612 drivers." | |
echo | |
echo "Looking for your wifi module the script detected the following USB devices:-" | |
echo | |
cat .lsusb | |
echo | |
echo "If you are certain your module uses one of the drivers the script installs check the output of command" | |
echo "'lsusb' shows your wifi module. If lsusb shows your wifi module try running the script again. If the" | |
echo "script fails to detect your wifi module again the driver may need updating to add your module USB id." | |
echo | |
echo "If lsusb does not show your wifi module you will need to resolve that issue before the script can be" | |
echo "used to install the driver you need." | |
echo | |
exit 1 | |
else | |
echo | |
echo "And it uses the $driver driver." | |
echo | |
fi | |
} | |
check_driver() { | |
if [[ $kernelcommit == "rpi-update" ]] ; then | |
rpi_firmware_commit_id=master | |
elif [[ $kernelcommit ]] ; then | |
rpi_firmware_commit_id=$kernelcommit | |
fi | |
if [[ $kernelcommit ]] ; then | |
# check if Pi2 B or earlier version of Pi and select the relevant kernel image | |
if (grep -Fq BCM2709 /proc/cpuinfo) ; then | |
pi=2 | |
image=kernel7.img | |
uname=uname_string7 | |
elif (grep -Fq ARMv7 /proc/cpuinfo) ; then | |
pi=2 | |
image=kernel7.img | |
uname=uname_string7 | |
elif (grep -Fq BCM2708 /proc/cpuinfo) ; then | |
pi=1 | |
image=kernel.img | |
uname=uname_string | |
elif (grep -Fq ARMv6 /proc/cpuinfo) ; then | |
pi=1 | |
image=kernel.img | |
uname=uname_string | |
else | |
echo "Processor type unknown - you do not appear to be running this script on a Raspberry Pi. Exiting the script" | |
exit 1 | |
fi | |
echo -n "Please wait ... checking the kernel revision and build you will have after running command 'sudo rpi-update" | |
if [[ $kernelcommit != "rpi-update" ]] ; then | |
echo " $kernelcommit'." | |
else | |
echo "'." | |
fi | |
# download uname string if it exists | |
if ! (wget -q https://github.com/Hexxeh/rpi-firmware/raw/$rpi_firmware_commit_id/$uname -O .uname_string) ; then | |
# download the relevant kernel image if uname_string doesn't exist | |
if ! (wget -q https://github.com/Hexxeh/rpi-firmware/raw/$rpi_firmware_commit_id/$image -O .kernel) ; then | |
echo "Invalid commit-id, kernel not available for your version of the Pi, Pi $pi." | |
exit 1 | |
fi | |
# extract uname_string from kernel image | |
strings -n 10 .kernel | grep "Linux version" > .uname_string | |
# create kernel image with uname_string if the current kernel version doesn't include it | |
if [ ! -s .uname_string ] ; then | |
if [ ! -f /usr/bin/mkknlimg1 ] ; then | |
if [ -f /usr/bin/mkknlimg ] ; then | |
rm /usr/bin/mkknlimg | |
fi | |
wget -q http://downloads.fars-robotics.net/mkknlimg1 -O /usr/bin/mkknlimg1 | |
chmod +x /usr/bin/mkknlimg1 | |
fi | |
mkknlimg1 .kernel .kernel1 | |
mv .kernel1 .kernel | |
strings -n 10 .kernel | grep "Linux version" > .uname_string | |
fi | |
fi | |
kernel=$(cat .uname_string | awk '{print $3}' | tr -d '+') | |
build=$(grep -Po '(?<=#)[^[]*' .uname_string | awk '{print $1}') | |
echo | |
if [[ $kernelcommit == "rpi-update" ]] ; then | |
echo -n "Running command 'sudo rpi-update" | |
elif [[ $kernelcommit ]] ; then | |
echo -n "Running command 'sudo rpi-update $kernelcommit" | |
fi | |
echo "' will load:" | |
echo | |
echo " kernel revision = $kernel+" | |
echo " kernel build = #$build" | |
echo | |
fi | |
echo -n "Checking for a $driver wifi driver module" | |
if [[ $kernelcommit ]] ; then | |
if [[ $kernelcommit == "rpi-update" ]] ; then | |
echo " if you run command 'sudo rpi-update'." | |
else | |
echo " if you run command 'sudo rpi-update $rpi_firmware_commit_id'." | |
fi | |
else | |
echo " for your current kernel." | |
fi | |
if (wget --spider -o .wgetlog http://downloads.fars-robotics.net/wifi-drivers/$driver\-drivers/$driver\-$kernel\-$build.tar.gz) ; then | |
echo "There is a driver module available for this kernel revision." | |
else | |
if cat .wgetlog | grep -iq "404 Not Found" ; then | |
echo "A driver does not yet exist for this update." | |
else | |
echo "The script cannot access fars-robotics to check a driver is available." | |
fi | |
exit 2 | |
fi | |
} | |
install_driver() { | |
echo "Downloading the $driver driver." | |
if (wget -q http://downloads.fars-robotics.net/wifi-drivers/$driver\-drivers/$driver\-$kernel\-$build.tar.gz -O wifi-driver.tar.gz) ; then | |
echo "Installing the $driver driver." | |
echo | |
tar xzf wifi-driver.tar.gz | |
rm install.sh > /dev/null 2>&1 | |
module_dir="/lib/modules/$kernel+/kernel/drivers/net/wireless" | |
if [ -f RT2870STA.dat ] ; then | |
mkdir -p /etc/Wireless/RT2870STA/ | |
chown root:root RT2870STA.dat | |
mv RT2870STA.dat /etc/Wireless/RT2870STA/ | |
if [ -f 95-ralink.rules ] ; then | |
mv 95-ralink.rules /etc/udev/rules.d/ | |
elif [ -f /etc/udev/rules.d/95-ralink.rules ] ; then | |
rm /etc/udev/rules.d/95-ralink.rules | |
fi | |
fi | |
if [ -f $driver.conf ] ; then | |
cp $driver.conf /etc/modprobe.d/. | |
rm $driver.conf | |
fi | |
if [ -f mt7662u_sta.ko ] ; then | |
rm $module_dir/mt7612u* > /dev/null 2>&1 | |
rm /lib/firmware/mt7662* > /dev/null 2>&1 | |
driver1=mt7662u_sta | |
if ! grep -q "coherent_pool=" /boot/cmdline.txt ; then | |
echo "adding 'coherent_pool=2M' to file /boot/cmdline.txt" | |
sed -i 's/$/ coherent_pool=2M/' /boot/cmdline.txt | |
else | |
echo "'coherent_pool=' already intalled in file /boot/cmdline.txt" | |
fi | |
elif [ -f mt7612u.ko ] ; then | |
rm $module_dir/mt7662u* > /dev/null 2>&1 | |
driver1=mt7612u | |
chown root:root *.bin | |
mv *.bin /lib/firmware | |
elif [ -f mt7610u_sta.ko ] ; then | |
rm $module_dir/mt7610u* > /dev/null 2>&1 | |
driver1=mt7610u_sta | |
elif [ -f mt7610u.ko ] ; then | |
rm $module_dir/mt7610u* > /dev/null 2>&1 | |
driver1=mt7610u | |
chown root:root *.bin | |
mv *.bin /lib/firmware | |
elif [ -f 8822bu.ko ] ; then | |
driver1=8822bu | |
elif [ -f 8812au.ko ] ; then | |
driver1=8812au | |
elif [ -f 8192eu.ko ] ; then | |
driver1=8192eu | |
elif [ -f 8188eu.ko ] ; then | |
driver1=8188eu | |
fi | |
echo "Installing driver module $driver1.ko." | |
echo "install -p -m 644 $driver1.ko $module_dir" | |
install -p -m 644 $driver1.ko $module_dir | |
depmod $kernel+ | |
rm $driver1.ko | |
if [[ $kernelcommit ]] ; then | |
echo "Syncing changes to disk" | |
sync | |
echo "You will need to reboot to load the driver." | |
elif (lsmod | grep $driver1 > /dev/null) ; then | |
echo "Syncing changes to disk" | |
sync | |
echo "A version of the $driver driver is already loaded and running." | |
echo "You will need to reboot to load the new driver, $driver1.ko." | |
else | |
echo "Loading and running the $driver driver, $driver1.ko." | |
modprobe $driver1 | |
fi | |
else | |
echo | |
echo "A driver does not yet exist for this kernel." | |
fi | |
} | |
display_current() { | |
echo | |
echo "Your current kernel revision = $kernel+" | |
echo "Your current kernel build = #$build" | |
echo | |
} | |
tmpdir=$(mktemp -d) | |
trap "\rm -rf $tmpdir" EXIT | |
cd $tmpdir | |
#initialise some variables | |
command=$0 | |
option=$1 | |
kernelcommit=$2 | |
driver="" | |
kernel=$(uname -r | tr -d '+') | |
build=${build:-$(uname -v | awk '{print $1}' | tr -d '#')} | |
if [[ ${EUID} -ne 0 ]]; then | |
echo " !!! This tool must be run as root" | |
exit 1 | |
fi | |
echo | |
echo " *** Raspberry Pi wifi driver installer by MrEngman." | |
if [[ ${UPDATE_SELF} -ne 0 ]]; then | |
update_self | |
fi | |
#echo | |
#echo "This script installs drivers for Raspbian." | |
#if ! cat /etc/os-release | grep -iq 'ID=raspbian' ; then | |
# echo "You do not appear to be using a Raspbian OS so exiting the script." | |
# echo | |
# exit 2 | |
#fi | |
case "$1" in | |
8188eu|8192eu|8812au|8822bu|mt7610|mt7612) | |
driver=$1 | |
display_current | |
check_driver | |
install_driver | |
;; | |
-c|--check) | |
case "$2" in | |
8188eu|8192eu|8812au|8822bu|mt7610|mt7612) | |
driver=$2 | |
kernelcommit=$3 | |
;; | |
esac | |
display_current | |
if [ ! $driver ] ; then | |
fetch_driver | |
fi | |
check_driver | |
;; | |
-u|--update) | |
case "$2" in | |
8188eu|8192eu|8812au|8822bu|mt7610|mt7612) | |
driver=$2 | |
kernelcommit=$3 | |
;; | |
esac | |
display_current | |
if [ ! $driver ] ; then | |
fetch_driver | |
fi | |
check_driver | |
install_driver | |
;; | |
-h|--help) | |
display_help | |
exit 0 | |
;; | |
"") | |
display_current | |
fetch_driver | |
check_driver | |
install_driver | |
;; # proceed to install | |
*) | |
echo "unknown command: $1" >&2 | |
echo | |
read -n1 -r -p "Press any key to continue..." | |
display_help | |
exit 1 | |
;; | |
esac | |
exit 0 |
ghost
commented
Apr 14, 2019
You can try with:
mv install-wifi.sh /usr/bin/install-wifi
sudo chmod +x /usr/bin/install-wifi
sudo install-wifi
You can also check the help of this script by executing: sudo install-wifi -h
but keep in mind that this script won't install the driver for new kernels and will exit with the following error:
$ sudo install-wifi
*** Raspberry Pi wifi driver installer by MrEngman.
*** Performing self-update
*** Relaunching after update
*** Raspberry Pi wifi driver installer by MrEngman.
Your current kernel revision = 4.19.42-v7+
Your current kernel build = #1219
Checking for a wifi module to determine the driver to install.
Your wifi module is Bus 001 Device 004: ID 0e8d:7610 MediaTek Inc.
And it uses the mt7610 driver.
Checking for a mt7610 wifi driver module for your current kernel.
A driver does not yet exist for this update.
Great. Works for me. Thanks
Nicely done!
You are a star. I've been struggling with this for days - "install-wifi" fixed that problem for me, instantly. I'd buy you a beer (or a genuine Ivor Dewdney's) if you ever find yourself in Devon/Cornwall, UK...
nice job! thank you very much.
Seems I can no longer get a driver on my Pi Zero W with this script.
$ sudo install-wifi
*** Raspberry Pi wifi driver installer by MrEngman.
*** Performing self-update
*** Relaunching after update
*** Raspberry Pi wifi driver installer by MrEngman.
Your current kernel revision = 5.10.52+
Your current kernel build = #1441
Checking for a wifi module to determine the driver to install.
Your wifi module is Bus 001 Device 003: ID 2357:012d TP-Link
And it uses the 8822bu driver.
Your Pi revision number is 9000c1
You have a Pi 0 W v1.1
Checking for a 8822bu wifi driver module for your current kernel.
A driver does not exist for this update.
@ACrazyConcept Looks like there isn't a driver for 5.10.52+
yet... keep checking here or downgrade your kernel for now: http://downloads.fars-robotics.net/wifi-drivers/8822bu-drivers/
@ACrazyConcept Looks like there isn't a driver for
5.10.52+
yet... keep checking here or downgrade your kernel for now: http://downloads.fars-robotics.net/wifi-drivers/8822bu-drivers/
Excellent. Thanks!