/* 
 | 
 *  Copyright (c) 2019 Rockchip Corporation 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 * 
 | 
 */ 
 | 
  
 | 
#include <linux/v4l2-subdev.h> 
 | 
#include "LensHw.h" 
 | 
  
 | 
namespace RkCam { 
 | 
  
 | 
uint16_t LensHw::DEFAULT_POOL_SIZE = 20; 
 | 
  
 | 
LensHw::LensHw(const char* name) 
 | 
    : V4l2SubDevice (name) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    _rec_sof_idx = 0; 
 | 
    memset(_frame_time, 0, sizeof(_frame_time)); 
 | 
    memset(_frame_sequence, 0, sizeof(_frame_sequence)); 
 | 
    _afInfoPool = new RkAiqAfInfoPool("LensLocalAfInfoParams", LensHw::DEFAULT_POOL_SIZE); 
 | 
    _irisInfoPool = new RkAiqIrisParamsPool("LensLocalIrisInfoParams", LensHw::DEFAULT_POOL_SIZE); 
 | 
    _piris_step = -1; 
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
} 
 | 
  
 | 
LensHw::~LensHw() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::queryLensSupport() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
  
 | 
    _iris_enable = true; 
 | 
    _focus_enable = true; 
 | 
    _zoom_enable = true; 
 | 
  
 | 
    memset(&_iris_query, 0, sizeof(_iris_query)); 
 | 
    _iris_query.id = V4L2_CID_IRIS_ABSOLUTE; 
 | 
    if (io_control(VIDIOC_QUERYCTRL, &_iris_query) < 0) { 
 | 
        LOGI_CAMHW_SUBM(LENS_SUBM, "query iris ctrl failed"); 
 | 
        _iris_enable = false; 
 | 
    } else { 
 | 
        _iris_enable = true; 
 | 
    } 
 | 
  
 | 
    memset(&_focus_query, 0, sizeof(_focus_query)); 
 | 
    _focus_query.id = V4L2_CID_FOCUS_ABSOLUTE; 
 | 
    if (io_control(VIDIOC_QUERYCTRL, &_focus_query) < 0) { 
 | 
        LOGI_CAMHW_SUBM(LENS_SUBM, "query focus ctrl failed"); 
 | 
        _focus_enable = false; 
 | 
    } else { 
 | 
        _focus_enable = true; 
 | 
    } 
 | 
  
 | 
    memset(&_zoom_query, 0, sizeof(_zoom_query)); 
 | 
    _zoom_query.id = V4L2_CID_ZOOM_ABSOLUTE; 
 | 
    if (io_control(VIDIOC_QUERYCTRL, &_zoom_query) < 0) { 
 | 
        LOGI_CAMHW_SUBM(LENS_SUBM, "query zoom ctrl failed"); 
 | 
        _zoom_enable = false; 
 | 
    } else { 
 | 
        _zoom_enable = true; 
 | 
    } 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::start_internal() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
  
 | 
    if (_active) 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
  
 | 
    _rec_sof_idx = 0; 
 | 
    _piris_step = 0; 
 | 
    _last_piris_step = 0; 
 | 
    _dciris_pwmduty = 0; 
 | 
    _last_dciris_pwmduty = 0; 
 | 
    _focus_pos = -1; 
 | 
    _zoom_pos = -1; 
 | 
    memset(&_focus_tim, 0, sizeof(_focus_tim)); 
 | 
    memset(&_zoom_tim, 0, sizeof(_zoom_tim)); 
 | 
    memset(_frame_time, 0, sizeof(_frame_time)); 
 | 
    memset(_frame_sequence, 0, sizeof(_frame_sequence)); 
 | 
    queryLensSupport(); 
 | 
  
 | 
    _active = true; 
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::start() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
  
 | 
    start_internal(); 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::stop() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
  
 | 
    _active = false; 
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getLensModeData(rk_aiq_lens_descriptor& lens_des) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
  
 | 
    queryLensSupport(); 
 | 
    lens_des.focus_support = _focus_enable; 
 | 
    lens_des.iris_support = _iris_enable; 
 | 
    lens_des.zoom_support = _zoom_enable; 
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    struct rk_cam_vcm_cfg cfg; 
 | 
  
 | 
    if (io_control (RK_VIDIOC_GET_VCM_CFG, &cfg) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get vcm cfg failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    lens_cfg.start_ma = cfg.start_ma; 
 | 
    lens_cfg.rated_ma = cfg.rated_ma; 
 | 
    lens_cfg.step_mode = cfg.step_mode; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::setLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    struct rk_cam_vcm_cfg cfg; 
 | 
  
 | 
    cfg.start_ma = lens_cfg.start_ma; 
 | 
    cfg.rated_ma = lens_cfg.rated_ma; 
 | 
    cfg.step_mode = lens_cfg.step_mode; 
 | 
    if (io_control (RK_VIDIOC_SET_VCM_CFG, &cfg) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "set vcm cfg failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::setFocusParams(int position) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_focus_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "focus is not supported"); 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
    } 
 | 
  
 | 
    if (!_active) 
 | 
        start_internal(); 
 | 
  
 | 
    if (position < _focus_query.minimum) 
 | 
        position = _focus_query.minimum; 
 | 
    if (position > _focus_query.maximum) 
 | 
        position = _focus_query.maximum; 
 | 
  
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_FOCUS_ABSOLUTE; 
 | 
    control.value = position; 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "|||set focus result: %d, control.value %d", position, control.value); 
 | 
    if (io_control (VIDIOC_S_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "set focus result failed to device"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _focus_pos = position; 
 | 
  
 | 
    struct rk_cam_vcm_tim tim; 
 | 
    if (io_control (RK_VIDIOC_VCM_TIMEINFO, &tim) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get focus timeinfo failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _focus_tim = tim; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::setPIrisParams(int step) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_iris_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "iris is not supported"); 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
    } 
 | 
  
 | 
    if (!_active) 
 | 
        start_internal(); 
 | 
  
 | 
    if (_piris_step == step) 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
  
 | 
    //get old Piris-step 
 | 
    _last_piris_step = _piris_step; 
 | 
  
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_IRIS_ABSOLUTE; 
 | 
    control.value = step; 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "|||set iris result: %d, control.value %d", step, control.value); 
 | 
    if (io_control (VIDIOC_S_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "set iris result failed to device"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _piris_step = step; 
 | 
  
 | 
    struct rk_cam_motor_tim tim; 
 | 
    if (io_control (RK_VIDIOC_IRIS_TIMEINFO, &tim) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get iris timeinfo failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _piris_tim = tim; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::setDCIrisParams(int pwmDuty) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_iris_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "iris is not supported"); 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
    } 
 | 
  
 | 
    if (!_active) 
 | 
        start_internal(); 
 | 
  
 | 
    if (_dciris_pwmduty == pwmDuty) 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
  
 | 
    //get old Piris-step 
 | 
    _last_dciris_pwmduty = pwmDuty; 
 | 
  
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_IRIS_ABSOLUTE; 
 | 
    control.value = pwmDuty; 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "|||set dc-iris result: %d, control.value %d", pwmDuty, control.value); 
 | 
    if (io_control (VIDIOC_S_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "set dc-iris result failed to device"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _dciris_pwmduty = pwmDuty; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getPIrisParams(int* step) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_iris_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "iris is not supported"); 
 | 
        return XCAM_RETURN_ERROR_FAILED; 
 | 
    } 
 | 
  
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_IRIS_ABSOLUTE; 
 | 
  
 | 
    if (io_control (VIDIOC_G_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get iris result failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    *step = control.value; 
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "|||get iris result: %d, control.value %d", *step, control.value); 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::setZoomParams(int position) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_zoom_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "zoom is not supported"); 
 | 
        return XCAM_RETURN_NO_ERROR; 
 | 
    } 
 | 
  
 | 
    if (!_active) 
 | 
        start_internal(); 
 | 
  
 | 
    if (position < _zoom_query.minimum) 
 | 
        position = _zoom_query.minimum; 
 | 
    if (position > _zoom_query.maximum) 
 | 
        position = _zoom_query.maximum; 
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_ZOOM_ABSOLUTE; 
 | 
    control.value = position; 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "||| set zoom result: %d, control.value %d", position, control.value); 
 | 
    if (io_control (VIDIOC_S_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "set zoom result failed to device"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _zoom_pos = position; 
 | 
  
 | 
    struct rk_cam_vcm_tim tim; 
 | 
    if (io_control (RK_VIDIOC_ZOOM_TIMEINFO, &tim) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get zoom timeinfo failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    _zoom_tim = tim; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getFocusParams(int* position) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_focus_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "focus is not supported"); 
 | 
        return XCAM_RETURN_ERROR_FAILED; 
 | 
    } 
 | 
  
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_FOCUS_ABSOLUTE; 
 | 
  
 | 
    if (io_control (VIDIOC_G_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get focus result failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    *position = control.value; 
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "|||get focus result: %d, control.value %d", *position, control.value); 
 | 
  
 | 
    _focus_pos = *position; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getZoomParams(int* position) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
  
 | 
    if (!_zoom_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "zoom is not supported"); 
 | 
        return XCAM_RETURN_ERROR_FAILED; 
 | 
    } 
 | 
  
 | 
    xcam_mem_clear (control); 
 | 
    control.id = V4L2_CID_ZOOM_ABSOLUTE; 
 | 
  
 | 
    if (io_control (VIDIOC_G_CTRL, &control) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "get zoom result failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
    *position = control.value; 
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "|||get zoom result: %d, control.value %d", *position, control.value); 
 | 
  
 | 
    _zoom_pos = *position; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::FocusCorrection() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
    int correction = 0; 
 | 
  
 | 
    if (!_focus_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "focus is not supported"); 
 | 
        return XCAM_RETURN_ERROR_FAILED; 
 | 
    } 
 | 
  
 | 
    if (io_control (RK_VIDIOC_FOCUS_CORRECTION, &correction) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "focus correction failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::ZoomCorrection() 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
    struct v4l2_control control; 
 | 
    int correction = 0; 
 | 
  
 | 
    if (!_zoom_enable) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "zoom is not supported"); 
 | 
        return XCAM_RETURN_ERROR_FAILED; 
 | 
    } 
 | 
  
 | 
    if (io_control (RK_VIDIOC_ZOOM_CORRECTION, &correction) < 0) { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "zoom correction failed"); 
 | 
        return XCAM_RETURN_ERROR_IOCTL; 
 | 
    } 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::handle_sof(int64_t time, int frameid) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    //SmartLock locker (_mutex); 
 | 
  
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
    int idx; 
 | 
  
 | 
    idx = (_rec_sof_idx + 1) % LENSHW_RECORD_SOF_NUM; 
 | 
    _frame_sequence[idx] = frameid; 
 | 
    _frame_time[idx] = time; 
 | 
    _rec_sof_idx = idx; 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "%s: frm_id %d, time %lld\n", __func__, frameid, time); 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getIrisInfoParams(SmartPtr<RkAiqIrisParamsProxy>& irisParams, int frame_id) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    //SmartLock locker (_mutex); 
 | 
  
 | 
    int i; 
 | 
  
 | 
    irisParams = NULL; 
 | 
    if (_irisInfoPool->has_free_items()) { 
 | 
        irisParams = (SmartPtr<RkAiqIrisParamsProxy>)_irisInfoPool->get_item(); 
 | 
    } else { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "%s: no free params buffer!\n", __FUNCTION__); 
 | 
        return XCAM_RETURN_ERROR_MEM; 
 | 
    } 
 | 
  
 | 
    for (i = 0; i < LENSHW_RECORD_SOF_NUM; i++) { 
 | 
        if (frame_id == _frame_sequence[i]) 
 | 
            break; 
 | 
    } 
 | 
  
 | 
    //Piris 
 | 
    irisParams->data()->PIris.StartTim = _piris_tim.motor_start_t; 
 | 
    irisParams->data()->PIris.EndTim = _piris_tim.motor_end_t; 
 | 
    irisParams->data()->PIris.laststep = _last_piris_step; 
 | 
    irisParams->data()->PIris.step = _piris_step; 
 | 
  
 | 
    //DCiris 
 | 
  
 | 
    if (i < LENSHW_RECORD_SOF_NUM) { 
 | 
        irisParams->data()->sofTime = _frame_time[i]; 
 | 
    } else { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "%s: frame_id %d, can not find sof time!\n", __FUNCTION__, frame_id); 
 | 
        return  XCAM_RETURN_ERROR_PARAM; 
 | 
    } 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "%s: frm_id %d, time %lld\n", __func__, frame_id, irisParams->data()->sofTime); 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
