1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*61046927SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*61046927SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*61046927SAndroid Build Coastguard Worker * 8*61046927SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*61046927SAndroid Build Coastguard Worker * 10*61046927SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*61046927SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*61046927SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*61046927SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*61046927SAndroid Build Coastguard Worker * limitations under the License. 15*61046927SAndroid Build Coastguard Worker */ 16*61046927SAndroid Build Coastguard Worker 17*61046927SAndroid Build Coastguard Worker #ifndef ANDROID_INCLUDE_HARDWARE_HARDWARE_H 18*61046927SAndroid Build Coastguard Worker #define ANDROID_INCLUDE_HARDWARE_HARDWARE_H 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Worker #include <stdint.h> 21*61046927SAndroid Build Coastguard Worker #include <sys/cdefs.h> 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker #include <cutils/native_handle.h> 24*61046927SAndroid Build Coastguard Worker #include <system/graphics.h> 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker __BEGIN_DECLS 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker /* 29*61046927SAndroid Build Coastguard Worker * Value for the hw_module_t.tag field 30*61046927SAndroid Build Coastguard Worker */ 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker #define MAKE_TAG_CONSTANT(A,B,C,D) (((A) << 24) | ((B) << 16) | ((C) << 8) | (D)) 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker #define HARDWARE_MODULE_TAG MAKE_TAG_CONSTANT('H', 'W', 'M', 'T') 35*61046927SAndroid Build Coastguard Worker #define HARDWARE_DEVICE_TAG MAKE_TAG_CONSTANT('H', 'W', 'D', 'T') 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker #define HARDWARE_MAKE_API_VERSION(maj,min) \ 38*61046927SAndroid Build Coastguard Worker ((((maj) & 0xff) << 8) | ((min) & 0xff)) 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker #define HARDWARE_MAKE_API_VERSION_2(maj,min,hdr) \ 41*61046927SAndroid Build Coastguard Worker ((((maj) & 0xff) << 24) | (((min) & 0xff) << 16) | ((hdr) & 0xffff)) 42*61046927SAndroid Build Coastguard Worker #define HARDWARE_API_VERSION_2_MAJ_MIN_MASK 0xffff0000 43*61046927SAndroid Build Coastguard Worker #define HARDWARE_API_VERSION_2_HEADER_MASK 0x0000ffff 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker /* 47*61046927SAndroid Build Coastguard Worker * The current HAL API version. 48*61046927SAndroid Build Coastguard Worker * 49*61046927SAndroid Build Coastguard Worker * All module implementations must set the hw_module_t.hal_api_version field 50*61046927SAndroid Build Coastguard Worker * to this value when declaring the module with HAL_MODULE_INFO_SYM. 51*61046927SAndroid Build Coastguard Worker * 52*61046927SAndroid Build Coastguard Worker * Note that previous implementations have always set this field to 0. 53*61046927SAndroid Build Coastguard Worker * Therefore, libhardware HAL API will always consider versions 0.0 and 1.0 54*61046927SAndroid Build Coastguard Worker * to be 100% binary compatible. 55*61046927SAndroid Build Coastguard Worker * 56*61046927SAndroid Build Coastguard Worker */ 57*61046927SAndroid Build Coastguard Worker #define HARDWARE_HAL_API_VERSION HARDWARE_MAKE_API_VERSION(1, 0) 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker /* 60*61046927SAndroid Build Coastguard Worker * Helper macros for module implementors. 61*61046927SAndroid Build Coastguard Worker * 62*61046927SAndroid Build Coastguard Worker * The derived modules should provide convenience macros for supported 63*61046927SAndroid Build Coastguard Worker * versions so that implementations can explicitly specify module/device 64*61046927SAndroid Build Coastguard Worker * versions at definition time. 65*61046927SAndroid Build Coastguard Worker * 66*61046927SAndroid Build Coastguard Worker * Use this macro to set the hw_module_t.module_api_version field. 67*61046927SAndroid Build Coastguard Worker */ 68*61046927SAndroid Build Coastguard Worker #define HARDWARE_MODULE_API_VERSION(maj,min) HARDWARE_MAKE_API_VERSION(maj,min) 69*61046927SAndroid Build Coastguard Worker #define HARDWARE_MODULE_API_VERSION_2(maj,min,hdr) HARDWARE_MAKE_API_VERSION_2(maj,min,hdr) 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker /* 72*61046927SAndroid Build Coastguard Worker * Use this macro to set the hw_device_t.version field 73*61046927SAndroid Build Coastguard Worker */ 74*61046927SAndroid Build Coastguard Worker #define HARDWARE_DEVICE_API_VERSION(maj,min) HARDWARE_MAKE_API_VERSION(maj,min) 75*61046927SAndroid Build Coastguard Worker #define HARDWARE_DEVICE_API_VERSION_2(maj,min,hdr) HARDWARE_MAKE_API_VERSION_2(maj,min,hdr) 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker struct hw_module_t; 78*61046927SAndroid Build Coastguard Worker struct hw_module_methods_t; 79*61046927SAndroid Build Coastguard Worker struct hw_device_t; 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Worker /** 82*61046927SAndroid Build Coastguard Worker * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM 83*61046927SAndroid Build Coastguard Worker * and the fields of this data structure must begin with hw_module_t 84*61046927SAndroid Build Coastguard Worker * followed by module specific information. 85*61046927SAndroid Build Coastguard Worker */ 86*61046927SAndroid Build Coastguard Worker typedef struct hw_module_t { 87*61046927SAndroid Build Coastguard Worker /** tag must be initialized to HARDWARE_MODULE_TAG */ 88*61046927SAndroid Build Coastguard Worker uint32_t tag; 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Worker /** 91*61046927SAndroid Build Coastguard Worker * The API version of the implemented module. The module owner is 92*61046927SAndroid Build Coastguard Worker * responsible for updating the version when a module interface has 93*61046927SAndroid Build Coastguard Worker * changed. 94*61046927SAndroid Build Coastguard Worker * 95*61046927SAndroid Build Coastguard Worker * The derived modules such as gralloc and audio own and manage this field. 96*61046927SAndroid Build Coastguard Worker * The module user must interpret the version field to decide whether or 97*61046927SAndroid Build Coastguard Worker * not to inter-operate with the supplied module implementation. 98*61046927SAndroid Build Coastguard Worker * For example, SurfaceFlinger is responsible for making sure that 99*61046927SAndroid Build Coastguard Worker * it knows how to manage different versions of the gralloc-module API, 100*61046927SAndroid Build Coastguard Worker * and AudioFlinger must know how to do the same for audio-module API. 101*61046927SAndroid Build Coastguard Worker * 102*61046927SAndroid Build Coastguard Worker * The module API version should include a major and a minor component. 103*61046927SAndroid Build Coastguard Worker * For example, version 1.0 could be represented as 0x0100. This format 104*61046927SAndroid Build Coastguard Worker * implies that versions 0x0100-0x01ff are all API-compatible. 105*61046927SAndroid Build Coastguard Worker * 106*61046927SAndroid Build Coastguard Worker * In the future, libhardware will expose a hw_get_module_version() 107*61046927SAndroid Build Coastguard Worker * (or equivalent) function that will take minimum/maximum supported 108*61046927SAndroid Build Coastguard Worker * versions as arguments and would be able to reject modules with 109*61046927SAndroid Build Coastguard Worker * versions outside of the supplied range. 110*61046927SAndroid Build Coastguard Worker */ 111*61046927SAndroid Build Coastguard Worker uint16_t module_api_version; 112*61046927SAndroid Build Coastguard Worker #define version_major module_api_version 113*61046927SAndroid Build Coastguard Worker /** 114*61046927SAndroid Build Coastguard Worker * version_major/version_minor defines are supplied here for temporary 115*61046927SAndroid Build Coastguard Worker * source code compatibility. They will be removed in the next version. 116*61046927SAndroid Build Coastguard Worker * ALL clients must convert to the new version format. 117*61046927SAndroid Build Coastguard Worker */ 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker /** 120*61046927SAndroid Build Coastguard Worker * The API version of the HAL module interface. This is meant to 121*61046927SAndroid Build Coastguard Worker * version the hw_module_t, hw_module_methods_t, and hw_device_t 122*61046927SAndroid Build Coastguard Worker * structures and definitions. 123*61046927SAndroid Build Coastguard Worker * 124*61046927SAndroid Build Coastguard Worker * The HAL interface owns this field. Module users/implementations 125*61046927SAndroid Build Coastguard Worker * must NOT rely on this value for version information. 126*61046927SAndroid Build Coastguard Worker * 127*61046927SAndroid Build Coastguard Worker * Presently, 0 is the only valid value. 128*61046927SAndroid Build Coastguard Worker */ 129*61046927SAndroid Build Coastguard Worker uint16_t hal_api_version; 130*61046927SAndroid Build Coastguard Worker #define version_minor hal_api_version 131*61046927SAndroid Build Coastguard Worker 132*61046927SAndroid Build Coastguard Worker /** Identifier of module */ 133*61046927SAndroid Build Coastguard Worker const char *id; 134*61046927SAndroid Build Coastguard Worker 135*61046927SAndroid Build Coastguard Worker /** Name of this module */ 136*61046927SAndroid Build Coastguard Worker const char *name; 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker /** Author/owner/implementor of the module */ 139*61046927SAndroid Build Coastguard Worker const char *author; 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker /** Modules methods */ 142*61046927SAndroid Build Coastguard Worker struct hw_module_methods_t* methods; 143*61046927SAndroid Build Coastguard Worker 144*61046927SAndroid Build Coastguard Worker /** module's dso */ 145*61046927SAndroid Build Coastguard Worker void* dso; 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker #ifdef __LP64__ 148*61046927SAndroid Build Coastguard Worker uint64_t reserved[32-7]; 149*61046927SAndroid Build Coastguard Worker #else 150*61046927SAndroid Build Coastguard Worker /** padding to 128 bytes, reserved for future use */ 151*61046927SAndroid Build Coastguard Worker uint32_t reserved[32-7]; 152*61046927SAndroid Build Coastguard Worker #endif 153*61046927SAndroid Build Coastguard Worker 154*61046927SAndroid Build Coastguard Worker } hw_module_t; 155*61046927SAndroid Build Coastguard Worker 156*61046927SAndroid Build Coastguard Worker typedef struct hw_module_methods_t { 157*61046927SAndroid Build Coastguard Worker /** Open a specific device */ 158*61046927SAndroid Build Coastguard Worker int (*open)(const struct hw_module_t* module, const char* id, 159*61046927SAndroid Build Coastguard Worker struct hw_device_t** device); 160*61046927SAndroid Build Coastguard Worker 161*61046927SAndroid Build Coastguard Worker } hw_module_methods_t; 162*61046927SAndroid Build Coastguard Worker 163*61046927SAndroid Build Coastguard Worker /** 164*61046927SAndroid Build Coastguard Worker * Every device data structure must begin with hw_device_t 165*61046927SAndroid Build Coastguard Worker * followed by module specific public methods and attributes. 166*61046927SAndroid Build Coastguard Worker */ 167*61046927SAndroid Build Coastguard Worker typedef struct hw_device_t { 168*61046927SAndroid Build Coastguard Worker /** tag must be initialized to HARDWARE_DEVICE_TAG */ 169*61046927SAndroid Build Coastguard Worker uint32_t tag; 170*61046927SAndroid Build Coastguard Worker 171*61046927SAndroid Build Coastguard Worker /** 172*61046927SAndroid Build Coastguard Worker * Version of the module-specific device API. This value is used by 173*61046927SAndroid Build Coastguard Worker * the derived-module user to manage different device implementations. 174*61046927SAndroid Build Coastguard Worker * 175*61046927SAndroid Build Coastguard Worker * The module user is responsible for checking the module_api_version 176*61046927SAndroid Build Coastguard Worker * and device version fields to ensure that the user is capable of 177*61046927SAndroid Build Coastguard Worker * communicating with the specific module implementation. 178*61046927SAndroid Build Coastguard Worker * 179*61046927SAndroid Build Coastguard Worker * One module can support multiple devices with different versions. This 180*61046927SAndroid Build Coastguard Worker * can be useful when a device interface changes in an incompatible way 181*61046927SAndroid Build Coastguard Worker * but it is still necessary to support older implementations at the same 182*61046927SAndroid Build Coastguard Worker * time. One such example is the Camera 2.0 API. 183*61046927SAndroid Build Coastguard Worker * 184*61046927SAndroid Build Coastguard Worker * This field is interpreted by the module user and is ignored by the 185*61046927SAndroid Build Coastguard Worker * HAL interface itself. 186*61046927SAndroid Build Coastguard Worker */ 187*61046927SAndroid Build Coastguard Worker uint32_t version; 188*61046927SAndroid Build Coastguard Worker 189*61046927SAndroid Build Coastguard Worker /** reference to the module this device belongs to */ 190*61046927SAndroid Build Coastguard Worker struct hw_module_t* module; 191*61046927SAndroid Build Coastguard Worker 192*61046927SAndroid Build Coastguard Worker /** padding reserved for future use */ 193*61046927SAndroid Build Coastguard Worker #ifdef __LP64__ 194*61046927SAndroid Build Coastguard Worker uint64_t reserved[12]; 195*61046927SAndroid Build Coastguard Worker #else 196*61046927SAndroid Build Coastguard Worker uint32_t reserved[12]; 197*61046927SAndroid Build Coastguard Worker #endif 198*61046927SAndroid Build Coastguard Worker 199*61046927SAndroid Build Coastguard Worker /** Close this device */ 200*61046927SAndroid Build Coastguard Worker int (*close)(struct hw_device_t* device); 201*61046927SAndroid Build Coastguard Worker 202*61046927SAndroid Build Coastguard Worker } hw_device_t; 203*61046927SAndroid Build Coastguard Worker 204*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 205*61046927SAndroid Build Coastguard Worker #define TO_HW_DEVICE_T_OPEN(x) reinterpret_cast<struct hw_device_t**>(x) 206*61046927SAndroid Build Coastguard Worker #else 207*61046927SAndroid Build Coastguard Worker #define TO_HW_DEVICE_T_OPEN(x) (struct hw_device_t**)(x) 208*61046927SAndroid Build Coastguard Worker #endif 209*61046927SAndroid Build Coastguard Worker 210*61046927SAndroid Build Coastguard Worker /** 211*61046927SAndroid Build Coastguard Worker * Name of the hal_module_info 212*61046927SAndroid Build Coastguard Worker */ 213*61046927SAndroid Build Coastguard Worker #define HAL_MODULE_INFO_SYM HMI 214*61046927SAndroid Build Coastguard Worker 215*61046927SAndroid Build Coastguard Worker /** 216*61046927SAndroid Build Coastguard Worker * Name of the hal_module_info as a string 217*61046927SAndroid Build Coastguard Worker */ 218*61046927SAndroid Build Coastguard Worker #define HAL_MODULE_INFO_SYM_AS_STR "HMI" 219*61046927SAndroid Build Coastguard Worker 220*61046927SAndroid Build Coastguard Worker /** 221*61046927SAndroid Build Coastguard Worker * Get the module info associated with a module by id. 222*61046927SAndroid Build Coastguard Worker * 223*61046927SAndroid Build Coastguard Worker * @return: 0 == success, <0 == error and *module == NULL 224*61046927SAndroid Build Coastguard Worker */ 225*61046927SAndroid Build Coastguard Worker int hw_get_module(const char *id, const struct hw_module_t **module); 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker /** 228*61046927SAndroid Build Coastguard Worker * Get the module info associated with a module instance by class 'class_id' 229*61046927SAndroid Build Coastguard Worker * and instance 'inst'. 230*61046927SAndroid Build Coastguard Worker * 231*61046927SAndroid Build Coastguard Worker * Some modules types necessitate multiple instances. For example audio supports 232*61046927SAndroid Build Coastguard Worker * multiple concurrent interfaces and thus 'audio' is the module class 233*61046927SAndroid Build Coastguard Worker * and 'primary' or 'a2dp' are module interfaces. This implies that the files 234*61046927SAndroid Build Coastguard Worker * providing these modules would be named audio.primary.<variant>.so and 235*61046927SAndroid Build Coastguard Worker * audio.a2dp.<variant>.so 236*61046927SAndroid Build Coastguard Worker * 237*61046927SAndroid Build Coastguard Worker * @return: 0 == success, <0 == error and *module == NULL 238*61046927SAndroid Build Coastguard Worker */ 239*61046927SAndroid Build Coastguard Worker int hw_get_module_by_class(const char *class_id, const char *inst, 240*61046927SAndroid Build Coastguard Worker const struct hw_module_t **module); 241*61046927SAndroid Build Coastguard Worker 242*61046927SAndroid Build Coastguard Worker __END_DECLS 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker #endif /* ANDROID_INCLUDE_HARDWARE_HARDWARE_H */ 245