Last active
November 28, 2022 17:53
-
-
Save ugate/392185a959737365834f54d5bf4aae5b to your computer and use it in GitHub Desktop.
NTC C.H.I.P. setup script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
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
PWM0 Test
Once enabled in the DTB using the PWM option in the scritpt and a reboot has completed you can test
PWM0
by running the following script assudo
: