script per gestire frequency scaling su portatili

Scrivete su questo forum se avete problemi o volete dare buoni consigli sui computer portatili (Laptop).

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Citare il modello preciso del laptop in questione.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
supertoms
Linux 0.x
Linux 0.x
Messaggi: 89
Iscritto il: mer 22 giu 2005, 0:00
Località: Lissone Monza Italy
Contatta:

script per gestire frequency scaling su portatili

Messaggio 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

Avatar utente
gallows
Staff
Staff
Messaggi: 3471
Iscritto il: lun 20 set 2004, 0:00
Desktop: cwm
Distribuzione: OpenBSD
Località: ~/
Contatta:

Messaggio 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 ##

sloboda
Linux 0.x
Linux 0.x
Messaggi: 22
Iscritto il: dom 5 giu 2005, 0:00
Località: Casteddu
Contatta:

Messaggio 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

Avatar utente
supertoms
Linux 0.x
Linux 0.x
Messaggi: 89
Iscritto il: mer 22 giu 2005, 0:00
Località: Lissone Monza Italy
Contatta:

Messaggio 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

Avatar utente
supertoms
Linux 0.x
Linux 0.x
Messaggi: 89
Iscritto il: mer 22 giu 2005, 0:00
Località: Lissone Monza Italy
Contatta:

Messaggio 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


Rispondi