Pagina 1 di 1

script per gestire frequency scaling su portatili

Inviato: dom set 11, 2005 15:36
da supertoms
Ho creato questi 2 script per gestire le funzioni del kernel 2.6 per il frequency scaling sul mio portatile Acer TravelMate 4000WLMI.
Li ho recentemente aggiornati dopo il passaggio al 2.6.13; ora possono gestire qualunque numero di "governors", perchè li leggono direttamente dal file /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors e vanno a modificare il file scaling_governor, facendo cambiare il comportamento alla CPU.
script set_governor

Codice: Seleziona tutto

#!/bin/bash
#
#written by T0ms
#V      1.2     11/set/2005
#
#NAME: set_governor
#change interactively the frequency governor for kernel 2.6
#
#-----------VAR------------------
APLDIR="/sys/devices/system/cpu/cpu0/cpufreq"
FILE="$APLDIR/scaling_governor"
GOVFILE="$APLDIR/scaling_available_governors"
COUNT=`cat $GOVFILE|wc -w`

#-----------METHODS--------------
function my_help()
{
        echo "Usage: \
        `basename $0` [1-$COUNT]: "
        for i in `cat $GOVFILE`; do echo $i; done | cat -b
        exit 0;
}

#-----------MAIN-----------------
#echo DEBUG
#echo $# $1

if [ $# -ge 1 ] && [ $1 -ge 1 ] && [ $1 -le $COUNT ]
then
        GOV=`cut -d ' ' -f $1 $GOVFILE`
        echo $GOV > $FILE
        echo CPU Governor is Now `cat $FILE`
else
        my_help
fi



Il secondo usa il primo per cambiare ciclicamente il governo; lo uso associato ad una combianzione di tasti.
script chgov

Codice: Seleziona tutto

#!/bin/bash
#
#written by T0ms
#V      1.2     11/set/2005
#
#NAME: chgov
#change cpu governor
#

#-----------VAR------------------
APLDIR="/sys/devices/system/cpu/cpu0/cpufreq"
GOVFILE="$APLDIR/scaling_available_governors"
COUNT=`cat $GOVFILE|wc -w`
IDFILE="/var/tmp/governor.id"
PATH="/usr/bin:$PATH"
#-----------MAIN----------------
if [ ! -f $IDFILE ]
then
        echo 1 >  $IDFILE
fi

GOVID=`cat $IDFILE`
set_governor $GOVID
echo $(( (++GOVID % $COUNT)+1 )) > $IDFILE



Ho usato le informazioni in questa pagina per configurare i tasti e le scritte on-display (in generale quasi tutto il porti l'ho configurato da qui); così premendo fn+f3 cambio la configurazione della cpu.
La mia configurazione di xbindkey relativa è la seguente

Codice: Seleziona tutto

"sudo chgov | xosd -- -"
  c:223


that's all, folks!
ciao

Inviato: dom set 11, 2005 16:58
da gallows
Wow, anche io ne ho preparato uno per il mio nuovo laptop.
L'ho provato poco, peró dovrebbe funzionare:

Codice: Seleziona tutto

#!/bin/bash
#
# cpuscaling v. 0.0.1 - 10.09.2005
# by gallows <gallows@tiscali.it>
#
# suggest: put this in /usr/sbin

# set some variables:
SYSDIR="/sys/devices/system/cpu/cpu0/cpufreq"
AVAILABLE_GOVERNORS="$SYSDIR/scaling_available_governors"
GOVERNOR="$SYSDIR/scaling_governor"
FREQMAX="$SYSDIR/scaling_max_freq"
FREQMIN="$SYSDIR/scaling_min_freq"
FREQCUR="$SYSDIR/scaling_cur_freq"
FREQS="$SYSDIR/scaling_available_frequencies"

function usage() {

  cat << EOF
Usage:
 cpuscaling [ governor ], [ -show-freqs ], [ -fmax,-fmin ] FREQ

  conservative      Tune governor to conservative
  ondemand      Tune governor to ondemand
  performance      Tune governor to performance
  powersave      Tune governor to powersave
  userspace      Tune governor to userspace

  -freqs      Print frequences supported by your CPU
  -fmax FREQ      Set max frequence
  -fmin FREQ      Set min frequence
  -state      Show current state

  -help         Print this help and exit
EOF
}

function only_root() {
 
  echo "Only superuser can do it."
  exit 1
}

function something_wrong() {

  echo "Check your kernel settings."
  exit 1
}

function no_freq() {

  echo "Please choose a frequence."
  exit 1
}

function show_state() {

  echo -ne "governor:\\t `cat $GOVERNOR`\\n"
  echo -ne "current :\\t `cat $FREQCUR` Hz\\n"

  [ "$GOVERNOR" == "performance" ] && exit 0

  [ "$GOVERNOR" == "conservative" ] && {
     echo -ne "freq:\\t `cat $FREQMIN` Hz\\n"
     exit 0
  }
 
  echo -ne "freq min:\\t `cat $FREQMIN` Hz\\n"
  echo -ne "freq max:\\t `cat $FREQMAX` Hz\\n"
}

function show_freqs() {

  cat $FREQS
  exit 0
}

function freq_min() {

 [ "$UID" != "0" ] && only_root

  echo -n $FREQ > $FREQMIN
  show_state
  exit 0
}

function freq_max() {

 [ "$UID" != "0" ] && only_root

  echo -n $FREQ > $FREQMAX
  show_state
  exit 0
}

function set_governor() {

  [ "$UID" != "0" ] && only_root

  grep -q $NEW_GOVERNOR $AVAILABLE_GOVERNORS || {            # if it's n/a try   
    /sbin/modprobe cpufreq_$NEW_GOVERNOR || something_wrong # to load module
  }
  echo $NEW_GOVERNOR > $GOVERNOR
  exit 0
}

# parser:
case "$1" in
'conservative')
  NEW_GOVERNOR="conservative"
  set_governor
  ;;
'ondemand')
  NEW_GOVERNOR="ondemand"
  set_governor
  ;;
