1 /* 2 * Copyright (C) 2016 The Android Open Source Project 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 #ifndef ANDROID_INCLUDE_HARDWARE_THERMAL_H 18 #define ANDROID_INCLUDE_HARDWARE_THERMAL_H 19 20 #include <stdbool.h> 21 #include <stdint.h> 22 #include <float.h> 23 #include <sys/cdefs.h> 24 #include <sys/types.h> 25 26 #include <hardware/hardware.h> 27 28 __BEGIN_DECLS 29 30 #define THERMAL_HARDWARE_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1) 31 32 #define THERMAL_HARDWARE_MODULE_ID "thermal" 33 34 // This value is returned if a desired temperature is not available. 35 #define UNKNOWN_TEMPERATURE -FLT_MAX 36 37 /** Device temperature types. Must be kept in sync with 38 * framework/base/core/java/android/os/HardwarePropertiesManager.java 39 */ 40 enum temperature_type { 41 DEVICE_TEMPERATURE_UNKNOWN = -1, 42 DEVICE_TEMPERATURE_CPU = 0, 43 DEVICE_TEMPERATURE_GPU = 1, 44 DEVICE_TEMPERATURE_BATTERY = 2, 45 DEVICE_TEMPERATURE_SKIN = 3 46 }; 47 48 enum cooling_type { 49 /** Fan cooling device speed in RPM. */ 50 FAN_RPM = 0, 51 }; 52 53 typedef struct { 54 /** 55 * This temperature's type. 56 */ 57 enum temperature_type type; 58 59 /** 60 * Name of this temperature. 61 * All temperatures of the same "type" must have a different "name". 62 */ 63 const char *name; 64 65 /** 66 * Current temperature in Celsius. If not available set by HAL to 67 * UNKNOWN_TEMPERATURE. 68 * Current temperature can be in any units if 69 * type=DEVICE_TEMPERATURE_UNKNOWN. 70 */ 71 float current_value; 72 73 /** 74 * Throttling temperature constant for this temperature. 75 * If not available, set by HAL to UNKNOWN_TEMPERATURE. 76 */ 77 float throttling_threshold; 78 79 /** 80 * Shutdown temperature constant for this temperature. 81 * If not available, set by HAL to UNKNOWN_TEMPERATURE. 82 */ 83 float shutdown_threshold; 84 85 /** 86 * Threshold temperature above which the VR mode clockrate minimums cannot 87 * be maintained for this device. 88 * If not available, set by HAL to UNKNOWN_TEMPERATURE. 89 */ 90 float vr_throttling_threshold; 91 } temperature_t; 92 93 typedef struct { 94 /** 95 * This cooling device type. 96 */ 97 enum cooling_type type; 98 99 /** 100 * Name of this cooling device. 101 * All cooling devices of the same "type" must have a different "name". 102 */ 103 const char *name; 104 105 /** 106 * Current cooling device value. Units depend on cooling device "type". 107 */ 108 float current_value; 109 } cooling_device_t; 110 111 typedef struct { 112 /** 113 * Name of this CPU. 114 * All CPUs must have a different "name". 115 */ 116 const char *name; 117 118 /** 119 * Active time since the last boot in ms. 120 */ 121 uint64_t active; 122 123 /** 124 * Total time since the last boot in ms. 125 */ 126 uint64_t total; 127 128 /** 129 * Is set to true when a core is online. 130 * If the core is offline, all other members except |name| should be ignored. 131 */ 132 bool is_online; 133 } cpu_usage_t; 134 135 typedef struct thermal_module { 136 struct hw_module_t common; 137 138 /* 139 * (*getTemperatures) is called to get temperatures in Celsius. 140 * 141 * @param list If NULL, this method only returns number of temperatures 142 * and caller should allocate a temperature_t array with that number 143 * of elements. 144 * Caller is responsible for allocating temperature_t array |list| of 145 * large enough size (not less than returned number of temperatures). 146 * If |list| is not NULL and this method returns non-negative value, 147 * it's filled with the current temperatures. If the resulting 148 * temperature list is longer than |size| elements, the remaining 149 * temperatures are discarded and not stored, but counted for the value 150 * returned by this method. 151 * The order of temperatures of built-in devices (such as CPUs, GPUs and 152 * etc.) in the |list| is kept the same regardless the number of calls 153 * to this method even if they go offline, if these devices exist on 154 * boot. The method always returns and never removes such temperatures. 155 * @param size The capacity of |list|, in elements, if |list| is not NULL. 156 * 157 * @return number of temperatures or negative value -errno on error. 158 * 159 */ 160 ssize_t (*getTemperatures)(struct thermal_module *module, temperature_t *list, size_t size); 161 162 /* 163 * (*getCpuUsages) is called to get CPU usage information of each core: 164 * active and total times in ms since first boot. 165 * 166 * @param list If NULL, this method only returns number of cores and caller 167 * should allocate a cpu_usage_t array with that number of elements. 168 * Caller is responsible for allocating cpu_usage_t array |list| of 169 * large enough size (not less than returned number of CPUs). 170 * If |list| is not NULL and this method returns non-negative value, 171 * it's filled with the current CPU usages. 172 * The order of CPUs in the |list| is kept the same regardless the 173 * number of calls to this method. 174 * 175 * @return constant number of CPUs or negative value -errno on error. 176 * 177 */ 178 ssize_t (*getCpuUsages)(struct thermal_module *module, cpu_usage_t *list); 179 180 /* 181 * (*getCoolingDevices) is called to get the cooling devices information. 182 * 183 * @param list If NULL, this method only returns number of cooling devices 184 * and caller should allocate a cooling_device_t array with that number 185 * of elements. 186 * Caller is responsible for allocating cooling_device_t array |list| of 187 * large enough size (not less than returned number of cooling devices). 188 * If |list| is not NULL and this method returns non-negative value, 189 * it's filled with the current cooling device information. If the 190 * resulting cooling device list is longer than |size| elements, the 191 * remaining cooling device informations are discarded and not stored, 192 * but counted for the value returned by this method. 193 * The order of built-in coolling devices in the |list| is kept the same 194 * regardless the number of calls to this method even if they go 195 * offline, if these devices exist on boot. The method always returns 196 * and never removes from the list such coolling devices. 197 * @param size The capacity of |list|, in elements, if |list| is not NULL. 198 * 199 * @return number of cooling devices or negative value -errno on error. 200 * 201 */ 202 ssize_t (*getCoolingDevices)(struct thermal_module *module, cooling_device_t *list, 203 size_t size); 204 205 } thermal_module_t; 206 207 __END_DECLS 208 209 #endif // ANDROID_INCLUDE_HARDWARE_THERMAL_H 210