/** Copyright (C) 2013 Louis Teboul (a.k.a Androguide) * * admin@pimpmyrom.org || louisteboul@gmail.com * http://pimpmyrom.org || http://androguide.fr * 71 quai Clémenceau, 69300 Caluire-et-Cuire, FRANCE. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. **/ package com.androguide.honamicontrol.bootservice; import android.content.Context; import android.content.SharedPreferences; import com.androguide.honamicontrol.helpers.CMDProcessor.CMDProcessor; import com.androguide.honamicontrol.helpers.CPUHelper; import com.androguide.honamicontrol.helpers.Helpers; import com.androguide.honamicontrol.kernel.colorcontrol.ColorControlInterface; import com.androguide.honamicontrol.kernel.cpucontrol.CPUInterface; import com.androguide.honamicontrol.kernel.gpucontrol.GPUInterface; import com.androguide.honamicontrol.kernel.iotweaks.IOTweaksInterface; import com.androguide.honamicontrol.kernel.memory.MemoryManagementInterface; import com.androguide.honamicontrol.kernel.misc.MiscInterface; import com.androguide.honamicontrol.kernel.powermanagement.PowerManagementInterface; import com.androguide.honamicontrol.kernel.voltagecontrol.VoltageInterface; import com.androguide.honamicontrol.soundcontrol.SoundControlInterface; import com.androguide.honamicontrol.touchscreen.TouchScreenInterface; public class BootHelper { public static void generateScriptFromPrefs(SharedPreferences prefs, Context context) { int CPU_MAX_FREQ = Integer.valueOf(prefs.getString("CPU_MAX_FREQ", "2150400")); int CPU_MIN_FREQ = Integer.valueOf(prefs.getString("CPU_MIN_FREQ", "300000")); int GPU_MAX_FREQ = Integer.valueOf(prefs.getString("GPU_MAX_FREQ", "450000000")); int GPU_MIN_FREQ = Integer.valueOf(prefs.getString("GPU_MIN_FREQ", "200000000")); int SCHED_MC_LEVEL = prefs.getInt("SCHED_MC_LEVEL", 0); int KSM_PAGES_TO_SCAN = prefs.getInt(MemoryManagementInterface.KSM_PAGES_TO_SCAN.replaceAll("/", "_"), 100); int KSM_SLEEP_TIMER = prefs.getInt(MemoryManagementInterface.KSM_SLEEP_TIMER.replaceAll("/", "_"), 500); int FASTCHARGE_MODE = prefs.getInt("FASTCHARGE_MODE", 0); int HOTPLUG_DRIVER = prefs.getInt("HOTPLUG_DRIVER", 0); int ALUCARD_CORES = prefs.getInt("ALUCARD_CORES", 4); int INTELLI_CORES = prefs.getInt("INTELLI_PLUG_ECO_CORES", 2); int VFS_CACHE_PRESSURE = prefs.getInt(MemoryManagementInterface.VFS_CACHE_PRESSURE, 100); int SWAPPINESS = prefs.getInt(MemoryManagementInterface.SWAPPINESS, 60); int DIRTY_RATIO = prefs.getInt(MemoryManagementInterface.DIRTY_RATIO, 20); int DIRTY_BG_RATIO = prefs.getInt(MemoryManagementInterface.DIRTY_BG_RATIO, 5); int DIRTY_WRITEBACK = prefs.getInt(MemoryManagementInterface.DIRTY_WRITEBACK_CENTISECS, 500); int DIRTY_EXPIRE = prefs.getInt(MemoryManagementInterface.DIRTY_EXPIRE_CENTISECS, 200); Boolean DYNAMIC_FSYNC = prefs.getBoolean("DYNAMIC_FSYNC", false); Boolean INTELLI_PLUG_ECO = prefs.getBoolean("INTELLI_PLUG_ECO", false); Boolean POWER_SUSPEND = prefs.getBoolean("POWER_SUSPEND", false); Boolean PEN_MODE = prefs.getBoolean("PEN_MODE", false); Boolean GLOVE_MODE = prefs.getBoolean("GLOVE_MODE", false); Boolean DT2WAKE = prefs.getBoolean("DT2WAKE", false); Boolean KSM_ENABLED = prefs.getBoolean("KSM_ENABLED", false); Boolean SNAKE_CHARMER = prefs.getBoolean("SNAKE_CHARMER", true); Boolean EMMC_ENTROPY = prefs.getBoolean("EMMC_ENTROPY_CONTRIB", true); Boolean SD_ENTROPY = prefs.getBoolean("SD_ENTROPY_CONTRIB", true); Boolean MSM_THERMAL = prefs.getBoolean("MSM_THERMAL", false); String CORE0_GOV = prefs.getString("CORE0_GOVERNOR", "intellidemand"); String CORE1_GOV = prefs.getString("CORE1_GOVERNOR", "intellidemand"); String CORE2_GOV = prefs.getString("CORE2_GOVERNOR", "intellidemand"); String CORE3_GOV = prefs.getString("CORE3_GOVERNOR", "intellidemand"); String GPU_GOV = prefs.getString("GPU_GOVERNOR", "msm-adreno-tz"); String IO_SCHED_EMMC = prefs.getString("IO_SCHEDULER", "row"); String IO_SCHED_SD = prefs.getString("IO_SCHEDULER_SD", "row"); String TCP_ALGORITHM = prefs.getString("TCP_ALGORITHM", "cubic"); String EMMC_READAHEAD = prefs.getString("EMMC_READAHEAD", "1024"); String SD_READAHEAD = prefs.getString("SD_READAHEAD", "1024"); String SC_MIC = prefs.getString("SC_MIC", "0 0 255"); String SC_CAM_MIC = prefs.getString("SC_CAM_MIC", "0 0 255"); String SC_HEADPHONE_PA = prefs.getString("HEADPHONE_PA", "38 38 179"); String SC_HEADPHONE = prefs.getString("HEADPHONE", "0 0 255"); String SC_SPEAKER = prefs.getString("SPEAKER", "0 0 255"); String FASTCHARGE_LEVEL = prefs.getString("FASTCHARGE_LEVEL", "500"); String KCAL_CONFIG = prefs.getString("KCAL_CONFIG", "255 255 255"); String VOLTAGE_TABLE = prefs.getString("CURRENT_VOLTAGE_TABLE", prefs.getString("DEFAULT_VOLTAGE_TABLE", "")); // Governor Customization SharedPreferences govPrefs = context.getSharedPreferences("GOVERNOR_CUSTOMIZATION", 0); String TARGET_GOV = govPrefs.getString("TARGET_GOV", CPUHelper.readOneLineNotRoot(CPUInterface.GOVERNOR_ALL_CORES)); if (Helpers.doesFileExist(CPUInterface.GOV_CUSTOMIZATION + "/" + TARGET_GOV)) { String[] paramsList = CMDProcessor.runShellCommand("ls " + CPUInterface.GOV_CUSTOMIZATION + "/" + TARGET_GOV) .getStdout().split("\n"); String commands = ""; for (final String param : paramsList) { String key = govPrefs.getString(param, "null"); if (!key.equals("null")) commands += key + "\n"; } CMDProcessor.runSuCommand(commands); } String applyMaxCpuFreq = "busybox echo " + CPU_MAX_FREQ + " > " + CPUInterface.MAX_FREQ; String applyMsmThermal; if (SNAKE_CHARMER) applyMaxCpuFreq += "\nbusybox echo " + CPU_MAX_FREQ + " > " + CPUInterface.SNAKE_CHARMER_MAX_FREQ; if (MSM_THERMAL) applyMsmThermal = "busybox echo Y > " + CPUInterface.MSM_THERMAL; else applyMsmThermal = "busybox echo N > " + CPUInterface.MSM_THERMAL; String applyMinCpuFreq = "busybox echo " + CPU_MIN_FREQ + " > " + CPUInterface.MIN_FREQ; String applyMaxGpuFreq = "busybox echo " + GPU_MAX_FREQ + " > " + GPUInterface.maxFreq; String applyMinGpuFreq = "busybox echo " + GPU_MIN_FREQ + " > " + GPUInterface.minFreq; String applyCore0Governor = "busybox echo " + CORE0_GOV + " > " + CPUInterface.GOVERNOR; String applyCore1Governor = "busybox echo " + CORE1_GOV + " > " + CPUInterface.GOVERNOR2; String applyCore2Governor = "busybox echo " + CORE2_GOV + " > " + CPUInterface.GOVERNOR3; String applyCore3Governor = "busybox echo " + CORE3_GOV + " > " + CPUInterface.GOVERNOR4; String applyGpuGovernor = "busybox echo " + GPU_GOV + " > " + GPUInterface.currGovernor; String applyIOScheduler = "busybox echo " + IO_SCHED_EMMC + " > " + IOTweaksInterface.IO_SCHEDULER; String applyIOSchedulerSD = "busybox echo " + IO_SCHED_SD + " > " + IOTweaksInterface.IO_SCHEDULER_SD; String applyTcpAlgorithm = "busybox echo " + TCP_ALGORITHM + " > " + CPUInterface.CURR_TCP_ALGORITHM + "\n" + CPUInterface.SYSCTL_TCP_ALGORITHM + TCP_ALGORITHM; String applySchedMcLevel = "busybox echo " + SCHED_MC_LEVEL + " > " + PowerManagementInterface.SCHED_MC_POWER_SAVINGS; String applyDynamicFsync = "busybox echo " + getIntFromBoolean(DYNAMIC_FSYNC) + " > " + IOTweaksInterface.DYNAMIC_FSYNC_TOGGLE; String applyIntelliPlugEco = "busybox echo " + getIntFromBoolean(INTELLI_PLUG_ECO) + " > " + PowerManagementInterface.INTELLI_PLUG_ECO_MODE; String applyPowerSuspend = "busybox echo " + getIntFromBoolean(POWER_SUSPEND) + " > " + PowerManagementInterface.POWER_SUSPEND_TOGGLE; String applyPenMode = "chown system:system " + TouchScreenInterface.PEN_MODE + "\nbusybox echo " + getIntFromBoolean(PEN_MODE) + " > " + TouchScreenInterface.PEN_MODE; String applyGloveMode = "chown system:system " + TouchScreenInterface.PEN_MODE + "\nbusybox echo " + getIntFromBoolean(GLOVE_MODE) + " > " + TouchScreenInterface.GLOVE_MODE; String applyDt2Wake = "busybox echo " + getIntFromBoolean(DT2WAKE) + " > " + TouchScreenInterface.DT2WAKE; String applyScHeadphone = "busybox echo " + SC_HEADPHONE + " > " + SoundControlInterface.FAUX_SC_HEADPHONE; String applyScHeadphonePa = "busybox echo " + SC_HEADPHONE_PA + " > " + SoundControlInterface.FAUX_SC_HEADPHONE_POWERAMP; String applyScSpeaker = "busybox echo " + SC_SPEAKER + " > " + SoundControlInterface.FAUX_SC_SPEAKER; String applyScMic = "busybox echo " + SC_MIC + " > " + SoundControlInterface.FAUX_SC_MIC; String applyScCamMic = "busybox echo " + SC_CAM_MIC + " > " + SoundControlInterface.FAUX_SC_CAM_MIC; String applyKSM = "busybox echo " + getIntFromBoolean(KSM_ENABLED) + " > " + MemoryManagementInterface.KSM_TOGGLE; String applyKSMPages = "busybox echo " + KSM_PAGES_TO_SCAN + " > " + MemoryManagementInterface.KSM_PAGES_TO_SCAN; String applyKSMTimer = "busybox echo " + KSM_SLEEP_TIMER + " > " + MemoryManagementInterface.KSM_SLEEP_TIMER; String applyEmmcReadahead = "busybox echo " + EMMC_READAHEAD + " > " + IOTweaksInterface.EMMC_READAHEAD; String applySDReadahead = "busybox echo " + SD_READAHEAD + " > " + IOTweaksInterface.SD_READAHEAD; String applyEmmcEntropy = "busybox echo " + EMMC_ENTROPY + " > " + IOTweaksInterface.EMMC_ENTROPY_CONTRIB; String applySDEntropy = "busybox echo " + SD_ENTROPY + " > " + IOTweaksInterface.SD_ENTROPY_CONTRIB; String applyFastChargeMode = "busybox echo " + FASTCHARGE_MODE + " > " + MiscInterface.FORCE_FAST_CHARGE; String applyFastChargeLevel = "busybox echo " + FASTCHARGE_LEVEL + " > " + MiscInterface.FAST_CHARGE_LEVEL; String applyColorControl = "busybox echo \"" + KCAL_CONFIG + "\" > " + ColorControlInterface.GAMMA_KCAL + "\nbusybox echo 1 > " + ColorControlInterface.GAMMA_OK; String applyVoltages = "busybox echo \"" + VOLTAGE_TABLE + "\" > " + VoltageInterface.UV_MV_TABLE; Helpers.CMDProcessorWrapper.runSuCommand( applyMaxCpuFreq + "\n" + applyMinCpuFreq + "\n" + applyMaxGpuFreq + "\n" + applyMinGpuFreq + "\n" + applyCore0Governor + "\n" + applyCore1Governor + "\n" + applyCore2Governor + "\n" + applyCore3Governor + "\n" + applyIOScheduler + "\n" + applyIOSchedulerSD + "\n" + applyEmmcReadahead + "\n" + applySDReadahead + "\n" + applyEmmcEntropy + "\n" + applySDEntropy + "\n" + applyTcpAlgorithm + "\n" + applyGpuGovernor + "\n" + "echo 0 > " + SoundControlInterface.FAUX_SC_LOCKED + "\n" + applyScHeadphone + "\n" + applyScHeadphonePa + "\n" + applyScSpeaker + "\n" + applyScMic + "\n" + applyScCamMic + "\n" + "echo 1 > " + SoundControlInterface.FAUX_SC_LOCKED + "\n" + applySchedMcLevel + "\n" + applyDynamicFsync + "\n" + applyPowerSuspend + "\n" + applyMsmThermal + "\n" + applyKSM + "\n" + applyKSMPages + "\n" + applyKSMTimer + "\n" + applyColorControl + "\n" + applyFastChargeMode + "\n" + applyFastChargeLevel + "\n" + applyPenMode + "\n" + applyGloveMode + "\n" + applyDt2Wake + "\n" + applyVoltages ); switch (HOTPLUG_DRIVER) { case 0: CMDProcessor.runSuCommand("echo 0 > " + PowerManagementInterface.INTELLI_PLUG_TOGGLE); CMDProcessor.runSuCommand("echo 0 > " + PowerManagementInterface.ALUCARD_HOTPLUG_TOGGLE); CMDProcessor.runSuCommand("start mpdecision"); break; case 1: CMDProcessor.runSuCommand("echo 0 > " + PowerManagementInterface.ALUCARD_HOTPLUG_TOGGLE); CMDProcessor.runSuCommand("stop mpdecision"); CMDProcessor.runSuCommand("echo 1 > " + PowerManagementInterface.INTELLI_PLUG_TOGGLE); CMDProcessor.runSuCommand("echo " + INTELLI_CORES + " > " + PowerManagementInterface.INTELLI_PLUG_ECO_CORES); break; case 2: CMDProcessor.runSuCommand("echo 0 > " + PowerManagementInterface.INTELLI_PLUG_TOGGLE); CMDProcessor.runSuCommand("stop mpdecision"); CMDProcessor.runSuCommand("echo 1 > " + PowerManagementInterface.ALUCARD_HOTPLUG_TOGGLE); CMDProcessor.runSuCommand("echo " + ALUCARD_CORES + " > " + PowerManagementInterface.ALUCARD_HOTPLUG_CORES); break; default: break; } CMDProcessor.runSuCommand(applyIntelliPlugEco); Helpers.applySysctlValue(MemoryManagementInterface.VFS_CACHE_PRESSURE, VFS_CACHE_PRESSURE + ""); Helpers.applySysctlValue(MemoryManagementInterface.SWAPPINESS, SWAPPINESS + ""); Helpers.applySysctlValue(MemoryManagementInterface.DIRTY_RATIO, DIRTY_RATIO + ""); Helpers.applySysctlValue(MemoryManagementInterface.DIRTY_BG_RATIO, DIRTY_BG_RATIO + ""); Helpers.applySysctlValue(MemoryManagementInterface.DIRTY_WRITEBACK_CENTISECS, DIRTY_WRITEBACK + ""); Helpers.applySysctlValue(MemoryManagementInterface.DIRTY_EXPIRE_CENTISECS, DIRTY_EXPIRE + ""); } private static int getIntFromBoolean(Boolean bool) { if (bool) return 1; else return 0; } }