1 /* 2 * Copyright 2014 Intel Corporation All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.intel.thermal; 18 19 import android.content.Context; 20 import android.os.SystemProperties; 21 import android.util.Log; 22 23 import java.io.IOException; 24 import java.io.File; 25 26 /* importing static variables */ 27 import static com.intel.thermal.ThermalManager.*; 28 29 /** 30 * The ThermalUtils class contains all common utility functionality 31 * implementations 32 * 33 * @hide 34 */ 35 public class ThermalUtils { 36 private static final String TAG = "ThermalUtils"; 37 38 /* Native methods to access Sysfs Interfaces */ native_readSysfs(String path)39 private native static String native_readSysfs(String path); native_readSysfsTemp(String path)40 private native static int native_readSysfsTemp(String path); native_writeSysfs(String path, int val)41 private native static int native_writeSysfs(String path, int val); native_getThermalZoneIndex(String name)42 private native static int native_getThermalZoneIndex(String name); native_getThermalZoneIndexContains(String name)43 private native static int native_getThermalZoneIndexContains(String name); native_getCoolingDeviceIndex(String name)44 private native static int native_getCoolingDeviceIndex(String name); native_getCoolingDeviceIndexContains(String name)45 private native static int native_getCoolingDeviceIndexContains(String name); native_isFileExists(String name)46 private native static boolean native_isFileExists(String name); 47 48 // native methods to access kernel sysfs layer readSysfs(String path)49 public static String readSysfs(String path) { 50 try { 51 return native_readSysfs(path); 52 } catch (UnsatisfiedLinkError e) { 53 Log.w(TAG, "caught UnsatisfiedLinkError in readSysfs"); 54 return null; 55 } 56 } 57 readSysfsTemp(String path)58 public static int readSysfsTemp(String path) { 59 try { 60 return native_readSysfsTemp(path); 61 } catch (UnsatisfiedLinkError e) { 62 Log.i(TAG, "caught UnsatisfiedLinkError in readSysfsTemp"); 63 return INVALID_TEMP; 64 } 65 } 66 writeSysfs(String path, int val)67 public static int writeSysfs(String path, int val) { 68 try { 69 return native_writeSysfs(path, val); 70 } catch (UnsatisfiedLinkError e) { 71 Log.w(TAG, "caught UnsatisfiedLinkError in writeSysfs"); 72 return -1; 73 } 74 } 75 getThermalZoneIndex(String name)76 public static int getThermalZoneIndex(String name) { 77 try { 78 return native_getThermalZoneIndex(name); 79 } catch (UnsatisfiedLinkError e) { 80 Log.w(TAG, "caught UnsatisfiedLinkError in getThermalZoneIndex"); 81 return -1; 82 } 83 } 84 getThermalZoneIndexContains(String name)85 public static int getThermalZoneIndexContains(String name) { 86 try { 87 return native_getThermalZoneIndexContains(name); 88 } catch (UnsatisfiedLinkError e) { 89 Log.w(TAG, "caught UnsatisfiedLinkError in getThermalZoneIndexContains"); 90 return -1; 91 } 92 } 93 getCoolingDeviceIndex(String name)94 public static int getCoolingDeviceIndex(String name) { 95 try { 96 return native_getCoolingDeviceIndex(name); 97 } catch (UnsatisfiedLinkError e) { 98 Log.w(TAG, "caught UnsatisfiedLinkError in getCoolingDeviceIndex"); 99 return -1; 100 } 101 } 102 getCoolingDeviceIndexContains(String name)103 public static int getCoolingDeviceIndexContains(String name) { 104 try { 105 return native_getCoolingDeviceIndexContains(name); 106 } catch (UnsatisfiedLinkError e) { 107 Log.w(TAG, "caught UnsatisfiedLinkError in getCoolingDeviceIndexContains"); 108 return -1; 109 } 110 } 111 isFileExists(String path)112 public static boolean isFileExists(String path) { 113 try { 114 return native_isFileExists(path); 115 } catch (UnsatisfiedLinkError e) { 116 Log.w(TAG, "caught UnsatisfiedLinkError in isFileExists"); 117 return false; 118 } 119 } 120 121 calculateThermalState(int temp, Integer thresholds[])122 public static int calculateThermalState(int temp, Integer thresholds[]) { 123 if (thresholds == null) return THERMAL_STATE_OFF; 124 // Return OFF state if temperature less than starting of thresholds 125 if (temp < thresholds[0]) 126 return THERMAL_STATE_OFF; 127 128 if (temp >= thresholds[thresholds.length - 2]) 129 return (thresholds.length - 2); 130 131 for (int i = 0; i < thresholds.length - 1; i++) { 132 if (temp >= thresholds[i] && temp < thresholds[i + 1]) { 133 return i; 134 } 135 } 136 137 // should never come here 138 return THERMAL_STATE_OFF; 139 } 140 getLowerThresholdTemp(int index, Integer thresholds[])141 public static int getLowerThresholdTemp(int index, Integer thresholds[]) { 142 if (thresholds == null) return INVALID_TEMP; 143 if (index < 0 || index >= thresholds.length) 144 return INVALID_TEMP; 145 return thresholds[index]; 146 } 147 getUpperThresholdTemp(int index, Integer thresholds[])148 public static int getUpperThresholdTemp(int index, Integer thresholds[]) { 149 if (thresholds == null) return INVALID_TEMP; 150 if (index < 0 || index >= thresholds.length) 151 return INVALID_TEMP; 152 return thresholds[index + 1]; 153 } 154 getTjMax()155 public static void getTjMax() { 156 ThermalManager.sTjMaxTemp = readSysfsTemp(ThermalManager.TJMAX_PATH); 157 if (ThermalManager.sTjMaxTemp <= ThermalManager.ABS_ZERO) { 158 Log.i(TAG, "TjMax temp read failed, Default TjMax value =" + 159 ThermalManager.sTjMaxTemp); 160 ThermalManager.sTjMaxTemp = ThermalManager.sDefaultTjMax; 161 } 162 } 163 initialiseConfigFiles(Context context)164 public static void initialiseConfigFiles(Context context) { 165 if ("1".equals(SystemProperties.get("persist.thermal.debug.xml", "0"))) { 166 if (isFileExists(DEBUG_DIR_PATH + SENSOR_FILE_NAME) && 167 isFileExists(DEBUG_DIR_PATH + THROTTLE_FILE_NAME)) { 168 sSensorFilePath = DEBUG_DIR_PATH + SENSOR_FILE_NAME; 169 sThrottleFilePath = DEBUG_DIR_PATH + THROTTLE_FILE_NAME; 170 Log.i(TAG, "Reading thermal config files from /data/"); 171 sIsConfigFiles = true; 172 } else { 173 Log.i(TAG, "systemProperty set to read config files from /data/, but files absent"); 174 } 175 } else if (isFileExists(DEFAULT_DIR_PATH + SENSOR_FILE_NAME) && 176 isFileExists(DEFAULT_DIR_PATH + THROTTLE_FILE_NAME)) { 177 sSensorFilePath = DEFAULT_DIR_PATH + SENSOR_FILE_NAME; 178 sThrottleFilePath = DEFAULT_DIR_PATH + THROTTLE_FILE_NAME; 179 Log.i(TAG, "Reading thermal config files from /system/etc/"); 180 sIsConfigFiles = true; 181 } else { 182 sSensorFileXmlId = context.getResources(). 183 getIdentifier("thermal_sensor_config", "xml", "com.intel.thermal"); 184 sThrottleFileXmlId = context.getResources(). 185 getIdentifier("thermal_throttle_config", "xml", "com.intel.thermal"); 186 if (sSensorFileXmlId != 0 && sThrottleFileXmlId != 0) { 187 Log.i(TAG, "Reading thermal config files from overlays"); 188 sIsOverlays = true; 189 } else { 190 Log.i(TAG, "Unable to retrieve config files from overlays"); 191 } 192 } 193 } 194 } 195