minor fix for kernel, new power-settings package
authortanner <tanner@mach.kyb.local>
Sun, 2 May 2010 13:22:06 +0000 (15:22 +0200)
committertanner <tanner@mach.kyb.local>
Sun, 2 May 2010 13:22:06 +0000 (15:22 +0200)
13 files changed:
kernel-power-settings/config/default
kernel-power-settings/debian/changelog
kernel-power-settings/debian/control
kernel-power-settings/debian/kernel-power-settings.install
kernel-power-settings/debian/kernel-power-settings.postinst
kernel-power-settings/debian/kernel-power-settings.postrm [new file with mode: 0644]
kernel-power-settings/kernel-config [new file with mode: 0755]
kernel-power-settings/kernel-load
kernel-power-settings/kernel-modules [new file with mode: 0644]
kernel-power-settings/kernel-power
kernel-power-settings/kernel-power.conf [new file with mode: 0644]
kernel-power-settings/kernel-power.sudoers [new file with mode: 0644]
kernel-power-settings/pre-mount [new file with mode: 0755]

index fc52b35..c121b94 100644 (file)
@@ -1,8 +1,14 @@
+# DO NOT EDIT THIS FILE - CREATE A COPY OF IT FOR CUSTOMIZATION 
+MIN_FREQ=250
+MAX_FREQ=600
+FREQS="0:30,90 125:30,90 250:38,180 500:48,360 550:54,400 600:60,430 700:60,430 750:60,430 805:60,430 850:60,500 900:60,500 950:60,500 1000:60,500 1100:72,520 1150:72,520"
 #UP_THRESHOLD=75
 #SAMPLING_RATE=150000
-VDD1_OPPS_VSEL="30 30 38 48 54 48 60 60 60 60 60 60 60 72 72"
-DSP_OPPS_RATE="90 90 180 360 400 430 430 430 430 500 500 500 500 520 520"
-MIN_FREQ=250000
-MAX_FREQ=599000
 SMARTREFLEX_VDD1=0
 SMARTREFLEX_VDD2=0
+IGNORE_NICE_LOAD=0
+# start USB networking and sshd early during boot
+EARLYSSH=0
+# fsck of /home partition before mounting?
+# 1=if necessary, force=always check
+FSCK_HOME=0
\ No newline at end of file
index e6fcc91..590266e 100644 (file)
@@ -1,3 +1,12 @@
+kernel-power-settings (0.4) fremantle; urgency=low
+
+   * new general script kernel-config: new FREQS. IGNORE_NICE_LOAD fields
+   * load /etc/modules on boot
+   * add pre-mount hook to /etc/default/mount-opts to optionally
+     perform fsck /home and to run /etc/kernel-power/pre-mount.once
+
+ -- Thomas Tanner <maemo@tannerlab.com>  Sun, 2 May 2010 00:00:00 +0100
+
 kernel-power-settings (0.3) fremantle; urgency=low
 
    * postinst: exit 0
index 17a4d14..3640071 100644 (file)
@@ -2,15 +2,17 @@ Source: kernel-power-settings
 Section: utils
 Priority: optional
 Maintainer: Thomas Tanner <maemo@tannerlab.com>
-XSBC-Bugtracker: http://talk.maemo.org/showthread.php?t=43420
+XSBC-Bugtracker: https://garage.maemo.org/tracker/?group_id=1528
 Build-Depends: debhelper (>= 4.0.0)
 Standards-Version: 3.8.0
 
 Package: kernel-power-settings
 Section: user/system
 Architecture: armel
-Depends: kernel-power-flasher
-Description: Customization of kernel settings for the enhanced Maemo 5 kernel 2.6.28.10
+Depends: kernel-power-flasher, sudo
+Description: Tools for the customization of kernel settings
+ of the enhanced Maemo 5 kernel 2.6.28.10.
 XB-Maemo-Icon-26:
  iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0
  d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACYtJREFUeNrUWkurZUcVXvXY
index 7748615..b7608a5 100644 (file)
@@ -1,3 +1,8 @@
 kernel-load /usr/sbin
+kernel-config /usr/sbin
+pre-mount /etc/kernel-power
 kernel-power /etc/event.d
