slitaz-arm annotate rpi/tazberry @ rev 142

tazberry: install package when setting up picam!
author Christophe Lincoln <pankso@slitaz.org>
date Sat Apr 26 22:33:15 2014 +0200 (2014-04-26)
parents d2106327fb89
children 0bdb769b766e
rev   line source
pankso@44 1 #!/bin/sh
pankso@44 2 #
pankso@44 3 # TazBerry - SliTaz Raspberry Pi Config Tool
pankso@44 4 #
pankso@44 5 # Copyright (C) 2014 SliTaz ARM - BSD License
pankso@44 6 # Author: Christophe Lincoln <pankso@slitaz.org>
pankso@44 7 #
pankso@44 8 . /lib/libtaz.sh
pankso@137 9 check_root
pankso@44 10
pankso@44 11 title="{ TazBerry }"
pankso@44 12 config="/boot/config.txt"
pankso@44 13 tmpdir="/tmp/tazberry"
pankso@44 14 tmp="$tmpdir/$$"
pankso@44 15 height="20"
pankso@44 16 width="72"
pankso@44 17
pankso@44 18 # Use a tmp directory
pankso@44 19 mkdir -p ${tmpdir}
pankso@44 20
pankso@44 21 # Small built-in help
pankso@44 22 help() {
pankso@44 23 cat << EOT
pankso@44 24
pankso@44 25 $(boldify "$(gettext 'Usage:')") $(basename $0) [command|rpi_function]
pankso@44 26
pankso@44 27 $(boldify "$(gettext 'Commands:')")
pankso@122 28 oclock $(gettext 'Configure overclocking')
pankso@134 29 cam-setup $(gettext 'Configure your Pi to use the Camera')
pankso@44 30 ls-functions $(gettext 'List TazBerry functions')
pankso@105 31 rpi_ $(gettext 'Execute any tazberry_function')
pankso@44 32 testsuite $(gettext 'Run TazBerry testsuite')
pankso@44 33
pankso@44 34 EOT
pankso@44 35 }
pankso@44 36
pankso@44 37 #
pankso@44 38 # RPi functions
pankso@44 39 #
pankso@44 40
paul@65 41 # This could move to /usr/bin/slitaz-??? or something since it's not
pankso@58 42 # ARM specific
pankso@44 43 rpi_stats() {
pankso@58 44 ip=$(ifconfig | fgrep -A 1 "encap:Ethernet" | fgrep "inet" | cut -d ":" -f 2)
pankso@58 45 mem_total=$(free -m | fgrep "Mem:" | awk '{print $2}')
pankso@58 46 mem_used=$(free -m | fgrep "Mem:" | awk '{print $3}')
pankso@58 47 mem_used_pct=$(( ( ${mem_used} * 100) / ${mem_total} ))
pankso@44 48 cat << EOT
pankso@67 49 $(gettext 'Kernel') : $(uname -snrm)
pankso@67 50 $(gettext 'Uptime') : $(uptime | awk '{print $3}' | sed s"/:/h /" | sed s"/,/min/")
pankso@67 51 $(gettext 'Network IP') : $(echo $ip | awk '{print $1}')
pankso@67 52 $(gettext 'CPU heat') : $(awk '{printf "%3.1f C\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp)
pankso@67 53 $(gettext 'Processes') : $(ps | wc -l)
pankso@67 54 $(gettext 'Memory usage') : ${mem_used_pct}%
pankso@44 55 EOT
pankso@44 56 }
pankso@44 57
pankso@44 58 rpi_turbo() {
pankso@44 59 if ! fgrep -q 'force_turbo=1' ${config}; then
pankso@44 60 gettext "Enabling Raspberry Pi force turbo..."
pankso@44 61 echo "force_turbo=1" >> ${config}; status
pankso@44 62 else
pankso@44 63 gettext "Disabling Raspberry Pi force turbo..."
pankso@44 64 sed -i '/force_turbo=1/'d ${config}; status
pankso@44 65 fi
pankso@44 66 }
pankso@44 67
pankso@44 68 # RPi Overclocking
pankso@44 69 rpi_oclock() {
pankso@44 70 cat << EOT
pankso@44 71 none 700MHz ARM 250MHz core 400MHz SDRAM 0 overvolt
pankso@44 72 modest 800MHz ARM 300MHz core 400MHz SDRAM 0 overvolt
pankso@44 73 medium 900MHz ARM 333MHz core 450MHz SDRAM 2 overvolt
pankso@44 74 high 950MHz ARM 450MHz core 450MHz SDRAM 6 overvolt
pankso@44 75 turbo 1000MHz ARM 500MHz core 500MHz SDRAM 6 overvolt
pankso@44 76 EOT
pankso@44 77 }
pankso@44 78
pankso@122 79 # Unset overclocking
pankso@122 80 unset_oclock() {
pankso@122 81 debug "unset_oclock"
pankso@122 82 sed -i \
pankso@122 83 -e '/# Overclocking.*/'d \
pankso@122 84 -e '/arm_freq=/'d \
pankso@122 85 -e '/core_freq=/'d \
pankso@122 86 -e '/sdram_freq=/'d \
pankso@122 87 -e '/over_voltage=/'d ${config}
pankso@122 88 # Remove if 3 empty lines follows
pankso@122 89 sed -i '1N;N;/^\n\n$/d;P;D' ${config}
pankso@122 90 }
pankso@122 91
pankso@122 92 # Set overclocking: set_oclock [mode]
pankso@122 93 set_oclock() {
pankso@122 94 debug "set_oclock $1"
pankso@122 95 case "$1" in
pankso@122 96 none)
pankso@122 97 arm_freq=700
pankso@122 98 core_freq=250
pankso@122 99 sdram_freq=400
pankso@122 100 over_voltage=0 ;;
pankso@122 101 modest)
pankso@122 102 arm_freq=800
pankso@122 103 core_freq=300
pankso@122 104 sdram_freq=400
pankso@122 105 over_voltage=0 ;;
pankso@122 106 medium)
pankso@122 107 arm_freq=900
pankso@122 108 core_freq=333
pankso@122 109 sdram_freq=450
pankso@122 110 over_voltage=2 ;;
paul@127 111 high)
pankso@122 112 arm_freq=950
pankso@122 113 core_freq=450
pankso@122 114 sdram_freq=450
pankso@122 115 over_voltage=6 ;;
pankso@122 116 turbo)
pankso@122 117 arm_freq=1000
pankso@122 118 core_freq=500
pankso@122 119 sdram_freq=500
pankso@122 120 over_voltage=6 ;;
pankso@122 121 esac
pankso@122 122 unset_oclock
pankso@122 123 cat >> ${config} << EOT
pankso@122 124 # Overclocking Settings
pankso@122 125 arm_freq=$arm_freq
pankso@122 126 core_freq=$core_freq
pankso@122 127 sdram_freq=$sdram_freq
pankso@122 128 over_voltage=$over_voltage
pankso@122 129
pankso@122 130 EOT
pankso@122 131 }
pankso@122 132
pankso@44 133 #
pankso@44 134 # GUI Functions
pankso@44 135 #
pankso@44 136
pankso@44 137 # Usage: msg_box "title" "message"
pankso@44 138 msg_box() {
pankso@44 139 dialog --title "{ $1 }" --cr-wrap \
pankso@44 140 --ok-label "TazBerry" --msgbox "\n$2" ${height} ${width}
pankso@44 141 }
pankso@44 142
pankso@44 143 # Usage: text_box "file"
pankso@44 144 text_box() {
pankso@44 145 local file="$1"
pankso@44 146 if [ -f "$file" ]; then
pankso@44 147 dialog --cr-wrap \
pankso@115 148 --title "{ $(gettext 'Viewing file:') $file }" \
pankso@44 149 --extra-button \
pankso@44 150 --extra-label "Edit file" \
pankso@44 151 --ok-label "TazBerry" \
pankso@44 152 --textbox ${file} ${height} ${width}
pankso@44 153 else
pankso@44 154 dialog --title "$title" \
pankso@44 155 --msgbox "\nERROR: $file does not exist" 10 ${width}
pankso@44 156 fi
pankso@44 157 # Handle options
pankso@44 158 case "$?" in
pankso@73 159 3) editor ${file} ;;
pankso@44 160 esac
pankso@44 161 }
pankso@44 162
pankso@44 163 # Usage: tail_box "file"
pankso@44 164 tail_box() {
pankso@115 165 dialog --title "{ $(gettext 'Watching file:') $2 }" \
pankso@44 166 --tailbox "$1" ${height} ${width}
pankso@44 167 }
pankso@44 168
pankso@44 169 # Packages info and spk-up button
pankso@44 170 pkgs_box() {
pankso@44 171 out="$tmpdir/spk-info.txt"
pankso@44 172 spk info --output=raw > ${out}
pankso@44 173 dialog --cr-wrap \
pankso@44 174 --title "{ $(gettext 'Packages') }" \
pankso@44 175 --extra-button \
pankso@44 176 --extra-label "$(gettext 'Upgrade')" \
pankso@44 177 --ok-label "TazBerry" \
pankso@44 178 --textbox "$out" ${height} ${width}
pankso@44 179 # Handle options
pankso@44 180 case "$?" in
pankso@44 181 3) spk-up && gettext "Press ENTER to go back to TazBerry"; read ;;
pankso@44 182 esac
pankso@44 183 }
pankso@44 184
pankso@122 185 # Overclocking info TODO: button to setup
pankso@44 186 oclock_box() {
pankso@122 187 mode=$(fgrep arm_freq ${config} | cut -d '=' -f 2)
pankso@122 188 case "$mode" in
pankso@122 189 700) mode="none" ;;
pankso@122 190 800) mode="modest" ;;
pankso@122 191 900) mode="medium" ;;
pankso@122 192 950) mode="high" ;;
pankso@122 193 1000) mode="turbo" ;;
pankso@122 194 esac
pankso@122 195 dialog \
pankso@122 196 --clear --colors \
pankso@122 197 --extra-button \
pankso@122 198 --title "{ Overclocking }" \
pankso@44 199 --ok-label "TazBerry" \
pankso@122 200 --extra-label "Set Overclock" \
pankso@122 201 --cancel-label "Unset Oclock" \
paul@127 202 --menu "\nSet Raspberry Pi overclocking, current setting: \Zb\Z2$mode" \
pankso@122 203 ${height} ${width} 14 \
pankso@122 204 "none" "700MHz ARM 250MHz core 400MHz SDRAM 0 overvolt" \
pankso@122 205 "modest" "800MHz ARM 300MHz core 400MHz SDRAM 0 overvolt" \
pankso@122 206 "medium" "900MHz ARM 333MHz core 450MHz SDRAM 2 overvolt" \
pankso@122 207 "high" "950MHz ARM 450MHz core 450MHz SDRAM 6 overvolt" \
pankso@122 208 "turbo" "1000MHz ARM 500MHz core 500MHz SDRAM 6 overvolt" 2>${tmp}
pankso@122 209 retval="$?"
pankso@122 210 mode=$(cat $tmp)
pankso@122 211 case "$retval" in
pankso@122 212 0) continue ;;
pankso@122 213 1) unset_oclock ;;
pankso@122 214 3) set_oclock "$mode" ;;
pankso@122 215 255) rm -rf ${tmpdir} && exit 0 ;;
pankso@122 216 esac
pankso@44 217 }
pankso@44 218
pankso@105 219 gpu_mem_box() {
pankso@105 220 dialog \
pankso@105 221 --clear \
pankso@105 222 --title "$title" \
pankso@105 223 --ok-label "Set mem" \
pankso@105 224 --cancel-label "TazBerry" \
paul@108 225 --menu "\nSet the memory allocated to the GPU (in MB)" \
pankso@105 226 ${height} ${width} 14 \
pankso@105 227 "16" "For server, NAS, base system without X" \
pankso@105 228 "32" "For very small TFT and TV display" \
pankso@105 229 "64" "Default value, fine for low latency desktop" \
pankso@105 230 "128" "For a faster desktop, using a video player" \
pankso@105 231 "256" "For media center, GL/3D applications" 2>${tmp}
pankso@105 232 mem=$(cat $tmp)
pankso@105 233 sed -i \
pankso@105 234 -e s"/#gpu_mem=.*/gpu_mem=$mem/" \
pankso@105 235 -e s"/gpu_mem=.*/gpu_mem=$mem/" /boot/config.txt
pankso@105 236 }
pankso@105 237
pankso@134 238 picam_setup() {
pankso@134 239 db="/var/lib/tazpkg/installed"
pankso@134 240 gpu_mem=128
pankso@134 241 pct="0"
pankso@134 242 {
pankso@134 243 # Needed packages
pankso@134 244 for pkg in raspberrypi-vc raspberrypi-boot-x
pankso@134 245 do
pankso@134 246 echo "XXX" && echo $((${pct} + 20))
pankso@134 247 echo -e "\nInstalling: $pkg"
pankso@134 248 echo "XXX"
pankso@142 249 [ -d "$db/$pkg" ] || spk-add ${pkg} >/dev/null 2>/dev/null
pankso@134 250 sleep 1
pankso@134 251 done
pankso@134 252
pankso@134 253 echo "XXX" && echo 60
pankso@134 254 echo -e "\nSetting up: ${config}"
pankso@134 255 echo "XXX" && sleep 1
pankso@134 256 # 0 to disable camera, 1 to enable it
pankso@134 257 if ! grep -q "start_x=1" ${config}; then
pankso@134 258 cat >> ${config} << EOT
pankso@134 259
pankso@134 260 # Camera settings
pankso@134 261 start_x=1
pankso@134 262
pankso@134 263 EOT
pankso@134 264 fi
pankso@134 265 # In case it was commented ot disabled
pankso@134 266 sed -i s'/#start_x=.*/start_x=1/' ${config}
pankso@134 267 sed -i s'/start_x=.*/start_x=1/' ${config}
pankso@134 268
pankso@134 269 # PiCam need 128 MB of GPU memory
pankso@134 270 echo "XXX" && echo 80
pankso@134 271 echo -e "\nSetting GPU memory to: ${gpu_mem}"
pankso@134 272 echo "XXX" && sleep 1
pankso@134 273
pankso@134 274 sed -i "s/#gpu_mem=.*/gpu_mem=${gpu_mem}/" ${config}
pankso@134 275 sed -i "s/gpu_mem=.*/gpu_mem=${gpu_mem}/" ${config}
pankso@134 276
pankso@134 277 echo "XXX" && echo 100
pankso@134 278 echo -e "\nPiCam config done..."
pankso@134 279 echo "XXX" && sleep 1
pankso@134 280
pankso@134 281 } | dialog --title "{ PiCam Setup }" \
pankso@134 282 --gauge "" 8 ${width} 0
pankso@134 283
pankso@134 284 # Reboot ?
pankso@134 285 dialog --title "$title" \
pankso@134 286 --yesno "\n\
pankso@134 287 SliTaz is configured for the PiCam but you need a reboot to use it.\
pankso@134 288 \n\n
pankso@134 289 Do You wish to reboot now ?" \
pankso@134 290 ${height} ${width}
pankso@141 291 [ "$?" == 0 ] && reboot
pankso@134 292 }
pankso@134 293
pankso@137 294 # Breakout bords!
pankso@137 295 boards_box() {
pankso@137 296 dialog \
pankso@137 297 --clear \
pankso@137 298 --title "$title" \
pankso@137 299 --ok-label "Exec" \
pankso@137 300 --cancel-label "Quit" \
pankso@137 301 --menu "\nSetup or use a breakout board" ${height} ${width} 14 \
pankso@137 302 "cam-setup" "$(gettext 'Configure your Pi to use a Camera')" \
pankso@137 303 "piglow" "$(gettext 'Setup your Pi to use PiGlow')" 2>${tmp}
pankso@137 304
pankso@137 305 # Handle options
pankso@137 306 case "$?" in
pankso@137 307 1|255) rm -rf ${tmpdir} && exit 0 ;;
pankso@137 308 esac
pankso@137 309
pankso@137 310 # Handle actions
pankso@137 311 action=$(cat $tmp)
pankso@137 312 case "$action" in
pankso@137 313 cam-setup)
pankso@137 314 picam_setup ;;
pankso@137 315 piglow)
pankso@137 316 for pkg in python-rpi-pyglow wiringpi-piglow; do
pankso@137 317 spk-add ${pkg}
pankso@137 318 done
pankso@137 319 newline
pankso@137 320 echo -n "Do you wish to try the leds [y/N] ? " ; read anser
pankso@137 321 [ "$anser" == "y" ] && echo "Enter a value between: 5-255" \
pankso@137 322 && pyglow test
pankso@137 323 esac
pankso@137 324 }
pankso@137 325
pankso@44 326 # Main Dialog menu
pankso@44 327 main_box() {
pankso@44 328 dialog \
pankso@44 329 --clear \
pankso@44 330 --title "$title" \
pankso@44 331 --ok-label "Exec" \
pankso@44 332 --cancel-label "Quit" \
pankso@44 333 --menu "" ${height} ${width} 14 \
pankso@44 334 "rpi-stats" "$(gettext 'Show some RPi system stats')" \
pankso@105 335 "gpu-mem" "$(gettext 'Set memory split between ARM and GPU')" \
pankso@137 336 "boards" "$(gettext 'Boards settings and tools (Camera, PyGlow)')" \
pankso@105 337 "act-led" "$(gettext 'Test the RPi onboard ACT green led')" \
pankso@122 338 "oclock" "$(gettext 'Overclocking configuration')" \
pankso@105 339 "rpi-turbo" "$(gettext 'Enable or disable RPi turbo on next boot')" \
pankso@88 340 "boot-cmdline" "$(gettext 'View boot args /boot/cmdline.txt')" \
pankso@88 341 "boot-config" "$(gettext 'View config file /boot/config.txt')" \
pankso@115 342 "packages" "$(gettext 'SliTaz packages manager') (spk)" \
pankso@115 343 "config" "$(gettext 'System config (lang, keyboard, wifi)')" \
pankso@122 344 "reboot" "$(gettext 'Reboot SliTaz system')" \
pankso@44 345 "halt" "$(gettext 'Halt the Raspberry Pi')" \
pankso@88 346 "quit" "$(gettext 'Exit TazBerry tool')" 2>${tmp}
pankso@44 347
pankso@44 348 # Handle options
pankso@105 349 case "$?" in
pankso@46 350 1|255) rm -rf ${tmpdir} && exit 0 ;;
pankso@44 351 esac
pankso@44 352
pankso@44 353 # Handle actions
pankso@44 354 action=$(cat $tmp)
pankso@44 355 case "$action" in
pankso@44 356 rpi-stats)
pankso@44 357 msg_box "RPi Stats" "$(rpi_stats)" ;;
pankso@105 358 gpu-mem)
pankso@105 359 gpu_mem_box ;;
pankso@137 360 boards)
pankso@137 361 boards_box ;;
pankso@105 362 act-led)
pankso@105 363 brightness="/sys/class/leds/led0/brightness"
pankso@105 364 (echo "1" > ${brightness}
pankso@105 365 sleep 3; echo "0" > ${brightness}) & ;;
pankso@100 366 oclock)
pankso@100 367 oclock_box ;;
pankso@44 368 rpi-turbo)
pankso@44 369 rpi_turbo && newline
pankso@44 370 gettext "Press ENTER to go back to TazBerry"; read ;;
pankso@105 371 boot-cmdline)
pankso@105 372 text_box /boot/cmdline.txt ;;
pankso@105 373 boot-config)
pankso@105 374 text_box ${config} ;;
pankso@44 375 packages)
pankso@88 376 spk-dialog ;;
pankso@88 377 config)
pankso@88 378 slitaz-config ;;
pankso@44 379 reboot)
pankso@44 380 reboot ;;
pankso@44 381 halt)
pankso@115 382 poweroff ;;
pankso@44 383 quit)
pankso@44 384 rm -rf ${tmpdir} && exit 0 ;;
pankso@44 385 esac
pankso@44 386 }
pankso@44 387
pankso@44 388 # Progress bar testsuite
pankso@44 389 gauge_box() {
pankso@44 390 { for i in $(seq 1 100); do
pankso@44 391 echo $i
pankso@44 392 sleep 0.01
pankso@44 393 done
pankso@44 394 echo 100; } | dialog --title "{ TazBerry }" \
pankso@44 395 --gauge "Work in progress..." 6 ${width} 0
pankso@44 396 }
pankso@44 397
pankso@44 398 #
pankso@44 399 # Handle commands
pankso@44 400 #
pankso@44 401
pankso@44 402 case "$1" in
pankso@44 403 oclock)
pankso@122 404 oclock_box ;;
pankso@44 405
pankso@134 406 cam-setup)
pankso@134 407 picam_setup ;;
pankso@134 408
pankso@44 409 ls-functions)
pankso@44 410 newline
pankso@44 411 boldify "$(gettext 'TazBerry functions list')"
pankso@44 412 separator
pankso@44 413 grep "^rpi_*" $0 | awk '{print " ", $1}'
pankso@44 414 newline ;;
pankso@44 415
pankso@44 416 testsuite)
pankso@44 417 gauge_box
pankso@44 418 msg_box "Testsuite" "Test message"
pankso@44 419 rpi_stats
pankso@44 420 newline ;;
pankso@44 421
pankso@44 422 rpi_*)
pankso@44 423 # Execute functions
pankso@44 424 $@ ;;
pankso@44 425
pankso@44 426 "")
pankso@44 427 # No args: display Ncurses dialog
pankso@44 428 while true; do
pankso@44 429 main_box
pankso@44 430 done ;;
pankso@44 431
pankso@44 432 *|*help|-h)
pankso@44 433 # Display help
pankso@44 434 help ;;
pankso@44 435 esac
pankso@44 436
pankso@44 437 # Clean exit
pankso@44 438 rm -rf ${tmpdir}
pankso@44 439 exit 0