1*e1eccf28SAndroid Build Coastguard Worker#!/bin/bash 2*e1eccf28SAndroid Build Coastguard Worker 3*e1eccf28SAndroid Build Coastguard Worker# defines 4*e1eccf28SAndroid Build Coastguard WorkerFREQ=0 #percent 5*e1eccf28SAndroid Build Coastguard WorkerSERVICES=(perfd thermal-engine mpdecision) 6*e1eccf28SAndroid Build Coastguard WorkerDIR="/sys/devices/system/cpu" 7*e1eccf28SAndroid Build Coastguard Worker 8*e1eccf28SAndroid Build Coastguard Worker 9*e1eccf28SAndroid Build Coastguard Worker###################### SETUP ###################### 10*e1eccf28SAndroid Build Coastguard Worker 11*e1eccf28SAndroid Build Coastguard Worker# helper functions 12*e1eccf28SAndroid Build Coastguard Workerfileexists() { 13*e1eccf28SAndroid Build Coastguard Worker [ `adb shell "[ -f $1 ] && echo 1 || echo 0" | tr -d '\r'` -eq 1 ] 14*e1eccf28SAndroid Build Coastguard Worker} 15*e1eccf28SAndroid Build Coastguard Workergetprop() { 16*e1eccf28SAndroid Build Coastguard Worker if fileexists $1; then 17*e1eccf28SAndroid Build Coastguard Worker echo `adb shell cat $1 | tr -d '\r'` 18*e1eccf28SAndroid Build Coastguard Worker else 19*e1eccf28SAndroid Build Coastguard Worker echo "FILE $1 NOT FOUND" 20*e1eccf28SAndroid Build Coastguard Worker fi 21*e1eccf28SAndroid Build Coastguard Worker} 22*e1eccf28SAndroid Build Coastguard Workersetprop() { 23*e1eccf28SAndroid Build Coastguard Worker if fileexists $1; then 24*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n $2 > $1" 25*e1eccf28SAndroid Build Coastguard Worker else 26*e1eccf28SAndroid Build Coastguard Worker echo "FILE $1 NOT FOUND" 27*e1eccf28SAndroid Build Coastguard Worker fi 28*e1eccf28SAndroid Build Coastguard Worker} 29*e1eccf28SAndroid Build Coastguard Worker 30*e1eccf28SAndroid Build Coastguard Worker# use passed in percent frequency 31*e1eccf28SAndroid Build Coastguard Workerif [[ $# -eq 1 ]]; then 32*e1eccf28SAndroid Build Coastguard Worker FREQ=$1 33*e1eccf28SAndroid Build Coastguard Workerfi 34*e1eccf28SAndroid Build Coastguard Worker 35*e1eccf28SAndroid Build Coastguard Worker# switch to root 36*e1eccf28SAndroid Build Coastguard Workerif [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then 37*e1eccf28SAndroid Build Coastguard Worker adb root 38*e1eccf28SAndroid Build Coastguard Worker adb wait-for-device 39*e1eccf28SAndroid Build Coastguard Workerfi 40*e1eccf28SAndroid Build Coastguard Worker 41*e1eccf28SAndroid Build Coastguard Worker# device name 42*e1eccf28SAndroid Build Coastguard Workerecho Device: `adb shell getprop ro.product.model` 43*e1eccf28SAndroid Build Coastguard Workerecho 44*e1eccf28SAndroid Build Coastguard Worker 45*e1eccf28SAndroid Build Coastguard Worker# collect all cores 46*e1eccf28SAndroid Build Coastguard Workercores=`adb shell ls /sys/devices/system/cpu/ | grep cpu[0-9].* | tr -d '\r'` 47*e1eccf28SAndroid Build Coastguard Worker 48*e1eccf28SAndroid Build Coastguard Worker# disable GPU 49*e1eccf28SAndroid Build Coastguard Workeradb shell setprop debug.rs.default-CPU-driver 1 50*e1eccf28SAndroid Build Coastguard Worker 51*e1eccf28SAndroid Build Coastguard Worker 52*e1eccf28SAndroid Build Coastguard Worker###################### CONFIGURE ###################### 53*e1eccf28SAndroid Build Coastguard Worker 54*e1eccf28SAndroid Build Coastguard Worker# freeze system 55*e1eccf28SAndroid Build Coastguard Workerfor service in ${SERVICES[@]}; do 56*e1eccf28SAndroid Build Coastguard Worker adb shell stop $service 57*e1eccf28SAndroid Build Coastguard Workerdone 58*e1eccf28SAndroid Build Coastguard Worker 59*e1eccf28SAndroid Build Coastguard Worker# set frequencies 60*e1eccf28SAndroid Build Coastguard Workerdeclare -A selectedFreq 61*e1eccf28SAndroid Build Coastguard Workerfor core in $cores; do 62*e1eccf28SAndroid Build Coastguard Worker 63*e1eccf28SAndroid Build Coastguard Worker # turn on core if possible 64*e1eccf28SAndroid Build Coastguard Worker if fileexists $DIR/$core/online; then 65*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n 1 > $DIR/$core/online" 66*e1eccf28SAndroid Build Coastguard Worker fi 67*e1eccf28SAndroid Build Coastguard Worker 68*e1eccf28SAndroid Build Coastguard Worker # get available frequencies in sorted order 69*e1eccf28SAndroid Build Coastguard Worker if fileexists $DIR/$core/cpufreq/scaling_available_frequencies; then 70*e1eccf28SAndroid Build Coastguard Worker frequencies=(`getprop $DIR/$core/cpufreq/scaling_available_frequencies`) 71*e1eccf28SAndroid Build Coastguard Worker elif fileexists $DIR/$core/cpufreq/stats/time_in_state; then 72*e1eccf28SAndroid Build Coastguard Worker frequencies=(`adb shell cat $DIR/$core/cpufreq/stats/time_in_state | cut -f1 -d " " | tr -d '\r'`) 73*e1eccf28SAndroid Build Coastguard Worker fi 74*e1eccf28SAndroid Build Coastguard Worker frequencies=(`printf "%s\n" "${frequencies[@]}" | sort -n`) 75*e1eccf28SAndroid Build Coastguard Worker 76*e1eccf28SAndroid Build Coastguard Worker # find target frequency based on frequency percentage 77*e1eccf28SAndroid Build Coastguard Worker minFreq=${frequencies[0]} 78*e1eccf28SAndroid Build Coastguard Worker maxFreq=${frequencies[-1]} 79*e1eccf28SAndroid Build Coastguard Worker targetFreq=$(( FREQ * ( maxFreq - minFreq ) / 100 + minFreq )) 80*e1eccf28SAndroid Build Coastguard Worker 81*e1eccf28SAndroid Build Coastguard Worker # find closest frequency 82*e1eccf28SAndroid Build Coastguard Worker 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}'` 83*e1eccf28SAndroid Build Coastguard Worker selectedFreq[$core]=$freq 84*e1eccf28SAndroid Build Coastguard Worker 85*e1eccf28SAndroid Build Coastguard Worker # set frequency 86*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_min_freq" 87*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_max_freq" 88*e1eccf28SAndroid Build Coastguard Worker 89*e1eccf28SAndroid Build Coastguard Workerdone 90*e1eccf28SAndroid Build Coastguard Worker 91*e1eccf28SAndroid Build Coastguard Worker 92*e1eccf28SAndroid Build Coastguard Worker# keep trying until the frequencies are properly set 93*e1eccf28SAndroid Build Coastguard Workerwhile true; do 94*e1eccf28SAndroid Build Coastguard Worker 95*e1eccf28SAndroid Build Coastguard Worker # check to see if frequencies are correct 96*e1eccf28SAndroid Build Coastguard Worker CORRECT=true 97*e1eccf28SAndroid Build Coastguard Worker for core in $cores; do 98*e1eccf28SAndroid Build Coastguard Worker if fileexists $DIR/$core/online && [ `getprop $DIR/$core/online` -eq 0 ]; then 99*e1eccf28SAndroid Build Coastguard Worker echo "$core is offline" 100*e1eccf28SAndroid Build Coastguard Worker CORRECT=false 101*e1eccf28SAndroid Build Coastguard Worker else 102*e1eccf28SAndroid Build Coastguard Worker if fileexists $DIR/$core/cpufreq/scaling_cur_freq; then 103*e1eccf28SAndroid Build Coastguard Worker frequency=`getprop $DIR/$core/cpufreq/scaling_cur_freq` 104*e1eccf28SAndroid Build Coastguard Worker if [ $frequency != ${selectedFreq[$core]} ]; then 105*e1eccf28SAndroid Build Coastguard Worker echo "$core: $frequency != ${selectedFreq[$core]}" 106*e1eccf28SAndroid Build Coastguard Worker CORRECT=false 107*e1eccf28SAndroid Build Coastguard Worker fi 108*e1eccf28SAndroid Build Coastguard Worker else 109*e1eccf28SAndroid Build Coastguard Worker echo "$core is offline" 110*e1eccf28SAndroid Build Coastguard Worker CORRECT=false 111*e1eccf28SAndroid Build Coastguard Worker fi 112*e1eccf28SAndroid Build Coastguard Worker fi 113*e1eccf28SAndroid Build Coastguard Worker done 114*e1eccf28SAndroid Build Coastguard Worker 115*e1eccf28SAndroid Build Coastguard Worker # finished 116*e1eccf28SAndroid Build Coastguard Worker if [ $CORRECT == "true" ]; then 117*e1eccf28SAndroid Build Coastguard Worker break 118*e1eccf28SAndroid Build Coastguard Worker fi 119*e1eccf28SAndroid Build Coastguard Worker 120*e1eccf28SAndroid Build Coastguard Worker # display 121*e1eccf28SAndroid Build Coastguard Worker echo "Frequencies not properly set. Trying again..." 122*e1eccf28SAndroid Build Coastguard Worker 123*e1eccf28SAndroid Build Coastguard Worker # unfreeze system 124*e1eccf28SAndroid Build Coastguard Worker for service in ${SERVICES[@]}; do 125*e1eccf28SAndroid Build Coastguard Worker adb shell start $service 126*e1eccf28SAndroid Build Coastguard Worker done 127*e1eccf28SAndroid Build Coastguard Worker 128*e1eccf28SAndroid Build Coastguard Worker # wait for changes to be made 129*e1eccf28SAndroid Build Coastguard Worker sleep 1 130*e1eccf28SAndroid Build Coastguard Worker 131*e1eccf28SAndroid Build Coastguard Worker # freeze system 132*e1eccf28SAndroid Build Coastguard Worker for service in ${SERVICES[@]}; do 133*e1eccf28SAndroid Build Coastguard Worker adb shell stop $service 134*e1eccf28SAndroid Build Coastguard Worker done 135*e1eccf28SAndroid Build Coastguard Worker 136*e1eccf28SAndroid Build Coastguard Worker # try resetting the values (only really needed for Nexus 7 for some reason) 137*e1eccf28SAndroid Build Coastguard Worker for core in $cores; do 138*e1eccf28SAndroid Build Coastguard Worker if fileexists $DIR/$core/online; then 139*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n 1 > $DIR/$core/online" 140*e1eccf28SAndroid Build Coastguard Worker fi 141*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_min_freq" 142*e1eccf28SAndroid Build Coastguard Worker adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_max_freq" 143*e1eccf28SAndroid Build Coastguard Worker done 144*e1eccf28SAndroid Build Coastguard Worker 145*e1eccf28SAndroid Build Coastguard Worker sleep 1 146*e1eccf28SAndroid Build Coastguard Worker 147*e1eccf28SAndroid Build Coastguard Workerdone 148*e1eccf28SAndroid Build Coastguard Worker 149*e1eccf28SAndroid Build Coastguard Worker# display 150*e1eccf28SAndroid Build Coastguard Workerfor core in $cores; do 151*e1eccf28SAndroid Build Coastguard Worker echo "$core successfully set to ${selectedFreq[$core]}" 152*e1eccf28SAndroid Build Coastguard Workerdone 153*e1eccf28SAndroid Build Coastguard Worker 154*e1eccf28SAndroid Build Coastguard Worker 155