#!/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