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