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