1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file CameraHal.cpp
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file maps the Camera Hardware Interface to V4L2.
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
249a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu#include <utils/threads.h>
259a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h"
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "TICameraParameters.h"
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
31f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_DEBUG_VERBOSE
32f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#   define CAMHAL_LOG_MODULE_FUNCTION_NAME LOG_FUNCTION_NAME
33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#else
34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#   define CAMHAL_LOG_MODULE_FUNCTION_NAME
35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
36f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
39f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
40f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
41f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic CameraProperties gCameraProperties;
42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic CameraHal* gCameraHals[MAX_CAMERAS_SUPPORTED];
439a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luustatic unsigned int gCamerasOpen = 0;
449a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luustatic android::Mutex gCameraHalDeviceLock;
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_device_open(const hw_module_t* module, const char* name,
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                hw_device_t** device);
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_device_close(hw_device_t* device);
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_get_number_of_cameras(void);
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic int camera_get_camera_info(int camera_id, struct camera_info *info);
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic struct hw_module_methods_t camera_module_methods = {
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        open: camera_device_open
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevcamera_module_t HAL_MODULE_INFO_SYM = {
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    common: {
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         tag: HARDWARE_MODULE_TAG,
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         version_major: 1,
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         version_minor: 0,
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         id: CAMERA_HARDWARE_MODULE_ID,
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         name: "TI OMAP CameraHal Module",
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         author: "TI",
68f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         methods: &Ti::Camera::camera_module_methods,
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         dso: NULL, /* remove compilation warnings */
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         reserved: {0}, /* remove compilation warnings */
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    },
72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    get_number_of_cameras: Ti::Camera::camera_get_number_of_cameras,
73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    get_camera_info: Ti::Camera::camera_get_camera_info,
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
79f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtypedef struct ti_camera_device {
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_device_t base;
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /* TI specific "private" data can go here (base.priv) */
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int cameraid;
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} ti_camera_device_t;
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*******************************************************************
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * implementation of camera_device_ops functions
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *******************************************************************/
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_set_preview_window(struct camera_device * device,
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        struct preview_stream_ops *window)
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
95f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->setPreviewWindow(window);
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_set_extended_preview_ops(struct camera_device * device,
111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        preview_stream_extended_ops_t * extendedOps)
112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if (!device) {
116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return BAD_VALUE;
117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t * const tiDevice = reinterpret_cast<ti_camera_device_t*>(device);
120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    gCameraHals[tiDevice->cameraid]->setExtendedPreviewStreamOps(extendedOps);
121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return OK;
123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_set_buffer_source(struct camera_device * device,
126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        struct preview_stream_ops *tapin,
127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        struct preview_stream_ops *tapout)
128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int rv = -EINVAL;
132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!device)
135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return rv;
136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_dev = (ti_camera_device_t*) device;
138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    rv = gCameraHals[ti_dev->cameraid]->setBufferSource(tapin, tapout);
140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return rv;
142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_release_buffer_source(struct camera_device * device,
145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                 struct preview_stream_ops *tapin,
146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                 struct preview_stream_ops *tapout)
147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int rv = -EINVAL;
151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!device)
154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return rv;
155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_dev = (ti_camera_device_t*) device;
157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    rv = gCameraHals[ti_dev->cameraid]->releaseBufferSource(tapin, tapout);
159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return rv;
161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_set_callbacks(struct camera_device * device,
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_notify_callback notify_cb,
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_data_callback data_cb,
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_data_timestamp_callback data_cb_timestamp,
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_request_memory get_memory,
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        void *user)
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->setCallbacks(notify_cb, data_cb, data_cb_timestamp, get_memory, user);
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_enable_msg_type(struct camera_device * device, int32_t msg_type)
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->enableMsgType(msg_type);
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_disable_msg_type(struct camera_device * device, int32_t msg_type)
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
201f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->disableMsgType(msg_type);
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_msg_type_enabled(struct camera_device * device, int32_t msg_type)
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return 0;
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return gCameraHals[ti_dev->cameraid]->msgTypeEnabled(msg_type);
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_start_preview(struct camera_device * device)
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->startPreview();
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_stop_preview(struct camera_device * device)
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->stopPreview();
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_preview_enabled(struct camera_device * device)
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->previewEnabled();
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_store_meta_data_in_buffers(struct camera_device * device, int enable)
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //  TODO: meta data buffer not current supported
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->storeMetaDataInBuffers(enable);
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //return enable ? android::INVALID_OPERATION: android::OK;
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_start_recording(struct camera_device * device)
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->startRecording();
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_stop_recording(struct camera_device * device)
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->stopRecording();
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_recording_enabled(struct camera_device * device)
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->recordingEnabled();
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_release_recording_frame(struct camera_device * device,
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                const void *opaque)
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->releaseRecordingFrame(opaque);
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_auto_focus(struct camera_device * device)
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->autoFocus();
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_cancel_auto_focus(struct camera_device * device)
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->cancelAutoFocus();
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_take_picture(struct camera_device * device)
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
390f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!device)
391f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return rv;
392f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
393f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_dev = (ti_camera_device_t*) device;
394f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
395f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    rv = gCameraHals[ti_dev->cameraid]->takePicture(0);
396f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return rv;
397f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
398f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
399f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
400f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_take_picture_with_parameters(struct camera_device * device, const char *params)
401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
402f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int rv = -EINVAL;
405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    rv = gCameraHals[ti_dev->cameraid]->takePicture(params);
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_cancel_picture(struct camera_device * device)
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->cancelPicture();
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_reprocess(struct camera_device * device, const char *params)
435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int rv = -EINVAL;
439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!device)
442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return rv;
443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_dev = (ti_camera_device_t*) device;
445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    rv = gCameraHals[ti_dev->cameraid]->reprocess(params);
447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return rv;
448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
450f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_cancel_reprocess(struct camera_device * device)
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
453f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(!device)
458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return rv;
459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_dev = (ti_camera_device_t*) device;
461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    rv = gCameraHals[ti_dev->cameraid]->cancel_reprocess();
463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return rv;
464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint camera_set_parameters(struct camera_device * device, const char *params)
468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    int rv = -EINVAL;
472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->setParameters(params);
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* camera_get_parameters(struct camera_device * device)
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* param = NULL;
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NULL;
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    param = gCameraHals[ti_dev->cameraid]->getParameters();
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return param;
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void camera_put_parameters(struct camera_device *device, char *parms)
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
502f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->putParameters(parms);
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_send_command(struct camera_device * device,
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            int32_t cmd, int32_t arg1, int32_t arg2)
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
527f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT
528f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( cmd == CAMERA_CMD_SETUP_EXTENDED_OPERATIONS ) {
529f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        camera_device_extended_ops_t * const ops = static_cast<camera_device_extended_ops_t*>(
530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                camera_cmd_send_command_args_to_pointer(arg1, arg2));
531f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
532f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
533f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ops->set_extended_preview_ops = camera_set_extended_preview_ops;
534f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ops->set_buffer_source = camera_set_buffer_source;
535f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ops->release_buffer_source = camera_release_buffer_source;
536f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ops->take_picture_with_parameters = camera_take_picture_with_parameters;
537f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ops->reprocess = camera_reprocess;
538f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ops->cancel_reprocess = camera_cancel_reprocess;
539f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
540f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
541f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return OK;
542f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->sendCommand(cmd, arg1, arg2);
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid camera_release(struct camera_device * device)
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ti_camera_device_t* ti_dev = NULL;
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gCameraHals[ti_dev->cameraid]->release();
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_dump(struct camera_device * device, int fd)
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = -EINVAL;
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!device)
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return rv;
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rv = gCameraHals[ti_dev->cameraid]->dump(fd);
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevextern "C" void heaptracker_free_leaked_memory(void);
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_device_close(hw_device_t* device)
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_LOG_MODULE_FUNCTION_NAME;
584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int ret = 0;
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* ti_dev = NULL;
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(gCameraHalDeviceLock);
5899a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!device) {
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto done;
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_dev = (ti_camera_device_t*) device;
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
597bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    if (ti_dev) {
598bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        if (gCameraHals[ti_dev->cameraid]) {
599bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu            delete gCameraHals[ti_dev->cameraid];
600bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu            gCameraHals[ti_dev->cameraid] = NULL;
601bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu            gCamerasOpen--;
602bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        }
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
604bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        if (ti_dev->base.ops) {
605bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu            free(ti_dev->base.ops);
606bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        }
607bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        free(ti_dev);
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevdone:
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef HEAPTRACKER
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    heaptracker_free_leaked_memory();
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*******************************************************************
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * implementation of camera_module functions
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *******************************************************************/
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* open device handle to one of the cameras
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * assume camera service will keep singleton of each camera
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * so this function will always only be called once per camera instance
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_device_open(const hw_module_t* module, const char* name,
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                hw_device_t** device)
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
62973bfc819486d5f632fd113996e6ecdbd647d2085Sundar Raman    int rv = 0;
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int num_cameras = 0;
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int cameraid;
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ti_camera_device_t* camera_device = NULL;
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_device_ops_t* camera_ops = NULL;
634f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraHal* camera = NULL;
635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraProperties::Properties* properties = NULL;
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    android::AutoMutex lock(gCameraHalDeviceLock);
6389a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu
639e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev    CAMHAL_LOGI("camera_device open");
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (name != NULL) {
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        cameraid = atoi(name);
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        num_cameras = gCameraProperties.camerasSupported();
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(cameraid > num_cameras)
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("camera service provided cameraid out of bounds, "
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    "cameraid = %d, num supported = %d",
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    cameraid, num_cameras);
6509a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu            rv = -EINVAL;
6519a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu            goto fail;
6529a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu        }
6539a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu
6549a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu        if(gCamerasOpen >= MAX_SIMUL_CAMERAS_SUPPORTED)
6559a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu        {
656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("maximum number of cameras already open");
6579a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu            rv = -ENOMEM;
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail;
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device = (ti_camera_device_t*)malloc(sizeof(*camera_device));
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!camera_device)
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("camera_device allocation fail");
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rv = -ENOMEM;
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail;
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops));
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!camera_ops)
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("camera_ops allocation fail");
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rv = -ENOMEM;
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail;
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        memset(camera_device, 0, sizeof(*camera_device));
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        memset(camera_ops, 0, sizeof(*camera_ops));
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device->base.common.tag = HARDWARE_DEVICE_TAG;
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device->base.common.version = 0;
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device->base.common.module = (hw_module_t *)(module);
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device->base.common.close = camera_device_close;
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device->base.ops = camera_ops;
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->set_preview_window = camera_set_preview_window;
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->set_callbacks = camera_set_callbacks;
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->enable_msg_type = camera_enable_msg_type;
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->disable_msg_type = camera_disable_msg_type;
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->msg_type_enabled = camera_msg_type_enabled;
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->start_preview = camera_start_preview;
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->stop_preview = camera_stop_preview;
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->preview_enabled = camera_preview_enabled;
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->store_meta_data_in_buffers = camera_store_meta_data_in_buffers;
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->start_recording = camera_start_recording;
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->stop_recording = camera_stop_recording;
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->recording_enabled = camera_recording_enabled;
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->release_recording_frame = camera_release_recording_frame;
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->auto_focus = camera_auto_focus;
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->cancel_auto_focus = camera_cancel_auto_focus;
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->take_picture = camera_take_picture;
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->cancel_picture = camera_cancel_picture;
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->set_parameters = camera_set_parameters;
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->get_parameters = camera_get_parameters;
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->put_parameters = camera_put_parameters;
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->send_command = camera_send_command;
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->release = camera_release;
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_ops->dump = camera_dump;
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        *device = &camera_device->base.common;
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // -------- TI specific stuff --------
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_device->cameraid = cameraid;
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(gCameraProperties.getProperties(cameraid, &properties) < 0)
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Couldn't get camera properties");
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rv = -ENOMEM;
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail;
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        camera = new CameraHal(cameraid);
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!camera)
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Couldn't create instance of CameraHal class");
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rv = -ENOMEM;
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail;
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        if(properties && (camera->initialize(properties) != NO_ERROR))
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            CAMHAL_LOGE("Couldn't initialize camera instance");
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rv = -ENODEV;
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail;
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gCameraHals[cameraid] = camera;
7409a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu        gCamerasOpen++;
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevfail:
746bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    if(camera_device) {
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(camera_device);
748bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        camera_device = NULL;
749bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    }
750bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    if(camera_ops) {
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(camera_ops);
752bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        camera_ops = NULL;
753bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    }
754bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    if(camera) {
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete camera;
756bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu        camera = NULL;
757bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    }
758bf3ea792d0dda2047d7876557514a9eb2c5e228aTyler Luu    *device = NULL;
759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_get_number_of_cameras(void)
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int num_cameras = MAX_CAMERAS_SUPPORTED;
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // this going to be the first call from camera service
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // initialize camera properties here...
768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(gCameraProperties.initialize() != NO_ERROR)
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraProperties");
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NULL;
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    num_cameras = gCameraProperties.camerasSupported();
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return num_cameras;
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_get_camera_info(int camera_id, struct camera_info *info)
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int rv = 0;
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int face_value = CAMERA_FACING_BACK;
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int orientation = 0;
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CameraProperties::Properties* properties = NULL;
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // this going to be the first call from camera service
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // initialize camera properties here...
789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if(gCameraProperties.initialize() != NO_ERROR)
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraProperties");
792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        rv = -EINVAL;
793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        goto end;
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Get camera properties for camera index
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(gCameraProperties.getProperties(camera_id, &properties) < 0)
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        CAMHAL_LOGE("Couldn't get camera properties");
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        rv = -EINVAL;
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto end;
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(properties)
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
806f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        valstr = properties->get(CameraProperties::FACING_INDEX);
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(valstr != NULL)
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
809f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if (strcmp(valstr, TICameraParameters::FACING_FRONT) == 0)
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                face_value = CAMERA_FACING_FRONT;
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
813f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            else if (strcmp(valstr, TICameraParameters::FACING_BACK) == 0)
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                face_value = CAMERA_FACING_BACK;
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
819f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons         valstr = properties->get(CameraProperties::ORIENTATION_INDEX);
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if(valstr != NULL)
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         {
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             orientation = atoi(valstr);
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("getProperties() returned a NULL property set for Camera id %d", camera_id);
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    info->facing = face_value;
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    info->orientation = orientation;
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevend:
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return rv;
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
838f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
839f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
840