QCameraFlash.cpp revision a4bd7fb36dc2ca78aa0433a537b4f4a88a22f4c0
10b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/* Copyright (c) 2015, The Linux Foundataion. All rights reserved. 20b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* 30b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* Redistribution and use in source and binary forms, with or without 40b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* modification, are permitted provided that the following conditions are 50b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* met: 60b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* * Redistributions of source code must retain the above copyright 70b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* notice, this list of conditions and the following disclaimer. 80b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* * Redistributions in binary form must reproduce the above 90b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* copyright notice, this list of conditions and the following 100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* disclaimer in the documentation and/or other materials provided 110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* with the distribution. 120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* * Neither the name of The Linux Foundation nor the names of its 130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* contributors may be used to endorse or promote products derived 140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* from this software without specific prior written permission. 150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* 160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* 280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*/ 290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <stdio.h> 310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <fcntl.h> 320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <linux/media.h> 330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <media/msmb_camera.h> 340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <media/msm_cam_sensor.h> 350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <utils/Log.h> 360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include "HAL3/QCamera3HWI.h" 380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include "QCameraFlash.h" 390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#define STRING_LENGTH_OF_64_BIT_NUMBER 21 410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamvolatile uint32_t gCamHal3LogLevel = 1; 430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamnamespace qcamera { 450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : getInstance 480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Get and create the QCameraFlash singleton. 500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None 520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : None 540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd TamQCameraFlash& QCameraFlash::getInstance() 560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam static QCameraFlash flashInstance; 580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return flashInstance; 590b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : QCameraFlash 630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: default constructor of QCameraFlash 650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None 670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : None 690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd TamQCameraFlash::QCameraFlash() : m_callbacks(NULL) 710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam memset(&m_flashOn, 0, sizeof(m_flashOn)); 730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam memset(&m_cameraOpen, 0, sizeof(m_cameraOpen)); 740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam for (int pos = 0; pos < MM_CAMERA_MAX_NUM_SENSORS; pos++) { 750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_flashFds[pos] = -1; 760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : ~QCameraFlash 810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: deconstructor of QCameraFlash 830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None 850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : None 870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd TamQCameraFlash::~QCameraFlash() 890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam for (int pos = 0; pos < MM_CAMERA_MAX_NUM_SENSORS; pos++) { 910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (m_flashFds[pos] >= 0) 920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam { 930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam setFlashMode(pos, false); 940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam close(m_flashFds[pos]); 950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_flashFds[pos] = -1; 960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 1010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : registerCallbacks 1020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 1030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: provide flash module with reference to callbacks to framework 1040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 1050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None 1060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 1070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : None 1080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 1090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::registerCallbacks( 1100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam const camera_module_callbacks_t* callbacks) 1110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 1120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam int32_t retVal = 0; 1130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_callbacks = callbacks; 1140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return retVal; 1150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 1160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 1180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : initFlash 1190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 1200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Reserve and initialize the flash unit associated with a 1210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * given camera id. This function is blocking until the 1220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * operation completes or fails. Each flash unit can be "inited" 1230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * by only one process at a time. 1240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 1250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : 1260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * @camera_id : Camera id of the flash. 1270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 1280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : 1290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 0 : success 1300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EBUSY : The flash unit or the resource needed to turn on the 1310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * the flash is busy, typically because the flash is 1320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * already in use. 1330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EINVAL : No flash present at camera_id. 1340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 1350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::initFlash(const int camera_id) 1360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 1370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam int32_t retVal = 0; 1380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam bool hasFlash = false; 1390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam char flashNode[QCAMERA_MAX_FILEPATH_LENGTH]; 1400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam char flashPath[QCAMERA_MAX_FILEPATH_LENGTH] = "/dev/"; 1410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) { 1430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Invalid camera id: %d", __func__, camera_id); 1440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return -EINVAL; 1450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 1460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam QCamera3HardwareInterface::getFlashInfo(camera_id, 1480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam hasFlash, 1490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam flashNode); 1500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam strlcat(flashPath, 1520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam flashNode, 1530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam sizeof(flashPath)); 1540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (!hasFlash) { 1560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: No flash available for camera id: %d", 1570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 1580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 159a4bd7fb36dc2ca78aa0433a537b4f4a88a22f4c0Shuzhen Wang retVal = -ENOSYS; 1600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (m_cameraOpen[camera_id]) { 1610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Camera in use for camera id: %d", 1620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 1630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 1640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EBUSY; 1650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (m_flashFds[camera_id] >= 0) { 1660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: Flash is already inited for camera id: %d", 1670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 1680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 1690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 1700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_flashFds[camera_id] = open(flashPath, O_RDWR | O_NONBLOCK); 1710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (m_flashFds[camera_id] < 0) { 1730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Unable to open node '%s'", 1740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 1750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam flashPath); 1760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EBUSY; 1770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 1780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam struct msm_flash_cfg_data_t cfg; 1790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam struct msm_flash_init_info_t init_info; 1800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam memset(&cfg, 0, sizeof(struct msm_flash_cfg_data_t)); 1810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam memset(&init_info, 0, sizeof(struct msm_flash_init_info_t)); 1820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam init_info.flash_driver_type = FLASH_DRIVER_DEFAULT; 1830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cfg.cfg.flash_init_info = &init_info; 1840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cfg.cfg_type = CFG_FLASH_INIT; 1850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = ioctl(m_flashFds[camera_id], 1860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam VIDIOC_MSM_FLASH_CFG, 1870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam &cfg); 1880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (retVal < 0) { 1890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Unable to init flash for camera id: %d", 1900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 1910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 1920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam close(m_flashFds[camera_id]); 1930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_flashFds[camera_id] = -1; 1940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 1950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 1960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam /* wait for PMIC to init */ 1970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam usleep(5000); 1980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 1990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 2000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: X, retVal = %d", __func__, retVal); 2020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return retVal; 2030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 2040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 2060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : setFlashMode 2070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 2080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Turn on or off the flash associated with a given handle. 2090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * This function is blocking until the operation completes or 2100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * fails. 2110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 2120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : 2130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * @camera_id : Camera id of the flash 2140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * @on : Whether to turn flash on (true) or off (false) 2150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 2160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : 2170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 0 : success 2180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EINVAL : No camera present at camera_id, or it is not inited. 2190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EALREADY: Flash is already in requested state 2200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 2210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::setFlashMode(const int camera_id, const bool mode) 2220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 2230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam int32_t retVal = 0; 2240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam struct msm_flash_cfg_data_t cfg; 2250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) { 2270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Invalid camera id: %d", __func__, camera_id); 2280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EINVAL; 2290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (mode == m_flashOn[camera_id]) { 2300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: flash %d is already in requested state: %d", 2310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 2320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id, 2330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam mode); 2340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EALREADY; 2350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (m_flashFds[camera_id] < 0) { 2360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: called for uninited flash: %d", __func__, camera_id); 2370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EINVAL; 2380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 2390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam memset(&cfg, 0, sizeof(struct msm_flash_cfg_data_t)); 2400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam for (int i = 0; i < MAX_LED_TRIGGERS; i++) 2410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cfg.flash_current[i] = QCAMERA_TORCH_CURRENT_VALUE; 2420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cfg.cfg_type = mode ? CFG_FLASH_LOW: CFG_FLASH_OFF; 2430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = ioctl(m_flashFds[camera_id], 2450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam VIDIOC_MSM_FLASH_CFG, 2460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam &cfg); 2470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (retVal < 0) 2480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Unable to change flash mode to %d for camera id: %d", 2490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, mode, camera_id); 2500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam else 2510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_flashOn[camera_id] = mode; 2520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 2530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return retVal; 2540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 2550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 2570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : deinitFlash 2580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 2590b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Release the flash unit associated with a given camera 2600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * position. This function is blocking until the operation 2610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * completes or fails. 2620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 2630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : 2640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * @camera_id : Camera id of the flash. 2650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 2660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : 2670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 0 : success 2680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EINVAL : No camera present at camera_id or not inited. 2690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 2700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::deinitFlash(const int camera_id) 2710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 2720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam int32_t retVal = 0; 2730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) { 2750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Invalid camera id: %d", __func__, camera_id); 2760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EINVAL; 2770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (m_flashFds[camera_id] < 0) { 2780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: called deinitFlash for uninited flash", __func__); 2790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EINVAL; 2800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 2810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam setFlashMode(camera_id, false); 2820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam struct msm_flash_cfg_data_t cfg; 2840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cfg.cfg_type = CFG_FLASH_RELEASE; 2850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = ioctl(m_flashFds[camera_id], 2860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam VIDIOC_MSM_FLASH_CFG, 2870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam &cfg); 2880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (retVal < 0) { 2890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Failed to release flash for camera id: %d", 2900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 2910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 2920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 2930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam close(m_flashFds[camera_id]); 2950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_flashFds[camera_id] = -1; 2960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 2970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 2980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return retVal; 2990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 3000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 3020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : reserveFlashForCamera 3030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 3040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Give control of the flash to the camera, and notify 3050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * framework that the flash has become unavailable. 3060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 3070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : 3080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * @camera_id : Camera id of the flash. 3090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 3100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : 3110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 0 : success 3120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EINVAL : No camera present at camera_id or not inited. 3130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -ENOSYS : No callback available for torch_mode_status_change. 3140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 3150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::reserveFlashForCamera(const int camera_id) 3160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 3170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam int32_t retVal = 0; 3180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) { 3200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Invalid camera id: %d", __func__, camera_id); 3210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EINVAL; 3220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (m_cameraOpen[camera_id]) { 3230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: Flash already reserved for camera id: %d", 3240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 3250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 3260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 3270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (m_flashOn[camera_id]) { 3280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam setFlashMode(camera_id, false); 3290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam deinitFlash(camera_id); 3300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 3310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_cameraOpen[camera_id] = true; 3320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam bool hasFlash = false; 3340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam char flashNode[QCAMERA_MAX_FILEPATH_LENGTH]; 3350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam QCamera3HardwareInterface::getFlashInfo(camera_id, 3370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam hasFlash, 3380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam flashNode); 3390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (m_callbacks == NULL || 3410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_callbacks->torch_mode_status_change == NULL) { 3420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Callback is not defined!", __func__); 3430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -ENOSYS; 3440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (!hasFlash) { 3450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: Suppressing callback " 3460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam "because no flash exists for camera id: %d", 3470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 3480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 3490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 3500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam char cameraIdStr[STRING_LENGTH_OF_64_BIT_NUMBER]; 3510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam snprintf(cameraIdStr, STRING_LENGTH_OF_64_BIT_NUMBER, 3520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam "%d", camera_id); 3530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_callbacks->torch_mode_status_change(m_callbacks, 3540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cameraIdStr, 3550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam TORCH_MODE_STATUS_NOT_AVAILABLE); 3560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 3570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 3580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3590b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return retVal; 3600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 3610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*=========================================================================== 3630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION : releaseFlashFromCamera 3640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 3650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Release control of the flash from the camera, and notify 3660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * framework that the flash has become available. 3670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 3680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : 3690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * @camera_id : Camera id of the flash. 3700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 3710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN : 3720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * 0 : success 3730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -EINVAL : No camera present at camera_id or not inited. 3740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * -ENOSYS : No callback available for torch_mode_status_change. 3750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/ 3760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::releaseFlashFromCamera(const int camera_id) 3770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{ 3780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam int32_t retVal = 0; 3790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) { 3810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Invalid camera id: %d", __func__, camera_id); 3820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -EINVAL; 3830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (!m_cameraOpen[camera_id]) { 3840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: Flash not reserved for camera id: %d", 3850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 3860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 3870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 3880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_cameraOpen[camera_id] = false; 3890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam bool hasFlash = false; 3910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam char flashNode[QCAMERA_MAX_FILEPATH_LENGTH]; 3920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam QCamera3HardwareInterface::getFlashInfo(camera_id, 3940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam hasFlash, 3950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam flashNode); 3960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 3970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam if (m_callbacks == NULL || 3980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_callbacks->torch_mode_status_change == NULL) { 3990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam ALOGE("%s: Callback is not defined!", __func__); 4000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam retVal = -ENOSYS; 4010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else if (!hasFlash) { 4020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam CDBG("%s: Suppressing callback " 4030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam "because no flash exists for camera id: %d", 4040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam __func__, 4050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam camera_id); 4060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } else { 4070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam char cameraIdStr[STRING_LENGTH_OF_64_BIT_NUMBER]; 4080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam snprintf(cameraIdStr, STRING_LENGTH_OF_64_BIT_NUMBER, 4090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam "%d", camera_id); 4100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam m_callbacks->torch_mode_status_change(m_callbacks, 4110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam cameraIdStr, 4120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam TORCH_MODE_STATUS_AVAILABLE_OFF); 4130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 4140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam } 4150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 4160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam return retVal; 4170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam} 4180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam 4190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}; // namespace qcamera 420