1/*
2** Copyright (c) 2011 Code Aurora Forum. All rights reserved.
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8**     http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
16
17/*#error uncomment this for compiler test!*/
18
19//#define LOG_NDEBUG 0
20#define LOG_NIDEBUG 0
21#define LOG_TAG "QCameraHAL"
22#include <utils/Log.h>
23#include <utils/threads.h>
24#include <fcntl.h>
25#include <sys/mman.h>
26
27
28/* include QCamera Hardware Interface Header*/
29#include "QCameraHAL.h"
30
31int HAL_numOfCameras = 0;
32camera_info_t HAL_cameraInfo[MSM_MAX_CAMERA_SENSORS];
33mm_camera_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS];
34int HAL_currentCameraMode;
35
36namespace android {
37/* HAL function implementation goes here*/
38
39/**
40 * The functions need to be provided by the camera HAL.
41 *
42 * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
43 * and openCameraHardware() is 0 to N-1.
44 */
45extern "C" int HAL_getNumberOfCameras()
46{
47    /* try to query every time we get the call!*/
48    uint8_t num_camera = 0;
49    mm_camera_t * handle_base = 0;
50    LOGV("%s: E", __func__);
51
52    handle_base= mm_camera_query(&num_camera);
53
54    if (!handle_base) {
55        HAL_numOfCameras = 0;
56    }
57    else
58    {
59        camera_info_t* p_camera_info = 0;
60        HAL_numOfCameras=num_camera;
61
62        LOGI("Handle base =0x%p",handle_base);
63        LOGI("getCameraInfo: numOfCameras = %d", HAL_numOfCameras);
64        for(int i = 0; i < HAL_numOfCameras; i++) {
65            LOGI("Handle [%d]=0x%p",i,handle_base+i);
66            HAL_camerahandle[i]=handle_base + i;
67            p_camera_info = &(HAL_camerahandle[i]->camera_info);
68            if (p_camera_info) {
69                LOGI("Camera sensor %d info:", i);
70                LOGI("camera_id: %d", p_camera_info->camera_id);
71                LOGI("modes_supported: %x", p_camera_info->modes_supported);
72                LOGI("position: %d", p_camera_info->position);
73                LOGI("sensor_mount_angle: %d", p_camera_info->sensor_mount_angle);
74            }
75        }
76    }
77
78    LOGV("%s: X", __func__);
79
80    return HAL_numOfCameras;
81}
82
83extern "C" int HAL_isIn3DMode()
84{
85    return HAL_currentCameraMode == CAMERA_MODE_3D;
86}
87
88extern "C" void HAL_getCameraInfo(int cameraId, struct CameraInfo* cameraInfo)
89{
90    mm_camera_t *mm_camer_obj = 0;
91    LOGV("%s: E", __func__);
92
93    if (!HAL_numOfCameras || HAL_numOfCameras < cameraId || !cameraInfo)
94        return;
95    else
96        mm_camer_obj = HAL_camerahandle[cameraId];
97
98    if (!mm_camer_obj)
99        return;
100    else {
101        cameraInfo->facing =
102            (FRONT_CAMERA == mm_camer_obj->camera_info.position)?
103            CAMERA_FACING_FRONT : CAMERA_FACING_BACK;
104
105        cameraInfo->orientation = mm_camer_obj->camera_info.sensor_mount_angle;
106#if 0
107        // TODO: fix me
108        /* We always supprot ZSL in our stack*/
109        cameraInfo->mode = CAMERA_SUPPORT_MODE_ZSL;
110        if (mm_camer_obj->camera_info.modes_supported & CAMERA_MODE_2D) {
111            cameraInfo->mode |= CAMERA_SUPPORT_MODE_2D;
112        }
113        if (mm_camer_obj->camera_info.modes_supported & CAMERA_MODE_3D) {
114            cameraInfo->mode |= CAMERA_SUPPORT_MODE_3D;
115        }
116#endif
117    }
118   LOGV("%s: X", __func__);
119   return;
120}
121
122/* HAL should return NULL if it fails to open camera hardware. */
123extern "C" void * HAL_openCameraHardware(int cameraId, int mode)
124{
125    LOGV("%s: E", __func__);
126    if (!HAL_numOfCameras || HAL_numOfCameras < cameraId ||cameraId < 0) {
127      return NULL;
128    }
129    return QCameraHAL_openCameraHardware(cameraId, mode);
130}
131
132
133}; // namespace android
134