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