1a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* 2a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Copyright (c) 2011 Code Aurora Forum. All rights reserved. 3a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 4a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Licensed under the Apache License, Version 2.0 (the "License"); 5a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** you may not use this file except in compliance with the License. 6a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** You may obtain a copy of the License at 7a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 8a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** http://www.apache.org/licenses/LICENSE-2.0 9a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 10a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Unless required by applicable law or agreed to in writing, software 11a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** distributed under the License is distributed on an "AS IS" BASIS, 12a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** See the License for the specific language governing permissions and 14a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** limitations under the License. 15a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang*/ 16a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 17a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/*#error uncomment this for compiler test!*/ 18a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 19a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang//#define ALOG_NDEBUG 0 20a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define ALOG_NIDEBUG 0 21a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define LOG_TAG "QCameraHAL" 22a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/Log.h> 23a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/threads.h> 24a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <fcntl.h> 25a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 26a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 27a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* include QCamera Hardware Interface Header*/ 28a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHAL.h" 29a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 30a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint HAL_numOfCameras = 0; 31a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangmm_camera_info_t * HAL_camerahandle[MSM_MAX_CAMERA_SENSORS]; 32a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangcamera_metadata_t *HAL_staticInfo[MSM_MAX_CAMERA_SENSORS]; 33a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 34a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangnamespace android { 35a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* HAL function implementation goes here*/ 36a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 37a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/** 38a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * The functions need to be provided by the camera HAL. 39a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * 40a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo() 41a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * and openCameraHardware() is 0 to N-1. 42a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang */ 43a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int HAL_getNumberOfCameras() 44a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 45a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* try to query every time we get the call!*/ 46a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint8_t num_camera = 0; 47a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_info_t * handle_base = 0; 48a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: E", __func__); 49a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 50a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang handle_base= camera_query(&num_camera); 51a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 52a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (!handle_base) { 53a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang HAL_numOfCameras = 0; 54a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 55a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang else 56a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang { 57a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang camera_info_t* p_camera_info = NULL; 58a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang HAL_numOfCameras=num_camera; 59a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 60a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("Handle base =0x%p",handle_base); 61a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("getCameraInfo: numOfCameras = %d", HAL_numOfCameras); 62a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for(int i = 0; i < HAL_numOfCameras; i++) { 63a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("Handle [%d]=0x%p",i,handle_base+i); 64a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang HAL_camerahandle[i]=handle_base + i; 65a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_camera_info = &(HAL_camerahandle[i]->camera_info); 66a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (p_camera_info) { 67a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("Camera sensor %d info:", i); 68a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("camera_id: %d", p_camera_info->camera_id); 69a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("modes_supported: %x", p_camera_info->modes_supported); 70a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("position: %d", p_camera_info->position); 71a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("sensor_mount_angle: %d", p_camera_info->sensor_mount_angle); 72a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 73a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 74a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 75a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 76a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: X", __func__); 77a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 78a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return HAL_numOfCameras; 79a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 80a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 81a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int HAL_getCameraInfo(int cameraId, struct camera_info* cameraInfo) 82a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 83a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_info_t *mm_camer_obj = 0; 84a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: E", __func__); 85a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_vtbl_t *p_camera_vtbl=NULL; 86a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t ret; 87a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 88a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (!HAL_numOfCameras || HAL_numOfCameras < cameraId || !cameraInfo) 89a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return INVALID_OPERATION; 90a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang else 91a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camer_obj = HAL_camerahandle[cameraId]; 92a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 93a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (!mm_camer_obj) 94a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return INVALID_OPERATION; 95a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang else { 96a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cameraInfo->facing = 97a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang (FRONT_CAMERA == mm_camer_obj->camera_info.position)? 98a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang CAMERA_FACING_FRONT : CAMERA_FACING_BACK; 99a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 100a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cameraInfo->orientation = mm_camer_obj->camera_info.sensor_mount_angle; 101a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 102a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 103a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (HAL_staticInfo[cameraId]) 104a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto end; 105a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 106a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* 107a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * We need to open the camera in order to get the full list of static properties 108a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * required in the Google Camera API 2.0 109a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang */ 110a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_camera_vtbl=camera_open(cameraId, NULL); 111a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 112a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(p_camera_vtbl == NULL) { 113a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s:camera_open failed",__func__); 114a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return INVALID_OPERATION; 115a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 116a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_camera_vtbl->ops->sync(p_camera_vtbl->camera_handle); 117a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 118a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = getStaticInfo(&HAL_staticInfo[cameraId], p_camera_vtbl, true); 119a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (ret != OK) { 120a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Unable to allocate static info: %s (%d)", 121a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang __FUNCTION__, strerror(-ret), ret); 122a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return ret; 123a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 124a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = getStaticInfo(&HAL_staticInfo[cameraId], p_camera_vtbl, false); 125a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (ret != OK) { 126a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Unable to fill in static info: %s (%d)", 127a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang __FUNCTION__, strerror(-ret), ret); 128a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return ret; 129a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 130a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_camera_vtbl->ops->camera_close(p_camera_vtbl->camera_handle); 131a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 132a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangend: 133a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cameraInfo->device_version = HARDWARE_DEVICE_API_VERSION(2, 0); 134a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cameraInfo->static_camera_characteristics = 135a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang HAL_staticInfo[cameraId]; 136a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 137a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: X", __func__); 138a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return OK; 139a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 140a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 141a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}; // namespace android 142