hardware.h revision 65820e4d7a0b89108b194284b94f6f82d28a875c
1f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/*
2f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
4f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * you may not use this file except in compliance with the License.
6f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * You may obtain a copy of the License at
7f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
8f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project *
10f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * See the License for the specific language governing permissions and
14f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * limitations under the License.
15f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
16f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
17f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#ifndef ANDROID_INCLUDE_HARDWARE_HARDWARE_H
18f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define ANDROID_INCLUDE_HARDWARE_HARDWARE_H
19f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
20f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#include <stdint.h>
21f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#include <sys/cdefs.h>
22f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
23a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#include <cutils/native_handle.h>
24c12d0e9240db0fb53546fd08276454a2cca72492Iliyan Malchev#include <system/graphics.h>
25a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
26f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project__BEGIN_DECLS
27f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
28f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/*
29f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Value for the hw_module_t.tag field
30f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
31a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
32a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#define MAKE_TAG_CONSTANT(A,B,C,D) (((A) << 24) | ((B) << 16) | ((C) << 8) | (D))
33a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
34a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#define HARDWARE_MODULE_TAG MAKE_TAG_CONSTANT('H', 'W', 'M', 'T')
35a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#define HARDWARE_DEVICE_TAG MAKE_TAG_CONSTANT('H', 'W', 'D', 'T')
36f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
3765820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin#define HARDWARE_MAKE_API_VERSION(maj,min) \
3865820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin            ((((maj) & 0xff) << 8) | ((min) & 0xff))
3965820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin
4065820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin/*
4165820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * The current HAL API version.
4265820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin *
4365820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * All module implementations must set the hw_module_t.hal_api_version field
4465820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * to this value when declaring the module with HAL_MODULE_INFO_SYM.
4565820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin *
4665820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * Note that previous implementations have always set this field to 0.
4765820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * Therefore, libhardware HAL API will always consider versions 0.0 and 1.0
4865820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * to be 100% binary compatible.
4965820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin *
5065820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin */
5165820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin#define HARDWARE_HAL_API_VERSION HARDWARE_MAKE_API_VERSION(1, 0)
5265820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin
5365820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin/*
5465820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * Helper macro for module implementors.
5565820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin *
5665820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin * Use this macro to set the hw_module_t.module_api_version field.
5765820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin */
5865820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin#define HARDWARE_MODULE_API_VERSION(maj,min) HARDWARE_MAKE_API_VERSION(maj,min)
5965820e4d7a0b89108b194284b94f6f82d28a875cDima Zavin
60f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct hw_module_t;
61f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct hw_module_methods_t;
62f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct hw_device_t;
63f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
64f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
65f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
66f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * and the fields of this data structure must begin with hw_module_t
67f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * followed by module specific information.
68f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
699d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopiantypedef struct hw_module_t {
70f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** tag must be initialized to HARDWARE_MODULE_TAG */
71f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t tag;
72f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
732b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin    /**
742b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The API version of the implemented module. The module owner is
752b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * responsible for updating the version when a module interface has
762b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * changed.
772b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
782b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The derived modules such as gralloc and audio own and manage this field.
792b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The module user must interpret the version field to decide whether or
802b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * not to inter-operate with the supplied module implementation.
812b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * For example, SurfaceFlinger is responsible for making sure that
822b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * it knows how to manage different versions of the gralloc-module API,
832b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * and AudioFlinger must know how to do the same for audio-module API.
842b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
852b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The module API version should include a major and a minor component.
862b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * For example, version 1.0 could be represented as 0x0100. This format
872b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * implies that versions 0x0100-0x01ff are all API-compatible.
882b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
892b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * In the future, libhardware will expose a hw_get_module_version()
902b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * (or equivalent) function that will take minimum/maximum supported
912b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * versions as arguments and would be able to reject modules with
922b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * versions outside of the supplied range.
932b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     */
942b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin    uint16_t module_api_version;
958dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin#define version_major module_api_version
968dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin    /**
978dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin     * version_major/version_minor defines are supplied here for temporary
988dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin     * source code compatibility. They will be removed in the next version.
998dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin     * ALL clients must convert to the new version format.
1008dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin     */
1012b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin
1022b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin    /**
1032b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The API version of the HAL module interface. This is meant to
1042b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * version the hw_module_t, hw_module_methods_t, and hw_device_t
1052b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * structures and definitions.
1062b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
1072b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The HAL interface owns this field. Module users/implementations
1082b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * must NOT rely on this value for version information.
1092b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
1102b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * Presently, 0 is the only valid value.
1112b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     */
1122b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin    uint16_t hal_api_version;
1138dc4e710c0dfa66564c8cea0af53f7b4e8e0f80aDima Zavin#define version_minor hal_api_version
114f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
115f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Identifier of module */
116f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char *id;
117f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
118f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Name of this module */
119f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char *name;
120f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
121f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Author/owner/implementor of the module */
122f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char *author;
123f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
124f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Modules methods */
125f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    struct hw_module_methods_t* methods;
126a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
127a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian    /** module's dso */
128a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian    void* dso;
129a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
130f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** padding to 128 bytes, reserved for future use */
131a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian    uint32_t reserved[32-7];
132f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
1339d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian} hw_module_t;
1349d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian
1359d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopiantypedef struct hw_module_methods_t {
136f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Open a specific device */
137f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int (*open)(const struct hw_module_t* module, const char* id,
138f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            struct hw_device_t** device);
1399d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian
1409d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian} hw_module_methods_t;
141f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
142f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
143f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Every device data structure must begin with hw_device_t
144f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * followed by module specific public methods and attributes.
145f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
1469d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopiantypedef struct hw_device_t {
147f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** tag must be initialized to HARDWARE_DEVICE_TAG */
148f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t tag;
149f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
1502b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin    /**
1512b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * Version of the module-specific device API. This value is used by
1522b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * the derived-module user to manage different device implementations.
1532b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
1542b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * The module user is responsible for checking the module_api_version
1552b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * and device version fields to ensure that the user is capable of
1562b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * communicating with the specific module implementation.
1572b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
1582b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * One module can support multiple devices with different versions. This
1592b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * can be useful when a device interface changes in an incompatible way
1602b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * but it is still necessary to support older implementations at the same
1612b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * time. One such example is the Camera 2.0 API.
1622b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     *
1632b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * This field is interpreted by the module user and is ignored by the
1642b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     * HAL interface itself.
1652b57780d88e32ce9fde32dc085aef2fa7fd478e1Dima Zavin     */
166f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t version;
167f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
168f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** reference to the module this device belongs to */
169f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    struct hw_module_t* module;
170f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
171f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** padding reserved for future use */
172f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t reserved[12];
173f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
174f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Close this device */
175f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int (*close)(struct hw_device_t* device);
1769d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian
1779d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian} hw_device_t;
178f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
179f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
180a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian * Name of the hal_module_info
181f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
182f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define HAL_MODULE_INFO_SYM         HMI
183f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
184f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
185f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Name of the hal_module_info as a string
186f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
187f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"
188f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
189f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
190f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Get the module info associated with a module by id.
19154921de415cd91af21801115baa40e78fc4ea4beDima Zavin *
19254921de415cd91af21801115baa40e78fc4ea4beDima Zavin * @return: 0 == success, <0 == error and *module == NULL
193f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
194f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectint hw_get_module(const char *id, const struct hw_module_t **module);
195f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
19654921de415cd91af21801115baa40e78fc4ea4beDima Zavin/**
19754921de415cd91af21801115baa40e78fc4ea4beDima Zavin * Get the module info associated with a module instance by class 'class_id'
19854921de415cd91af21801115baa40e78fc4ea4beDima Zavin * and instance 'inst'.
19954921de415cd91af21801115baa40e78fc4ea4beDima Zavin *
20054921de415cd91af21801115baa40e78fc4ea4beDima Zavin * Some modules types necessitate multiple instances. For example audio supports
20154921de415cd91af21801115baa40e78fc4ea4beDima Zavin * multiple concurrent interfaces and thus 'audio' is the module class
20254921de415cd91af21801115baa40e78fc4ea4beDima Zavin * and 'primary' or 'a2dp' are module interfaces. This implies that the files
20354921de415cd91af21801115baa40e78fc4ea4beDima Zavin * providing these modules would be named audio.primary.<variant>.so and
20454921de415cd91af21801115baa40e78fc4ea4beDima Zavin * audio.a2dp.<variant>.so
20554921de415cd91af21801115baa40e78fc4ea4beDima Zavin *
20654921de415cd91af21801115baa40e78fc4ea4beDima Zavin * @return: 0 == success, <0 == error and *module == NULL
20754921de415cd91af21801115baa40e78fc4ea4beDima Zavin */
20854921de415cd91af21801115baa40e78fc4ea4beDima Zavinint hw_get_module_by_class(const char *class_id, const char *inst,
20954921de415cd91af21801115baa40e78fc4ea4beDima Zavin                           const struct hw_module_t **module);
210f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
211f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project__END_DECLS
212f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
213f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#endif  /* ANDROID_INCLUDE_HARDWARE_HARDWARE_H */
214