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>
24a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
25f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project__BEGIN_DECLS
26f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
27f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/*
28f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Value for the hw_module_t.tag field
29f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
30a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
31a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#define MAKE_TAG_CONSTANT(A,B,C,D) (((A) << 24) | ((B) << 16) | ((C) << 8) | (D))
32a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
33a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#define HARDWARE_MODULE_TAG MAKE_TAG_CONSTANT('H', 'W', 'M', 'T')
34a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian#define HARDWARE_DEVICE_TAG MAKE_TAG_CONSTANT('H', 'W', 'D', 'T')
35f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
36f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct hw_module_t;
37f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct hw_module_methods_t;
38f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectstruct hw_device_t;
39f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
40f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
41f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
42f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * and the fields of this data structure must begin with hw_module_t
43f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * followed by module specific information.
44f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
459d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopiantypedef struct hw_module_t {
46f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** tag must be initialized to HARDWARE_MODULE_TAG */
47f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t tag;
48f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
49f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** major version number for the module */
50f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint16_t version_major;
51f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
52f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** minor version number of the module */
53f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint16_t version_minor;
54f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
55f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Identifier of module */
56f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char *id;
57f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
58f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Name of this module */
59f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char *name;
60f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
61f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Author/owner/implementor of the module */
62f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    const char *author;
63f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
64f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Modules methods */
65f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    struct hw_module_methods_t* methods;
66a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
67a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian    /** module's dso */
68a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian    void* dso;
69a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian
70f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** padding to 128 bytes, reserved for future use */
71a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian    uint32_t reserved[32-7];
72f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
739d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian} hw_module_t;
749d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian
759d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopiantypedef struct hw_module_methods_t {
76f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Open a specific device */
77f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int (*open)(const struct hw_module_t* module, const char* id,
78f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project            struct hw_device_t** device);
799d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian
809d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian} hw_module_methods_t;
81f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
82f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
83f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Every device data structure must begin with hw_device_t
84f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * followed by module specific public methods and attributes.
85f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
869d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopiantypedef struct hw_device_t {
87f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** tag must be initialized to HARDWARE_DEVICE_TAG */
88f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t tag;
89f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
90f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** version number for hw_device_t */
91f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t version;
92f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
93f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** reference to the module this device belongs to */
94f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    struct hw_module_t* module;
95f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
96f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** padding reserved for future use */
97f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    uint32_t reserved[12];
98f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
99f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    /** Close this device */
100f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    int (*close)(struct hw_device_t* device);
1019d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian
1029d82c1a447a72a2c086b9cd34c5b73b163d7acbcMathias Agopian} hw_device_t;
103f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
104f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
105a8a75166a2d3c7639a7432a67075c98796165206Mathias Agopian * Name of the hal_module_info
106f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
107f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define HAL_MODULE_INFO_SYM         HMI
108f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
109f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
110f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Name of the hal_module_info as a string
111f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
112f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"
113f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
114f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
115f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Get the module info associated with a module by id.
116f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * @return: 0 == success, <0 == error and *pHmi == NULL
117f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
118f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectint hw_get_module(const char *id, const struct hw_module_t **module);
119f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
120f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
121f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
122f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * pixel format definitions
123f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
124f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
125f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectenum {
126373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_RGBA_8888          = 1,
127373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_RGBX_8888          = 2,
128373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_RGB_888            = 3,
129373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_RGB_565            = 4,
130373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_BGRA_8888          = 5,
131373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_RGBA_5551          = 6,
132373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian    HAL_PIXEL_FORMAT_RGBA_4444          = 7,
133f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
1346915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    /* 0x8 - 0xFF range unavailable */
1356915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian
1366915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    /*
1376915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     * 0x100 - 0x1FF
1386915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     *
1392ec2193365ab26c6f77a2c5617887ced7a8d6711Jamie Gennis     * This range is reserved for pixel formats that are specific to the HAL
1402ec2193365ab26c6f77a2c5617887ced7a8d6711Jamie Gennis     * implementation.  Implementations can use any value in this range to
1412ec2193365ab26c6f77a2c5617887ced7a8d6711Jamie Gennis     * communicate video pixel formats between their HAL modules.  These formats
1422ec2193365ab26c6f77a2c5617887ced7a8d6711Jamie Gennis     * must not have an alpha channel.  Additionally, an EGLimage created from a
1432ec2193365ab26c6f77a2c5617887ced7a8d6711Jamie Gennis     * gralloc buffer of one of these formats must be supported for use with the
1442ec2193365ab26c6f77a2c5617887ced7a8d6711Jamie Gennis     * GL_OES_EGL_image_external OpenGL ES extension.
1456915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     */
1466915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian
1476915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    /*
14880107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     * Android YUV format:
1496915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     *
15080107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     * This format is exposed outside of the HAL to software
1516915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     * decoders and applications.
15280107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     * EGLImageKHR must support it in conjunction with the
1536915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     * OES_EGL_image_external extension.
1546915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     *
15580107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     * YV12 is 4:2:0 YCrCb planar format comprised of a WxH Y plane followed
1566915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     * by (W/2) x (H/2) Cr and Cb planes.
1576915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     *
158a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     * This format assumes
159a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     * - an even width
160a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     * - an even height
161a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     * - a horizontal stride multiple of 16 pixels
162a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     * - a vertical stride equal to the height
163a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     *
164a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     *   y_size = stride * height
165a2df7ab5fe89fda56606f8151659db47e160a5b3Mathias Agopian     *   c_size = ALIGN(stride/2, 16) * height/2
16680107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     *   size = y_size + c_size * 2
16780107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     *   cr_offset = y_size
16880107f8e92e25e62c945600325f3e846477bc855Mathias Agopian     *   cb_offset = y_size + c_size
1696915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     *
1706915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian     */
17180107f8e92e25e62c945600325f3e846477bc855Mathias Agopian    HAL_PIXEL_FORMAT_YV12   = 0x32315659, // YCrCb 4:2:0 Planar
17280107f8e92e25e62c945600325f3e846477bc855Mathias Agopian
1736915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian
1746915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian
1756915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    /* Legacy formats (deprecated), used by ImageFormat.java */
1766915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    HAL_PIXEL_FORMAT_YCbCr_422_SP       = 0x10, // NV16
1776915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    HAL_PIXEL_FORMAT_YCrCb_420_SP       = 0x11, // NV21
1786915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian    HAL_PIXEL_FORMAT_YCbCr_422_I        = 0x14, // YUY2
179373a9c6efebc97ade940dc5996f24992cda450c7Mathias Agopian};
180f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
1816915eb345b6640a43b9c1241f7ad8ffa0463874aMathias Agopian
182f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project/**
183f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project * Transformation definitions
1842d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian *
1852d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian * IMPORTANT NOTE:
1862d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian * HAL_TRANSFORM_ROT_90 is applied CLOCKWISE and AFTER HAL_TRANSFORM_FLIP_{H|V}.
1872d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian *
188f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project */
189f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
190f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Projectenum {
1912d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian    /* flip source image horizontally (around the vertical axis) */
192f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    HAL_TRANSFORM_FLIP_H    = 0x01,
1932d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian    /* flip source image vertically (around the horizontal axis)*/
194f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    HAL_TRANSFORM_FLIP_V    = 0x02,
1952d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian    /* rotate source image 90 degrees clockwise */
196f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    HAL_TRANSFORM_ROT_90    = 0x04,
1979e149fc6e112fe23e408ca972a948a1d9aadc9a8Mathias Agopian    /* rotate source image 180 degrees */
198f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    HAL_TRANSFORM_ROT_180   = 0x03,
1992d1e978e3229bb524c6415580ad91fab051f944cMathias Agopian    /* rotate source image 270 degrees clockwise */
200f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project    HAL_TRANSFORM_ROT_270   = 0x07,
201f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project};
202f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
203f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project__END_DECLS
204f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project
205f53ebec38718ff5d6b2aff2fa62b92a75d007ca5The Android Open Source Project#endif  /* ANDROID_INCLUDE_HARDWARE_HARDWARE_H */
206