'performance')
  NEW_GOVERNOR="performance"
  set_governor
  ;;
'powersave')
  NEW_GOVERNOR="powersave"
  set_governor
  ;;
'userspace')
  NEW_GOVERNOR="userspace"
  set_governor
  ;;
'-freqs')
  show_freqs
  ;;
'-fmax')
  [ -z "$2" ] && no_freq
  FREQ="$2"
  freq_max
  ;;
'-fmin')
  [ -z "$2" ] && no_freq 
  FREQ="$2"
  freq_min
  ;;
'-state')
  show_state
  ;;
'-help')
  usage
  ;;
*)
  usage
esac

## EOF ##

Inviato: lun ott 10, 2005 10:18
da sloboda
Domanda: per fare funzionare questo script cosa è necessario fare, supponendo di avere installato il pacchetto del kernel 2.6.13?
E' necessario ricompilare il kernel? Quali moduli occorre aggiungere? quali altri programmi è necessario installare?

Grazie,
Sergej

Inviato: lun ott 10, 2005 13:37
da supertoms
per il mio nessun programma aggiuntivo (al limite xosd se vuoi anche le scritte sul display).
non so se nel pacchetto del kernel è abilitato il ramo del frequency scaling, altrimenti devi ricompilare il kernel includendo ciò che ti serve. Non ho ora i dettagli delle impostazioni, ma dal menù di configurazione sono vicini ai settaggi acpi

Inviato: mar ott 25, 2005 21:57
da supertoms
per la serie SONO UN LAMER ecco una piccola patch:
non mi ero accorto che i valori calcolati dall'istruzione di incremento nello script chgov avanzavano di 2 al posto che di 1. Tutto per evitare il valore zero che non esiste, ho aggiunto un "+1" senza provare.
(capitemi, ho scritto sti cosi in treno).
così "dovrebbe" essere giusto.

Codice: Seleziona tutto

#!/bin/bash
#change cpu governor
#
#written by T0ms
#V      1.3     25/ott/2005
#

#-----------VAR------------------
APLDIR="/sys/devices/system/cpu/cpu0/cpufreq"
GOVFILE="$APLDIR/scaling_available_governors"
COUNT=`cat $GOVFILE|wc -w`
IDFILE="/var/tmp/governor.id"
PATH="/usr/bin:$PATH"
#-----------MAIN----------------
if [ ! -f $IDFILE ]
then
        echo 1 >  $IDFILE
fi

GOVID=`cat $IDFILE`
set_governor $GOVID
echo $(( (GOVID % COUNT)+1 )) > $IDFILE