Merge pull request #285 from makermelissa/main
Add voice bonnet/braincraft hat script to ensure DTOs are enabled
This commit is contained in:
commit
b8d16b01e0
1 changed files with 430 additions and 0 deletions
430
voice_bonnet.sh
Executable file
430
voice_bonnet.sh
Executable file
|
|
@ -0,0 +1,430 @@
|
|||
#!/bin/bash
|
||||
|
||||
: <<'DISCLAIMER'
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
This script is licensed under the terms of the MIT license.
|
||||
Unless otherwise noted, code reproduced herein
|
||||
was written for this script.
|
||||
|
||||
- The Pimoroni Crew - (modified by Adafruit!)
|
||||
|
||||
DISCLAIMER
|
||||
|
||||
# script control variables
|
||||
|
||||
productname="voice bonnet/BrainCraft HAT" # the name of the product to install
|
||||
scriptname="voice_bonnet" # the name of this script
|
||||
spacereq=1 # minimum size required on root partition in MB
|
||||
debugmode="no" # whether the script should use debug routines
|
||||
debuguser="none" # optional test git user to use in debug mode
|
||||
debugpoint="none" # optional git repo branch or tag to checkout
|
||||
forcesudo="no" # whether the script requires to be ran with root privileges
|
||||
promptreboot="no" # whether the script should always prompt user to reboot
|
||||
mininstall="no" # whether the script enforces minimum install routine
|
||||
customcmd="yes" # whether to execute commands specified before exit
|
||||
armv6="yes" # whether armv6 processors are supported
|
||||
armv7="yes" # whether armv7 processors are supported
|
||||
armv8="yes" # whether armv8 processors are supported
|
||||
arm64="yes" # whether arm64 processors are supported
|
||||
raspbianonly="no" # whether the script is allowed to run on other OSes
|
||||
osreleases=( "Raspbian" ) # list os-releases supported
|
||||
oswarning=( "Debian" "Kano" "Mate" "PiTop" "Ubuntu" ) # list experimental os-releases
|
||||
osdeny=( "Darwin" "Kali" ) # list os-releases specifically disallowed
|
||||
|
||||
FORCE=$1
|
||||
DEVICE_TREE=true
|
||||
ASK_TO_REBOOT=false
|
||||
CURRENT_SETTING=false
|
||||
UPDATE_DB=false
|
||||
|
||||
BOOTCMD=/boot/firmware/cmdline.txt
|
||||
CONFIG=/boot/firmware/config.txt
|
||||
APTSRC=/etc/apt/sources.list
|
||||
INITABCONF=/etc/inittab
|
||||
BLACKLIST=/etc/modprobe.d/raspi-blacklist.conf
|
||||
LOADMOD=/etc/modules
|
||||
DTBODIR=/boot/overlays
|
||||
|
||||
# Fall back to old location
|
||||
if ! test -f $CONFIG; then
|
||||
CONFIG=/boot/config.txt
|
||||
fi
|
||||
|
||||
# function define
|
||||
|
||||
confirm() {
|
||||
if [ "$FORCE" == '-y' ]; then
|
||||
true
|
||||
else
|
||||
read -r -p "$1 [y/N] " response < /dev/tty
|
||||
if [[ $response =~ ^(yes|y|Y)$ ]]; then
|
||||
true
|
||||
else
|
||||
false
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
prompt() {
|
||||
read -r -p "$1 [y/N] " response < /dev/tty
|
||||
if [[ $response =~ ^(yes|y|Y)$ ]]; then
|
||||
true
|
||||
else
|
||||
false
|
||||
fi
|
||||
}
|
||||
|
||||
success() {
|
||||
echo -e "$(tput setaf 2)$1$(tput sgr0)"
|
||||
}
|
||||
|
||||
inform() {
|
||||
echo -e "$(tput setaf 6)$1$(tput sgr0)"
|
||||
}
|
||||
|
||||
warning() {
|
||||
echo -e "$(tput setaf 1)$1$(tput sgr0)"
|
||||
}
|
||||
|
||||
newline() {
|
||||
echo ""
|
||||
}
|
||||
|
||||
progress() {
|
||||
count=0
|
||||
until [ $count -eq $1 ]; do
|
||||
echo -n "..." && sleep 1
|
||||
((count++))
|
||||
done
|
||||
echo
|
||||
}
|
||||
sudocheck() {
|
||||
if [ $(id -u) -ne 0 ]; then
|
||||
echo -e "Install must be run as root. Try 'sudo ./$scriptname'\n"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
sysclean() {
|
||||
sudo apt-get clean && sudo apt-get autoclean
|
||||
sudo apt-get -y autoremove &> /dev/null
|
||||
}
|
||||
|
||||
sysupdate() {
|
||||
if ! $UPDATE_DB; then
|
||||
echo "Updating apt indexes..." && progress 3 &
|
||||
sudo apt-get update 1> /dev/null || { warning "Apt failed to update indexes!" && exit 1; }
|
||||
echo "Reading package lists..."
|
||||
progress 3 && UPDATE_DB=true
|
||||
fi
|
||||
}
|
||||
|
||||
sysupgrade() {
|
||||
sudo apt-get upgrade
|
||||
sudo apt-get clean && sudo apt-get autoclean
|
||||
sudo apt-get -y autoremove &> /dev/null
|
||||
}
|
||||
|
||||
sysreboot() {
|
||||
warning "Some changes made to your system require"
|
||||
warning "your computer to reboot to take effect."
|
||||
newline
|
||||
if prompt "Would you like to reboot now?"; then
|
||||
sync && sudo reboot
|
||||
fi
|
||||
}
|
||||
|
||||
# Given a filename, a regex pattern to match and a replacement string,
|
||||
# perform replacement if found, else append replacement to end of file.
|
||||
# (# $1 = filename, $2 = pattern to match, $3 = replacement)
|
||||
reconfig() {
|
||||
grep $2 $1 >/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
# Pattern found; replace in file
|
||||
sed -i "s/$2/$3/g" $1 >/dev/null
|
||||
else
|
||||
# Not found; append (silently)
|
||||
echo $3 | sudo tee -a $1 >/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
# If /boot/firmware/config.txt exists, make sure /boot/config.txt is a symlink to it
|
||||
fix_config_symlink() {
|
||||
if [ -f /boot/firmware/config.txt ]; then
|
||||
if [ ! -L /boot/config.txt ]; then
|
||||
warning "/boot/config.txt was overwritten as a file by another script."
|
||||
if confirm "/boot/config.txt will be moved to /boot/firmware/config.txt and the symlink restored. Do you wish to continue?"; then
|
||||
sudo mv /boot/config.txt /boot/firmware/config.txt
|
||||
sudo ln -s /boot/firmware/config.txt /boot/config.txt
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
arch_check() {
|
||||
IS_ARM64=false
|
||||
IS_ARMHF=false
|
||||
IS_ARMv6=false
|
||||
|
||||
if uname -m | grep "aarch64" > /dev/null; then
|
||||
IS_ARM64=true
|
||||
fi
|
||||
if uname -m | grep "armv.l" > /dev/null; then
|
||||
IS_ARMHF=true
|
||||
if uname -m | grep "armv6l" > /dev/null; then
|
||||
IS_ARMv6=true
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
os_check() {
|
||||
IS_RASPBIAN=false
|
||||
IS_MACOSX=false
|
||||
IS_SUPPORTED=false
|
||||
IS_EXPERIMENTAL=false
|
||||
|
||||
if [ -f /etc/os-release ]; then
|
||||
if cat /etc/os-release | grep "Raspbian" > /dev/null; then
|
||||
IS_RASPBIAN=true && IS_SUPPORTED=true
|
||||
fi
|
||||
if command -v apt-get > /dev/null; then
|
||||
for os in ${osreleases[@]}; do
|
||||
if cat /etc/os-release | grep $os > /dev/null; then
|
||||
IS_SUPPORTED=true && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
done
|
||||
for os in ${oswarning[@]}; do
|
||||
if cat /etc/os-release | grep $os > /dev/null; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=true
|
||||
fi
|
||||
done
|
||||
for os in ${osdeny[@]}; do
|
||||
if cat /etc/os-release | grep $os > /dev/null; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
if [ -d ~/.kano-settings ] || [ -d ~/.kanoprofile ]; then
|
||||
IS_RASPBIAN=false
|
||||
for os in ${oswarning[@]}; do
|
||||
if [ $os == "Kano" ]; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=true
|
||||
fi
|
||||
done
|
||||
for os in ${osdeny[@]}; do
|
||||
if [ $os == "Kano" ]; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if [ -f ~/.pt-dashboard-config ] || [ -d ~/.pt-dashboard ] || [ -d ~/.pt-os-dashboard ]; then
|
||||
IS_RASPBIAN=false
|
||||
for os in ${oswarning[@]}; do
|
||||
if [ $os == "PiTop" ]; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=true
|
||||
fi
|
||||
done
|
||||
for os in ${osdeny[@]}; do
|
||||
if [ $os == "PiTop" ]; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if [ -d ~/.config/ubuntu-mate ]; then
|
||||
for os in ${osdeny[@]}; do
|
||||
if [ $os == "Mate" ]; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if uname -s | grep "Darwin" > /dev/null; then
|
||||
IS_MACOSX=true
|
||||
for os in ${osdeny[@]}; do
|
||||
if [ $os == "Darwin" ]; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
raspbian_check() {
|
||||
IS_SUPPORTED=false
|
||||
IS_EXPERIMENTAL=false
|
||||
|
||||
if [ -f /etc/os-release ]; then
|
||||
if cat /etc/os-release | grep "/sid" > /dev/null; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=true
|
||||
elif cat /etc/os-release | grep "bullseye" > /dev/null; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=true
|
||||
elif cat /etc/os-release | grep "buster" > /dev/null; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=true
|
||||
elif cat /etc/os-release | grep "stretch" > /dev/null; then
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
elif cat /etc/os-release | grep "jessie" > /dev/null; then
|
||||
IS_SUPPORTED=true && IS_EXPERIMENTAL=false
|
||||
elif cat /etc/os-release | grep "wheezy" > /dev/null; then
|
||||
IS_SUPPORTED=true && IS_EXPERIMENTAL=false
|
||||
else
|
||||
IS_SUPPORTED=false && IS_EXPERIMENTAL=false
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
: <<'MAINSTART'
|
||||
|
||||
Perform all global variables declarations as well as function definition
|
||||
above this section for clarity, thanks!
|
||||
|
||||
MAINSTART
|
||||
|
||||
# checks and init
|
||||
|
||||
arch_check
|
||||
os_check
|
||||
|
||||
if [ $debugmode != "no" ]; then
|
||||
echo "USER_HOME is $USER_HOME" && newline
|
||||
echo "IS_RASPBIAN is $IS_RASPBIAN"
|
||||
echo "IS_MACOSX is $IS_MACOSX"
|
||||
echo "IS_SUPPORTED is $IS_SUPPORTED"
|
||||
echo "IS_EXPERIMENTAL is $IS_EXPERIMENTAL"
|
||||
newline
|
||||
fi
|
||||
|
||||
if ! $IS_ARMHF && ! $IS_ARM64; then
|
||||
warning "This hardware is not supported, sorry!"
|
||||
warning "Config files have been left untouched"
|
||||
newline && exit 1
|
||||
fi
|
||||
|
||||
if $IS_ARM64 && [ $arm64 == "no" ]; then
|
||||
warning "Sorry, your CPU is not supported by this installer"
|
||||
newline && exit 1
|
||||
elif $IS_ARMv8 && [ $armv8 == "no" ]; then
|
||||
warning "Sorry, your CPU is not supported by this installer"
|
||||
newline && exit 1
|
||||
elif $IS_ARMv7 && [ $armv7 == "no" ]; then
|
||||
warning "Sorry, your CPU is not supported by this installer"
|
||||
newline && exit 1
|
||||
elif $IS_ARMv6 && [ $armv6 == "no" ]; then
|
||||
warning "Sorry, your CPU is not supported by this installer"
|
||||
newline && exit 1
|
||||
fi
|
||||
|
||||
if [ $raspbianonly == "yes" ] && ! $IS_RASPBIAN;then
|
||||
warning "This script is intended for Raspbian on a Raspberry Pi!"
|
||||
newline && exit 1
|
||||
fi
|
||||
|
||||
if $IS_RASPBIAN; then
|
||||
raspbian_check
|
||||
if ! $IS_SUPPORTED && ! $IS_EXPERIMENTAL; then
|
||||
newline && warning "--- Warning ---" && newline
|
||||
echo "The $productname installer"
|
||||
echo "does not work on this version of Raspbian."
|
||||
echo "Check https://github.com/$gitusername/$gitreponame"
|
||||
echo "for additional information and support"
|
||||
newline && exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! $IS_SUPPORTED && ! $IS_EXPERIMENTAL; then
|
||||
warning "Your operating system is not supported, sorry!"
|
||||
newline && exit 1
|
||||
fi
|
||||
|
||||
if $IS_EXPERIMENTAL; then
|
||||
warning "Support for your operating system is experimental. Please visit"
|
||||
warning "forums.adafruit.com if you experience issues with this product."
|
||||
newline
|
||||
fi
|
||||
|
||||
if [ $forcesudo == "yes" ]; then
|
||||
sudocheck
|
||||
fi
|
||||
|
||||
newline
|
||||
echo "This script will install everything needed to use"
|
||||
echo "$productname"
|
||||
newline
|
||||
warning "--- Warning ---"
|
||||
newline
|
||||
echo "Always be careful when running scripts and commands"
|
||||
echo "copied from the internet. Ensure they are from a"
|
||||
echo "trusted source."
|
||||
newline
|
||||
echo "If you want to see what this script does before"
|
||||
echo "running it, you should run:"
|
||||
echo " \curl -sS github.com/adafruit/Raspberry-Pi-Installer-Scripts/$scriptname"
|
||||
newline
|
||||
|
||||
if confirm "Do you wish to continue?"; then
|
||||
|
||||
newline
|
||||
echo "Checking hardware requirements..."
|
||||
|
||||
fix_config_symlink
|
||||
|
||||
if [ -e $CONFIG ] && grep -q "^device_tree=$" $CONFIG; then
|
||||
DEVICE_TREE=false
|
||||
fi
|
||||
|
||||
if $DEVICE_TREE; then
|
||||
|
||||
newline
|
||||
echo "Adding Device Tree Entry to $CONFIG"
|
||||
|
||||
if [ -e $CONFIG ] && grep -q "^dtoverlay=seeed-2mic-voicecard$" $CONFIG; then
|
||||
echo "dtoverlay already active"
|
||||
else
|
||||
echo "dtoverlay=seeed-2mic-voicecard" | sudo tee -a $CONFIG
|
||||
ASK_TO_REBOOT=true
|
||||
fi
|
||||
|
||||
if [ -e $CONFIG ] && grep -q "^dtoverlay=i2s-mmap$" $CONFIG; then
|
||||
echo "i2s mmap dtoverlay already active"
|
||||
else
|
||||
echo "dtoverlay=i2s-mmap" | sudo tee -a $CONFIG
|
||||
ASK_TO_REBOOT=true
|
||||
fi
|
||||
|
||||
if [ -e $CONFIG ] && grep -q "^dtparam=i2s=on$" $CONFIG; then
|
||||
echo "i2s interface already enabled"
|
||||
else
|
||||
reconfig $CONFIG "^#dtparam=i2s=on$" "dtparam=i2s=on"
|
||||
ASK_TO_REBOOT=true
|
||||
fi
|
||||
|
||||
else
|
||||
newline
|
||||
echo "No Device Tree Detected, not supported"
|
||||
newline
|
||||
exit 1
|
||||
fi
|
||||
|
||||
newline
|
||||
success "All done!"
|
||||
newline
|
||||
echo "Enjoy your new $productname!"
|
||||
newline
|
||||
|
||||
if [ $promptreboot == "yes" ] || $ASK_TO_REBOOT; then
|
||||
sysreboot
|
||||
fi
|
||||
else
|
||||
newline
|
||||
echo "Aborting..."
|
||||
newline
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Loading…
Reference in a new issue