LensHw::getAfInfoParams(SmartPtr<RkAiqAfInfoProxy>& afInfo, int frame_id) 
 | 
{ 
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    SmartLock locker (_mutex); 
 | 
  
 | 
    int i; 
 | 
  
 | 
    afInfo = NULL; 
 | 
    if (_afInfoPool->has_free_items()) { 
 | 
        afInfo = (SmartPtr<RkAiqAfInfoProxy>)_afInfoPool->get_item(); 
 | 
    } else { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "%s: no free params buffer!\n", __FUNCTION__); 
 | 
        return XCAM_RETURN_ERROR_MEM; 
 | 
    } 
 | 
  
 | 
    for (i = 0; i < LENSHW_RECORD_SOF_NUM; i++) { 
 | 
        if (frame_id == _frame_sequence[i]) 
 | 
            break; 
 | 
    } 
 | 
  
 | 
    afInfo->data()->focusStartTim = _focus_tim.vcm_start_t; 
 | 
    afInfo->data()->focusEndTim = _focus_tim.vcm_end_t; 
 | 
    afInfo->data()->zoomStartTim = _zoom_tim.vcm_start_t; 
 | 
    afInfo->data()->zoomEndTim = _zoom_tim.vcm_end_t; 
 | 
    afInfo->data()->focusCode = _focus_pos; 
 | 
    afInfo->data()->zoomCode = _zoom_pos; 
 | 
    if (i < LENSHW_RECORD_SOF_NUM) { 
 | 
        afInfo->data()->sofTime = _frame_time[i]; 
 | 
    } else { 
 | 
        LOGE_CAMHW_SUBM(LENS_SUBM, "%s: frame_id %d, can not find sof time!\n", __FUNCTION__, frame_id); 
 | 
        return  XCAM_RETURN_ERROR_PARAM; 
 | 
    } 
 | 
  
 | 
    LOGD_CAMHW_SUBM(LENS_SUBM, "%s: frm_id %d, time %lld\n", __func__, frame_id, afInfo->data()->sofTime); 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
}; //namespace RkCam 
 |