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