/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_INCLUDE_HARDWARE_THERMAL_H #define ANDROID_INCLUDE_HARDWARE_THERMAL_H #include #include #include #include #include __BEGIN_DECLS #define THERMAL_HARDWARE_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1) #define THERMAL_HARDWARE_MODULE_ID "thermal" // This value is returned if a desired temperature is not available. #define UNKNOWN_TEMPERATURE -FLT_MAX /** Device temperature types. Must be kept in sync with * framework/base/core/java/android/os/HardwarePropertiesManager.java */ enum temperature_type { DEVICE_TEMPERATURE_UNKNOWN = -1, DEVICE_TEMPERATURE_CPU = 0, DEVICE_TEMPERATURE_GPU = 1, DEVICE_TEMPERATURE_BATTERY = 2, DEVICE_TEMPERATURE_SKIN = 3 }; enum cooling_type { /** Fan cooling device speed in RPM. */ FAN_RPM = 0, }; typedef struct { /** * This temperature's type. */ enum temperature_type type; /** * Name of this temperature. * All temperatures of the same "type" must have a different "name". */ const char *name; /** * Current temperature in Celsius. If not available set by HAL to * UNKNOWN_TEMPERATURE. * Current temperature can be in any units if * type=DEVICE_TEMPERATURE_UNKNOWN. */ float current_value; /** * Throttling temperature constant for this temperature. * If not available, set by HAL to UNKNOWN_TEMPERATURE. */ float throttling_threshold; /** * Shutdown temperature constant for this temperature. * If not available, set by HAL to UNKNOWN_TEMPERATURE. */ float shutdown_threshold; /** * Threshold temperature above which the VR mode clockrate minimums cannot * be maintained for this device. * If not available, set by HAL to UNKNOWN_TEMPERATURE. */ float vr_throttling_threshold; } temperature_t; typedef struct { /** * This cooling device type. */ enum cooling_type type; /** * Name of this cooling device. * All cooling devices of the same "type" must have a different "name". */ const char *name; /** * Current cooling device value. Units depend on cooling device "type". */ float current_value; } cooling_device_t; typedef struct { /** * Name of this CPU. * All CPUs must have a different "name". */ const char *name; /** * Active time since the last boot in ms. */ uint64_t active; /** * Total time since the last boot in ms. */ uint64_t total; /** * Is set to true when a core is online. * If the core is offline, all other members except |name| should be ignored. */ bool is_online; } cpu_usage_t; typedef struct thermal_module { struct hw_module_t common; /* * (*getTemperatures) is called to get temperatures in Celsius. * * @param list If NULL, this method only returns number of temperatures * and caller should allocate a temperature_t array with that number * of elements. * Caller is responsible for allocating temperature_t array |list| of * large enough size (not less than returned number of temperatures). * If |list| is not NULL and this method returns non-negative value, * it's filled with the current temperatures. If the resulting * temperature list is longer than |size| elements, the remaining * temperatures are discarded and not stored, but counted for the value * returned by this method. * The order of temperatures of built-in devices (such as CPUs, GPUs and * etc.) in the |list| is kept the same regardless the number of calls * to this method even if they go offline, if these devices exist on * boot. The method always returns and never removes such temperatures. * @param size The capacity of |list|, in elements, if |list| is not NULL. * * @return number of temperatures or negative value -errno on error. * */ ssize_t (*getTemperatures)(struct thermal_module *module, temperature_t *list, size_t size); /* * (*getCpuUsages) is called to get CPU usage information of each core: * active and total times in ms since first boot. * * @param list If NULL, this method only returns number of cores and caller * should allocate a cpu_usage_t array with that number of elements. * Caller is responsible for allocating cpu_usage_t array |list| of * large enough size (not less than returned number of CPUs). * If |list| is not NULL and this method returns non-negative value, * it's filled with the current CPU usages. * The order of CPUs in the |list| is kept the same regardless the * number of calls to this method. * * @return constant number of CPUs or negative value -errno on error. * */ ssize_t (*getCpuUsages)(struct thermal_module *module, cpu_usage_t *list); /* * (*getCoolingDevices) is called to get the cooling devices information. * * @param list If NULL, this method only returns number of cooling devices * and caller should allocate a cooling_device_t array with that number * of elements. * Caller is responsible for allocating cooling_device_t array |list| of * large enough size (not less than returned number of cooling devices). * If |list| is not NULL and this method returns non-negative value, * it's filled with the current cooling device information. If the * resulting cooling device list is longer than |size| elements, the * remaining cooling device informations are discarded and not stored, * but counted for the value returned by this method. * The order of built-in coolling devices in the |list| is kept the same * regardless the number of calls to this method even if they go * offline, if these devices exist on boot. The method always returns * and never removes from the list such coolling devices. * @param size The capacity of |list|, in elements, if |list| is not NULL. * * @return number of cooling devices or negative value -errno on error. * */ ssize_t (*getCoolingDevices)(struct thermal_module *module, cooling_device_t *list, size_t size); } thermal_module_t; __END_DECLS #endif // ANDROID_INCLUDE_HARDWARE_THERMAL_H