10ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/*
20ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** Copyright (c) 2011 Code Aurora Forum. All rights reserved.
30ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed**
40ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** Licensed under the Apache License, Version 2.0 (the "License");
50ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** you may not use this file except in compliance with the License.
60ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** You may obtain a copy of the License at
70ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed**
80ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed**     http://www.apache.org/licenses/LICENSE-2.0
90ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed**
100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** Unless required by applicable law or agreed to in writing, software
110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** distributed under the License is distributed on an "AS IS" BASIS,
120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** See the License for the specific language governing permissions and
140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** limitations under the License.
150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed*/
160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/*#error uncomment this for compiler test!*/
180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed//#define LOG_NDEBUG 0
200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#define LOG_NIDEBUG 0
210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#define LOG_TAG "QCameraHAL"
220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <utils/Log.h>
230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <utils/threads.h>
240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <fcntl.h>
250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <sys/mman.h>
260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/* include QCamera Hardware Interface Header*/
290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include "QCameraHAL.h"
300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedint HAL_numOfCameras = 0;
320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedcamera_info_t HAL_cameraInfo[MSM_MAX_CAMERA_SENSORS];
330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedmm_camera_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS];
340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedint HAL_currentCameraMode;
350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syednamespace android {
370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/* HAL function implementation goes here*/
380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/**
400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * The functions need to be provided by the camera HAL.
410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed *
420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * and openCameraHardware() is 0 to N-1.
440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed */
450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedextern "C" int HAL_getNumberOfCameras()
460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{
470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    /* try to query every time we get the call!*/
480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    uint8_t num_camera = 0;
490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    mm_camera_t * handle_base = 0;
500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    LOGV("%s: E", __func__);
510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    handle_base= mm_camera_query(&num_camera);
530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    if (!handle_base) {
550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        HAL_numOfCameras = 0;
560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    }
570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    else
580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    {
590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        camera_info_t* p_camera_info = 0;
600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        HAL_numOfCameras=num_camera;
610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        LOGI("Handle base =0x%p",handle_base);
630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        LOGI("getCameraInfo: numOfCameras = %d", HAL_numOfCameras);
640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        for(int i = 0; i < HAL_numOfCameras; i++) {
650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            LOGI("Handle [%d]=0x%p",i,handle_base+i);
660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            HAL_camerahandle[i]=handle_base + i;
670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            p_camera_info = &(HAL_camerahandle[i]->camera_info);
680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            if (p_camera_info) {
690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed                LOGI("Camera sensor %d info:", i);
700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed                LOGI("camera_id: %d", p_camera_info->camera_id);
710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed                LOGI("modes_supported: %x", p_camera_info->modes_supported);
720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed                LOGI("position: %d", p_camera_info->position);
730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed                LOGI("sensor_mount_angle: %d", p_camera_info->sensor_mount_angle);
740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            }
750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        }
760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    }
770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    LOGV("%s: X", __func__);
790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    return HAL_numOfCameras;
810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed}
820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedextern "C" int HAL_isIn3DMode()
840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{
850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    return HAL_currentCameraMode == CAMERA_MODE_3D;
860ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed}
870ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
880ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedextern "C" void HAL_getCameraInfo(int cameraId, struct CameraInfo* cameraInfo)
890ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{
900ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    mm_camera_t *mm_camer_obj = 0;
910ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    LOGV("%s: E", __func__);
920ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
930ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    if (!HAL_numOfCameras || HAL_numOfCameras < cameraId || !cameraInfo)
940ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        return;
950ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    else
960ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        mm_camer_obj = HAL_camerahandle[cameraId];
970ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
980ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    if (!mm_camer_obj)
990ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        return;
1000ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    else {
1010ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        cameraInfo->facing =
1020ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            (FRONT_CAMERA == mm_camer_obj->camera_info.position)?
1030ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            CAMERA_FACING_FRONT : CAMERA_FACING_BACK;
1040ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
1050ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        cameraInfo->orientation = mm_camer_obj->camera_info.sensor_mount_angle;
1060ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#if 0
1070ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        // TODO: fix me
1080ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        /* We always supprot ZSL in our stack*/
1090ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        cameraInfo->mode = CAMERA_SUPPORT_MODE_ZSL;
1100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        if (mm_camer_obj->camera_info.modes_supported & CAMERA_MODE_2D) {
1110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            cameraInfo->mode |= CAMERA_SUPPORT_MODE_2D;
1120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        }
1130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        if (mm_camer_obj->camera_info.modes_supported & CAMERA_MODE_3D) {
1140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            cameraInfo->mode |= CAMERA_SUPPORT_MODE_3D;
1150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed        }
1160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif
1170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    }
1180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed   LOGV("%s: X", __func__);
1190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed   return;
1200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed}
1210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
1220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/* HAL should return NULL if it fails to open camera hardware. */
1230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedextern "C" void * HAL_openCameraHardware(int cameraId, int mode)
1240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{
1250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    LOGV("%s: E", __func__);
1260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    if (!HAL_numOfCameras || HAL_numOfCameras < cameraId ||cameraId < 0) {
1270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed      return NULL;
1280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    }
1290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed    return QCameraHAL_openCameraHardware(cameraId, mode);
1300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed}
1310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
1320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
1330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed}; // namespace android
134