Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@ugate
Last active November 28, 2022 17:53
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save ugate/392185a959737365834f54d5bf4aae5b to your computer and use it in GitHub Desktop.
Save ugate/392185a959737365834f54d5bf4aae5b to your computer and use it in GitHub Desktop.
NTC C.H.I.P. setup script
#!/bin/bash
LC_ALL=en_US.UTF-8
# configures/installs common CHIP features (including enabling disabled ones)
# run 'sudo chmod +x setup.sh && ./setup.sh' to run the installation
clear
res=
dtc=
rboot=
uname -a
cat << _EOF_
===========================================================================
▒▒▒ ▒▒▒ ▒▒░
▒▒▒ ▒▒▒ ▒▒░
▒▒▒ ▒▒▒ ▒▒░
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒
▒▒░ ░▒▒
▒▒▒▒▒▒▒▒░ ░▒▒▒▒▒▒▒▒▒
▒▒░ ▒▒▒▒ ░▒▒
▒▒░ ▒▒▒▒▒▒▒▒ ░▒▒
▒▒░ ▒▒▒▒▒▒▒▒░ ░▒▒
▒▒░ ▒▒▒▒▒▒▒▒▒▒ ░▒▒
▒▒▒▒▒▒▒▒░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒░ ░▒▒
▒▒░ ░▒▒
▒▒░ ░▒▒
▒▒▒▒▒▒▒▒░ ░▒▒▒▒▒▒▒▒▒
▒▒░ ░▒▒
▒▒░ ░▒▒
▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒ ▒▒▒ ▒▒▒
▒▒▒ ▒▒▒ ▒▒▒
▒▒▒ ▒▒▒ ▒▒▒
____ _ _ ___ ____
/ ___| | | | | |_ _| | _ \
| | | |_| | | | | |_) |
| |___ _ | _ | _ | | | |__/
\____| (_)|_| |_| (_)|___| (_) |_| (_)
===========================================================================
_______ _______ _______ _ _ _____
|______ |______ | | | |_____]
______| |______ | |_____| |
===========================================================================
_EOF_
# password for the current user
while [[ -z "$pwo" ]]; do
read -s -p "Enter a CURRENT password for \"$USER\" (default=\"chip\"): " pwo
if [[ -z "$pwo" ]]; then
pwo=chip
fi
echo "*** validating password ***"
sudo -k
if sudo -lS &> /dev/null <<- _EOF_
$pwo
_EOF_
then
echo 'Password confirmed!'
else
echo '☠ Invalid password!'
pwo=""
fi
done
# change $USER password
echo "==========================================================================="
cpw () {
yn=("*** Skip ***" "Change password for \"$1\"")
yna=
pwx=
pwc=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
while [[ -z "$pwx" || "$pwx" != "$pwc" || ${#pwx} -lt 8 ]]; do
if [ "$pwx" != "$pwc" ]; then
echo ""
echo "☠ New pasword and retyped password do not match!"
elif [[ -n "$pwx" && ${#pwx} -lt 8 ]]; then
echo ""
echo "☠ New password is too short (min 8 characters)!"
fi
read -s -p "Enter a NEW password for \"$1\": " pwx
echo ""
read -s -p "Retype NEW password for \"$1\": " pwc
done
echo ""
if [[ "$1" == "$USER" ]]; then
pwu=$pwx
else
pwr=$pwx
fi
if sudo passwd $1 &> /dev/null <<- _EOF_
$pwx
$pwx
_EOF_
then
echo "Password changed for $1!"
else
echo "☠ Failed to change password for $1! "$?
fi
fi
}
cpw "$USER"
echo "---------------------------------------------------------------------------"
cpw "root"
# update host files
echo "==========================================================================="
hn=$(grep -o -m 1 '\b[a-z]*\b' /etc/hosts)
yn=("*** Skip ***" "Change host name from \"$hn\"")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
read -p "Enter a NEW hostname for CHIP: " res
if [[ -n "$res" ]]; then
yn=("*** Skip ***" "Replace \"$hn\" with \"$res\" in \"/etc/hostname\" and \"/etc/hosts\"")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
echo "---------------------------------------------------------------------------"
echo "/etc/hostname contents:"
sudo sed -i "s/${hn}/${res}/ig" /etc/hostname
cat /etc/hostname
echo "---------------------------------------------------------------------------"
echo "/etc/hosts contents:"
sudo sed -i "s/${hn}/${res}/ig" /etc/hosts
cat /etc/hosts
hn=$res
fi
fi
fi
# WiFi setup
echo "==========================================================================="
nmcli device wifi list
echo "---------------------------------------------------------------------------"
ssid=
ssidp=
readarray -t ssids < <(nmcli -f ssid device wifi list ifname wlan0 | grep -o '^\S*')
# first element in array is "SSID"
ssids[0]="*** Skip ***"
PS3="Please select a WiFi SSID to connect to (use list #): "
select ssid in "${ssids[@]}"; do
for item in "${ssids[@]}"; do
if [[ $item == $ssid ]]; then
break 2
fi
done
done
if [ "$ssid" != "${ssids[0]}" ]; then
while [[ -z "$ssidp" || ${#ssidp} -lt 8 ]]; do
if [[ -n "$ssidp" && ${#ssidp} -lt 8 ]]; then
echo "☠ Pasword for \"$ssid\" is too short (${#ssid} is less than min of 8 characters)!"
fi
read -s -p "Enter the password to connect to \"$ssid\": " ssidp
done
echo ""
# remove existing (if present) and add
#sudo nmcli device disconnect wlan0
sudo nmcli con delete id "$ssid" &> /dev/null
sudo nmcli device wifi connect "$ssid" password "$ssidp" ifname wlan0
echo ""
fi
# update/upgrade system
echo "==========================================================================="
yn=("*** Skip ***" "Update/Upgrade system using apt-get")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
sudo apt-get update && sudo apt-get -y upgrade
fi
# regenerate new SSH server keys
echo "==========================================================================="
yn=("*** Skip ***" "Regenerate SSH server keys (for SSH, SFTP, etc.)")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna || -z "$yna" ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
sudo ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa -b 521
sudo /etc/init.d/ssh restart
fi
# install build-essential
echo "==========================================================================="
yn=("*** Skip ***" "Install required \"build-essential\" for C/C++ compilation")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna || -z "$yna" ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
sudo apt-get -y install build-essential
fi
# enable device tree overlay hw
echo "==========================================================================="
dtcInstall() {
if [[ $dtc != 1 ]]; then
sudo apt install device-tree-compiler
# sudo dtc -I dtb -O dts -o /boot/sun5i-r8-chip.dts /boot/sun5i-r8-chip.dtb # decompile DTB
sudo cp /boot/sun5i-r8-chip.dtb /boot/sun5i-r8-chip.dtb.bak.$(date -d "today" +"%Y%m%d%H%M")
dtc=1
fi
}
# enable /dev/i2c-1
echo "---------------------------------------------------------------------------"
echo "By default /dev/i2c-1 (I2C on bus 1) is \"disabled\" in CHIP's DTB."
echo "Enabling i2c-1 will allow you to use the TWI1-SDA/TWI1-SCK pins on your CHIP."
echo "This process requires an update to /boot/sun5i-r8-chip.dtb"
yn=("*** Skip ***" "Update CHIP's DTB to enable /dev/i2c-1")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna || -z "$yna" ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
read -p "Enter the clock-frequency for /dev/i2c-1 between 3814-400000 (default 100000): " res
if [[ -z "$res" || ! "$res" =~ ^[0-9]*$ ]]; then
res=100000
elif [[ $res -lt 3814 ]]; then
res=3814
elif [[ $res -gt 400000 ]]; then
res=400000
fi
echo "Setting clock-frequency to $res"
dtcInstall "i2c1"
sudo fdtput -t s /boot/sun5i-r8-chip.dtb "/aliases" "i2c1" "/soc@01c00000/i2c@01c2b000"
sudo fdtput -t s /boot/sun5i-r8-chip.dtb "/soc@01c00000/i2c@01c2b000" "status" "okay"
sudo fdtput -t s /boot/sun5i-r8-chip.dtb "/soc@01c00000/i2c@01c2b000" "pinctrl-names" "default"
sudo fdtput -t x /boot/sun5i-r8-chip.dtb "/soc@01c00000/i2c@01c2b000" "pinctrl-0" "0x38" # 0x5e for older v4.4
sudo fdtput -t i /boot/sun5i-r8-chip.dtb "/soc@01c00000/i2c@01c2b000" "clock-frequency" "${res}";
rboot=1
fi
# enable pwm0
echo "---------------------------------------------------------------------------"
echo "By default /sys/class/pwm/pwmchip0 is \"disabled\" in CHIP's DTB."
echo "Enabling pwm0 will allow you to use the PWM0 pin on your CHIP."
echo "This process requires an update to /boot/sun5i-r8-chip.dtb"
yn=("*** Skip ***" "Update CHIP's DTB to enable PWM0")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna || -z "$yna" ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
dtcInstall "pwm0"
sudo fdtput -t s /boot/sun5i-r8-chip.dtb "/soc@01c00000/pwm@01c20e00" "status" "okay"
sudo fdtput -t s /boot/sun5i-r8-chip.dtb "/soc@01c00000/pwm@01c20e00" "pinctrl-names" "default"
sudo fdtput -t x /boot/sun5i-r8-chip.dtb "/soc@01c00000/pwm@01c20e00" "pinctrl-0" "0x67" # 0x63 for older v4.4
rboot=1
fi
# install node.js
echo "==========================================================================="
yn=("*** Skip ***" "Install/Update Node.js")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
echo "Detecting latest Node.js version..."
nodever=
nodevernew=
nodepth=$(which node)
nodeurl="https://nodejs.org/dist/latest/"
nodeurl=$nodeurl$(sudo curl -sS -L "$nodeurl" | grep -o -m 1 'node-v[0-9]*\.[0-9]*\.[0-9]*-linux-armv7l\.tar\.xz' | head -1)
nodeop="Install"
if [[ -n "$nodepth" ]]; then
nodever=$(node -v)
nodever=${nodever//[!0-9\.]/}
nodevernew=$(grep -o '[0-9]*\.[0-9]*\.[0-9]*' <<< $nodeurl)
nodeop="Upgrade Node.js from $nodever to"
nodepth=${nodepth%"bin/node"}
else
nodepth=/usr/local/
fi
if [[ -n "$nodevernew" && "$nodever" == "$nodevernew" ]]; then
echo "Node.js is up to date with version $nodever"
else
yn=("*** Skip ***" "$nodeop \"$nodeurl\"")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
if [[ -n "$nodepth" && -n "$nodever" ]]; then
# remove existing node and npm
sudo rm -rf $nodepth{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}
fi
sudo curl -o /tmp/nodejs.tar.xz "$nodeurl"
echo "Installing Node.js to $nodepth"
sudo tar -C $nodepth --strip-components 1 -xJf /tmp/nodejs.tar.xz
echo "Installed Node.js "$(node -v)" with npm "$(npm -v)
fi
fi
fi
# generate self-signed certificate for node.js HTTPS/TLS connections
yn=("*** Skip ***" "Generate required self-signed certificate for HTTPS/TLS")
yna=
echo "==========================================================================="
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/ssl/private/key.pem -out /etc/ssl/certs/cert.pem -days 18250 -nodes
echo "Generated /etc/ssl/private/key.pem and /etc/ssl/certs/cert.pem"
fi
# reboot?
echo "==========================================================================="
if [[ $rboot == 1 ]]; then
echo "CHIP needs to reboot for setup to complete..."
yn=("*** Skip ***" "Reboot CHIP")
yna=
PS3="Enter 1 or 2: "
select yna in "${yn[@]}"; do
for item in "${yn[@]}"; do
if [[ $item == $yna || -z "$yna" ]]; then
break 2
fi
done
done
if [[ $yna == "${yn[1]}" ]]; then
sudo reboot
fi
else
echo "Setup is complete and your CHIP is ready for use!"
fi
echo "==========================================================================="
exit 0 #Exit with success
@vi
Copy link

vi commented Jan 19, 2018

What to do with sun4i-pwm 1c20e00.pwm: prop pinctrl-0 index 0 invalid phandle?
I tried both pinctrl-0" "0x67" and pinctrl-0" "0x63"...

Kernel version is 4.3.0-ntc

Where to get these numbers? Why are they different based on kernel version?

Update: Found out myself. It should match phandle of pwm0. If there is no phandle at all there, creating it using some new unused value works.

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