You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
3.7 KiB
155 lines
3.7 KiB
4 months ago
|
#!/bin/bash
|
||
|
|
||
|
# defines
|
||
|
FREQ=0 #percent
|
||
|
SERVICES=(perfd thermal-engine mpdecision)
|
||
|
DIR="/sys/devices/system/cpu"
|
||
|
|
||
|
|
||
|
###################### SETUP ######################
|
||
|
|
||
|
# helper functions
|
||
|
fileexists() {
|
||
|
[ `adb shell "[ -f $1 ] && echo 1 || echo 0" | tr -d '\r'` -eq 1 ]
|
||
|
}
|
||
|
getprop() {
|
||
|
if fileexists $1; then
|
||
|
echo `adb shell cat $1 | tr -d '\r'`
|
||
|
else
|
||
|
echo "FILE $1 NOT FOUND"
|
||
|
fi
|
||
|
}
|
||
|
setprop() {
|
||
|
if fileexists $1; then
|
||
|
adb shell "echo -n $2 > $1"
|
||
|
else
|
||
|
echo "FILE $1 NOT FOUND"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# use passed in percent frequency
|
||
|
if [[ $# -eq 1 ]]; then
|
||
|
FREQ=$1
|
||
|
fi
|
||
|
|
||
|
# switch to root
|
||
|
if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
|
||
|
adb root
|
||
|
adb wait-for-device
|
||
|
fi
|
||
|
|
||
|
# device name
|
||
|
echo Device: `adb shell getprop ro.product.model`
|
||
|
echo
|
||
|
|
||
|
# collect all cores
|
||
|
cores=`adb shell ls /sys/devices/system/cpu/ | grep cpu[0-9].* | tr -d '\r'`
|
||
|
|
||
|
# disable GPU
|
||
|
adb shell setprop debug.rs.default-CPU-driver 1
|
||
|
|
||
|
|
||
|
###################### CONFIGURE ######################
|
||
|
|
||
|
# freeze system
|
||
|
for service in ${SERVICES[@]}; do
|
||
|
adb shell stop $service
|
||
|
done
|
||
|
|
||
|
# set frequencies
|
||
|
declare -A selectedFreq
|
||
|
for core in $cores; do
|
||
|
|
||
|
# turn on core if possible
|
||
|
if fileexists $DIR/$core/online; then
|
||
|
adb shell "echo -n 1 > $DIR/$core/online"
|
||
|
fi
|
||
|
|
||
|
# get available frequencies in sorted order
|
||
|
if fileexists $DIR/$core/cpufreq/scaling_available_frequencies; then
|
||
|
frequencies=(`getprop $DIR/$core/cpufreq/scaling_available_frequencies`)
|
||
|
elif fileexists $DIR/$core/cpufreq/stats/time_in_state; then
|
||
|
frequencies=(`adb shell cat $DIR/$core/cpufreq/stats/time_in_state | cut -f1 -d " " | tr -d '\r'`)
|
||
|
fi
|
||
|
frequencies=(`printf "%s\n" "${frequencies[@]}" | sort -n`)
|
||
|
|
||
|
# find target frequency based on frequency percentage
|
||
|
minFreq=${frequencies[0]}
|
||
|
maxFreq=${frequencies[-1]}
|
||
|
targetFreq=$(( FREQ * ( maxFreq - minFreq ) / 100 + minFreq ))
|
||
|
|
||
|
# find closest frequency
|
||
|
freq=`printf "%d\n" "${frequencies[@]}" | awk -v c=${frequencies[0]} -v t=$targetFreq 'BEGIN{d=$0-t;if(d<0)d=-d;l=d}{d=$0-t;if(d<0)d=-d;if(d<l){l=d;c=$0}}END{print c}'`
|
||
|
selectedFreq[$core]=$freq
|
||
|
|
||
|
# set frequency
|
||
|
adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_min_freq"
|
||
|
adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_max_freq"
|
||
|
|
||
|
done
|
||
|
|
||
|
|
||
|
# keep trying until the frequencies are properly set
|
||
|
while true; do
|
||
|
|
||
|
# check to see if frequencies are correct
|
||
|
CORRECT=true
|
||
|
for core in $cores; do
|
||
|
if fileexists $DIR/$core/online && [ `getprop $DIR/$core/online` -eq 0 ]; then
|
||
|
echo "$core is offline"
|
||
|
CORRECT=false
|
||
|
else
|
||
|
if fileexists $DIR/$core/cpufreq/scaling_cur_freq; then
|
||
|
frequency=`getprop $DIR/$core/cpufreq/scaling_cur_freq`
|
||
|
if [ $frequency != ${selectedFreq[$core]} ]; then
|
||
|
echo "$core: $frequency != ${selectedFreq[$core]}"
|
||
|
CORRECT=false
|
||
|
fi
|
||
|
else
|
||
|
echo "$core is offline"
|
||
|
CORRECT=false
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# finished
|
||
|
if [ $CORRECT == "true" ]; then
|
||
|
break
|
||
|
fi
|
||
|
|
||
|
# display
|
||
|
echo "Frequencies not properly set. Trying again..."
|
||
|
|
||
|
# unfreeze system
|
||
|
for service in ${SERVICES[@]}; do
|
||
|
adb shell start $service
|
||
|
done
|
||
|
|
||
|
# wait for changes to be made
|
||
|
sleep 1
|
||
|
|
||
|
# freeze system
|
||
|
for service in ${SERVICES[@]}; do
|
||
|
adb shell stop $service
|
||
|
done
|
||
|
|
||
|
# try resetting the values (only really needed for Nexus 7 for some reason)
|
||
|
for core in $cores; do
|
||
|
if fileexists $DIR/$core/online; then
|
||
|
adb shell "echo -n 1 > $DIR/$core/online"
|
||
|
fi
|
||
|
adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_min_freq"
|
||
|
adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_max_freq"
|
||
|
done
|
||
|
|
||
|
sleep 1
|
||
|
|
||
|
done
|
||
|
|
||
|
# display
|
||
|
for core in $cores; do
|
||
|
echo "$core successfully set to ${selectedFreq[$core]}"
|
||
|
done
|
||
|
|
||
|
|