+kernel-modules /etc/event.d
+kernel-power.sudoers /etc/sudoers.d
+kernel-power.conf /etc/osso-backup/applications
 config/* /usr/share/kernel-power-settings
index 19974f1..9700228 100644 (file)
@@ -8,6 +8,10 @@ cd /etc
 test -f lastboot && rm lastboot
 test -f lastreboot && rm lastreboot
 
+if ! grep "# KERNEL-POWER-HOOK" /etc/default/mount-opts; then
+       echo "test -x /etc/kernel-power/pre-mount && /etc/kernel-power/pre-mount # KERNEL-POWER-HOOK" >> /etc/default/mount-opts
+fi
+
 #DEBHELPER#
 
 exit 0
diff --git a/kernel-power-settings/debian/kernel-power-settings.postrm b/kernel-power-settings/debian/kernel-power-settings.postrm
new file mode 100644 (file)
index 0000000..e3792be
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+if grep "# KERNEL-POWER-HOOK" /etc/default/mount-opts; then
+       grep -v "# KERNEL-POWER-HOOK" /etc/default/mount-opts > /etc/default/mount-opts.tmp
+    mv /etc/default/mount-opts.tmp /etc/default/mount-opts
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/kernel-power-settings/kernel-config b/kernel-power-settings/kernel-config
new file mode 100755 (executable)
index 0000000..b2d0887
--- /dev/null
@@ -0,0 +1,277 @@
+#!/bin/sh
+# kernel configuration script for power user kernel
+# (c) Copyright 2010 by Thomas Tanner <maemo@tannerlab.com>
+# licensed under GPLv3
+# version 0.1 (2. May 2010)
+
+if test $# -eq 0; then
+    echo "$0 command [options]"
+    echo "commands:"
+    echo "  show        - show current settings"
+    echo "  load <file> - load settings from file"
+    echo "  save <file> - save settings to file (abs. path or filename in /home/user/.kernel, none=defaults)"
+    echo "  setdefault <file> - set file as default settings"
+    echo "  lock [freq [volt] [dsp]] - un/lock CPU at frequency with specific settings"
+    echo "filenames: absolute path or filename in search path or none=defaults"
+    echo "search path: .,/home/user/.kernel,/usr/share/kernel-power-settings/"
+    exit 1
+fi
+if test "`id -u`" -ne 0; then
+    sudo $0 $* # run as root
+    exit $?
+fi
+
+cfr=/sys/devices/system/cpu/cpu0/cpufreq
+cfd=$cfr/ondemand
+pwr=/sys/power/
+
+echo ondemand > $cfr/scaling_governor
+if test -f $cfd/avoid_frequencies -a -f $pwr/vdd1_opps_vsel -a -f $pwr/dsp_opps_rate; then :
+else
+    echo This kernel version `uname -r` is not supported
+    exit 1
+fi
+
+allfreq=
+for f in `cat $cfr/scaling_available_frequencies`; do
+    allfreq="$f $allfreq"
+done
+vsel=`cat $pwr/vdd1_opps_vsel` 
+rate=`cat $pwr/dsp_opps_rate` 
+
+cmd=$1
+arg=
+shift
+if test "$cmd" = lock && test -z "$1"; then
+    echo 'unlocking frequency. reset to defaults'
+    cmd=loaddef
+    arg=
+fi
+
+popvsel() { curvsel=$1; shift; vsel="$*"; }
+poprate() { currate=$1; shift; rate="$*"; }
+
+case $cmd in
+show|save)
+    minfreq=$((`cat $cfr/scaling_min_freq`/1000))
+    maxfreq=$((`cat $cfr/scaling_max_freq`/1000))
+    test $maxfreq = 599 && maxfreq=600
+    avoid=`cat $cfd/avoid_frequencies`
+    freqs=
+    for f in $allfreq; do
+        popvsel $vsel
+        poprate $rate
+        case " $avoid " in *" $f "*) ;;
+        *) freqs="$freqs$((f/1000)):$curvsel,$currate "
+        esac
+    done
+    if test $cmd = show; then
+        echo "current kernel configuration:"
+        echo "current frequency:" $((`cat $cfr/scaling_cur_freq`/1000))
+        echo -n "supported frequencies: "
+        for f in $allfreq; do echo -n "$((f/1000)) "; done
+        echo
+        echo "min. frequency:" $minfreq
+        echo "max. frequency:" $maxfreq
+        echo -n "avoid frequencies: "
+        for f in $avoid; do echo -n "$((f/1000)) "; done
+        echo
+        echo "active frequencies: $freqs"
+        echo "SmartReflex" "VDD1=`cat $pwr/sr_vdd1_autocomp`, VDD2=`cat $pwr/sr_vdd2_autocomp`"
+        echo -n "ondemand: ignore nice load=" `cat $cfd/ignore_nice_load` 
+        echo -n ", up threshold=" `cat $cfd/up_threshold`
+        echo ", sampling rate=" `cat $cfd/sampling_rate`
+    else
+        arg=$1
+        test -z "$arg" && arg=/etc/default/kernel-power
+        test `basename $arg` = $arg && arg=/home/user/.kernel/$arg
+        test $arg = /etc/default/kernel-power && test -L $arg && rm -f $arg
+        echo "saving to $arg"
+        echo "# kernel configuration file generated by $0" > $arg
+        echo "MINFREQ=$minfreq" >> $arg
+        echo "MAXFREQ=$maxfreq" >> $arg
+        echo "FREQS=$freqs" >> $arg
+        echo "SMARTREFLEX_VDD1=`cat $pwr/sr_vdd1_autocomp`" >> $arg
+        echo "SMARTREFLEX_VDD2=`cat $pwr/sr_vdd2_autocomp`" >> $arg
+        echo "IGNORE_NICE_LOAD=`cat $cfd/ignore_nice_load`" >> $arg
+        echo "UP_THRESHOLD=`cat $cfd/up_threshold`" >> $arg
+        echo "SAMPLING_RATE=`cat $cfd/sampling_rate`" >> $arg
+    fi
+    ;;
+load|loaddef)
+    test $cmd = loaddef || arg=$1
+    if test -z "$arg"; then
+        arg=/etc/default/kernel-power
+        test -f $arg || arg=/usr/share/kernel-power-settings/default
+    fi
+    if test `basename $arg` = $arg; then # not absolute
+        for p in . /home/user/.kernel /usr/share/kernel-power-settings; do
+            test -f $p/$arg && arg=$p/$arg && break
+        done
+    fi
+    if test ! -f "$arg"; then
+        echo "file not found $arg"
+        exit 1
+    fi
+    echo "loading $arg"
+    source $arg
+    if test -n "$VDD1_OPPS_VSEL" -o -n "$DSP_OPPS_RATE"; then
+        echo "warning: old configuration format detected. ignoring"
+        exit 1
+    fi
+    #echo $allfreq
+    #echo $vsel
+    #echo $rate
+    active=
+    minfreq=
+    maxfreq=
+    #echo $FREQS
+    for f in $FREQS; do
+        #echo processing $f
+        freq=`echo $f | cut -d: -f1`
+        f=`echo $f | cut -d: -f2`
+        volt=`echo $f | cut -d, -f1`
+        dsp=`echo $f | cut -d, -f2`
+        #echo freq $freq volt $volt dsp $dsp
+        if test ! $freq = 0; then
+            test -z "$minfreq" -o "$freq" -lt "$minfreq" && minfreq=$freq
+            test -z "$maxfreq" -o "$freq" -gt "$maxfreq" && maxfreq=$freq
+            freq=$((freq*1000))
+            case " $allfreq " in *" $freq "*) ;;
+            *)  echo warning: $freq not supported; continue ;;
+            esac
+            active="$active $freq"
+        fi
+        test -z "$volt" && test -z "$dsp" && continue
+        tvsel=
+        trate=
+        cpvsel() { tvsel="$tvsel $1"; }
+        cprate() { trate="$trate $1"; }
+        for fr in 0 $allfreq; do
+            if test $fr = $freq; then
+                popvsel $vsel
+                poprate $rate
+                test -z "$volt" && volt=$curvsel
+                test -z "$dsp" && dsp=$currate
+                tvsel="$tvsel $volt $vsel"
+                trate="$trate $dsp $rate"
+                break
+            fi
+            popvsel $vsel
+            tvsel="$tvsel $curvsel"
+            poprate $rate
+            trate="$trate $currate"
+        done
+        vsel=$tvsel
+        rate=$trate
+        #echo $vsel
+    done
+    #echo vsel $vsel
+    #echo rate $rate
+    test -n "$MIN_FREQ" && minfreq=$MIN_FREQ
+    test -n "$MAX_FREQ" && maxfreq=$MAX_FREQ
+    test "$minfreq" -gt 100000 && minfreq=$((minfreq/1000))
+    test "$maxfreq" -gt 100000 && maxfreq=$((maxfreq/1000))
+    #echo $minfreq $maxfreq
+    avoid=
+    for f in $allfreq; do
+        if test "$f" -lt $((minfreq*1000)); then
+            avoid="$avoid $f"
+            continue
+        fi
+        case " $active " in *" $f "*) ;;
+        *) avoid="$avoid $f" ;;
+        esac
+    done
+    #echo $avoid
+    echo $avoid > $cdf/avoid_frequencies
+    echo $vsel > $pwr/vdd1_opps_vsel
+    echo $rates > $pwr/dsp_opps_rate
+    test $maxfreq = 600 && maxfreq=599
+    echo $((minfreq*1000)) > $cfr/scaling_min_freq
+    echo $((maxfreq*1000)) > $cfr/scaling_max_freq
+    test -n "$SMARTREFLEX_VDD1" && echo $SMARTREFLEX_VDD1 > $pwr/sr_vdd1_autocomp
+    test -n "$SMARTREFLEX_VDD2" && echo $SMARTREFLEX_VDD2 > $pwr/sr_vdd2_autocomp
+    test -n "$IGNORE_NICE_LOAD" && echo $IGNORE_NICE_LOAD > $cfd/ignore_nice_load
+    test -n "$UP_THRESHOLD" && echo $UP_THRESHOLD > $cfd/up_threshold
+    test -n "$SAMPLING_RATE" && echo $SAMPLING_RATE > $cfd/sampling_rate
+    echo "successfully loaded."
+    ;;
+setdefault)
+    arg=$1
+    if test -z "$arg"; then
+        echo "filename missing"
+        exit 1
+    fi
+    if test `basename $arg` = $arg; then # not absolute
+        for p in . /home/user/.kernel /usr/share/kernel-power-settings; do
+            test -f $p/$arg && arg=$p/$arg && break
+        done
+    fi
+    def=/etc/default/kernel-power
+    case $arg in 
+    /usr/share/kernel-power-settings/*) ln -s $arg $def ;;
+    *) cp $arg $def ;;
+    esac
+    echo "defaults set to $arg"
+    ;;
+lock)
+    arg=$1
+    altfreq=
+    for f in $allfreq; do
+        test "$f" = "$arg" && continue
+        altfreq=$f
+        break
+    done
+    vsel=
+    dsp=
+    freq=$((arg*1000))
+    ifreq=
+    i=0
+    allfreq="0 $allfreq"
+    for f in $allfreq; do
+        i=$((i+1))
+        test $f = $freq || continue
+        ifreq=$i
+        break
+    done
+    if test -z "ifreq"; then
+        echo invalid frequency $freq
+        exit 1
+    fi
+    echo $ifreq $altfreq
+    test -f $cfd/avoid_frequencies && echo > $cfd/avoid_frequencies # enable all freqs
+    echo userspace > $cfr/scaling_governor 
+    echo $altfreq > $cfr/scaling_setspeed # temporarily set alternative frequencies
+    volt=$2
+    if test -n "$volt"; then
+        i=0
+        vsel=
+        for v in `cat $pwr/vdd1_opps_vsel`; do
+            i=$((i+1))
+            test $i = $ifreq && v=$volt
+            vsel="$vsel $v"
+        done
+        echo $vsel
+        echo $vsel > $pwr/vdd1_opps_vsel
+    fi
+    dsp=$3
+    if test -n "$dsp"; then
+        i=0
+        dsp=
+        for r in `cat $pwr/dsp_opps_rate`; do
+            i=$((i+1))
+            test $i = $ifreq && r=$dsp
+            dsp="$dsp $r"
+        done
+        echo $dsp
+        echo $dsp > $pwr/dsp_opps_rate
+    fi
+    echo locking frequency $freq
+    echo $freq > $cfr/scaling_setspeed
+    ;;
+*)
+    echo "invalid command $cmd"
+    exit 1
+esac
+exit 0
index 9c44d15..d17095d 100755 (executable)
@@ -1,15 +1,4 @@
 #!/bin/sh
-
-f="$1"
-test $# -eq 0 && f=/etc/default/kernel-power
-test -f "$f" || exit 1
-source "$f"
-test -n "$UP_THRESHOLD" && echo $UP_THRESHOLD > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold
-test -n "$SAMPLING_RATE" && echo $SAMPLING_RATE > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate
-test -n "$MIN_FREQ" && echo $MIN_FREQ > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
-test -n "$MAX_FREQ" && echo $MAX_FREQ > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
-test -n "$VDD1_OPPS_VSEL" && echo $VDD1_OPPS_VSEL > /sys/power/vdd1_opps_vsel
-test -n "$DSP_OPPS_RATE" && echo $DSP_OPPS_RATE > /sys/power/dsp_opps_rate
-test -n "$SMARTREFLEX_VDD1" && echo $SMARTREFLEX_VDD1 > /sys/power/sr_vdd1_autocomp
-test -n "$SMARTREFLEX_VDD2" && echo $SMARTREFLEX_VDD2 > /sys/power/sr_vdd2_autocomp
-exit 0
+echo "warning: this script is obsolete. calling kernel-config"
+/usr/sbin/kernel-config load $1
+exit $?
diff --git a/kernel-power-settings/kernel-modules b/kernel-power-settings/kernel-modules
new file mode 100644 (file)
index 0000000..ef128bd
--- /dev/null
@@ -0,0 +1,11 @@
+description "load modules from /etc/modules"
+start on started hildon-desktop 
+console none
+script
+    grep '^[^#]' /etc/modules |
+    while read module args
+    do
+        [ "$module" ] || continue
+        modprobe $module $args || :
+    done
+end script
index 16b78e3..1bed8d4 100644 (file)
@@ -3,13 +3,30 @@ stop on starting shutdown
 service
 console none
 script
-       test -f /etc/lastboot && TDIFF=$(expr $(date +%s) - $(stat -t /etc/lastboot |awk '{print $14}'))
-       if test -z "$TDIFF" || test "$TDIFF" -gt 300; then
-               touch /etc/lastboot
-               test -x /usr/sbin/kernel-load || exit 1
-               /usr/sbin/kernel-load
-               exit 0
-       else
-               exit 1
-       fi
+    mkdir -p /etc/kernel-power
+    if test -f /etc/kernel-power/.loaded; then
+        # rebooted w/o clean shutdown, continue
+        rm -f /etc/kernel-power/.loaded
+        touch /etc/kernel-power/.notloaded
+        exit 1
+    fi
+    test -f /etc/default/kernel-power || exit 1
+    STATE=`/sbin/getbootstate`
+    if test $STATE = USER; then
+        source /etc/default/kernel-power
+        if test "$EARLYSSH" = 1 && test -x /etc/init.d/ssh; then
+            /sbin/modprobe g_nokia
+            /sbin/ifup usb0
+            /etc/init.d/ssh start
+        fi
+    fi
+    test -x /usr/sbin/kernel-config || exit 1
+    touch /etc/kernel-power/.loaded
+    /usr/sbin/kernel-config defaults
+    exit 0
+end script
+
+post-stop script
+    rm -f /etc/kernel-power/.loaded
+    rm -f /etc/kernel-power/.notloaded
 end script
diff --git a/kernel-power-settings/kernel-power.conf b/kernel-power-settings/kernel-power.conf
new file mode 100644 (file)
index 0000000..def4acf
--- /dev/null
@@ -0,0 +1,10 @@
+<backup-configuration>
+       <locations>
+               <location type="dir" category="settings">
+                       /home/user/.kernel
+               </location>
+               <location type="file" category="settings">
+                       /etc/default/kernel-power
+               </location>
+       </locations>
+</backup-configuration>
diff --git a/kernel-power-settings/kernel-power.sudoers b/kernel-power-settings/kernel-power.sudoers
new file mode 100644 (file)
index 0000000..3388d64
--- /dev/null
@@ -0,0 +1 @@
+user ALL = NOPASSWD: /usr/sbin/kernel-config *
diff --git a/kernel-power-settings/pre-mount b/kernel-power-settings/pre-mount
new file mode 100755 (executable)
index 0000000..fb4c146
--- /dev/null
@@ -0,0 +1,51 @@
+#!/bin/sh
+# pre-mounting script
+# called by /etc/default/mount-opts sourced by /etc/event.d/rcS-late
+# (c) Copyright 2010 by Thomas Tanner <maemo@tannerlab.com>
+# licensed under GPLv3
+# version 0.1 (2. May 2010)
+
+if test -f /etc/kernel-power/pre-mount.once; then
+       # execute pre-mount script once
+       mv /etc/kernel-power/pre-mount.once /etc/kernel-power/pre-mount.done
+       date >> /etc/kernel-power/pre-mount.log
+       sh /etc/kernel-power/pre-mount.done >> /etc/kernel-power/pre-mount.log
+fi
+
+fforce=/etc/kernel-power/force_fsck
+#temporary overwrite0=off, 1=on
+force=
+if test -f $fforce; then
+       force=`cat $fforce` 
+    if test ! "$force" = 1;
+       rm $fforce # disabled
+       exit 0
+       fi
+else
+       cfg=/etc/default/kernel-power
+       test -f $cfg || exit 0
+       FSCK_HOME=0
+       source $cfg
+       if test "$FSCK_HOME" = 1; then
+               force=
+       elif test "$FSCK_HOME" = force; then
+       force=1
+    else
+       exit 0 # disabled
+    fi 
+fi
+
+part=sfdisk -l /dev/mmcblk0 | awk '$6 == 83 { print $1; exit }'
+test -z "$part" && exit 0
+
+mkdir -p /etc/kernel-power/
+date >> /etc/kernel-power/pre-mount.log
+
+# dont continue if reboot during fsck
+echo 0 > $fforce
+test $force = 1 && force="-f"
+fsck -y $force -t ext3 $part >> /etc/kernel-power/pre-mount.log
+
+rm $fforce # use defaults
+
+exit 0