/*
|
* 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 "CamHwIsp20.h"
|
#include "Isp20Evts.h"
|
#include "rk_isp20_hw.h"
|
#include "Isp20_module_dbg.h"
|
#include "mediactl/mediactl-priv.h"
|
#include <linux/v4l2-subdev.h>
|
#include <sys/mman.h>
|
#ifdef ANDROID_OS
|
#include <cutils/properties.h>
|
#endif
|
#include "SPStreamProcUnit.h"
|
#include "CaptureRawData.h"
|
#include "code_to_pixel_format.h"
|
#include "RkAiqCalibDbV2.h"
|
|
namespace RkCam {
|
std::map<std::string, SmartPtr<rk_aiq_static_info_t>> CamHwIsp20::mCamHwInfos;
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>> CamHwIsp20::mSensorHwInfos;
|
rk_aiq_isp_hw_info_t CamHwIsp20::mIspHwInfos;
|
rk_aiq_cif_hw_info_t CamHwIsp20::mCifHwInfos;
|
|
CamHwIsp20::CamHwIsp20()
|
: _is_exit(false)
|
, _state(CAM_HW_STATE_INVALID)
|
, _hdr_mode(0)
|
, _ispp_module_init_ens(0)
|
, _sharp_fbc_rotation(RK_AIQ_ROTATION_0)
|
, _linked_to_isp(false)
|
{
|
mNoReadBack = false;
|
#ifndef ANDROID_OS
|
char* valueStr = getenv("normal_no_read_back");
|
if (valueStr) {
|
mNoReadBack = atoi(valueStr) > 0 ? true : false;
|
}
|
#else
|
char property_value[PROPERTY_VALUE_MAX] = {'\0'};
|
|
property_get("persist.vendor.rkisp_no_read_back", property_value, "-1");
|
int val = atoi(property_value);
|
if (val != -1)
|
mNoReadBack = atoi(property_value) > 0 ? true : false;
|
#endif
|
xcam_mem_clear(_fec_drv_mem_ctx);
|
xcam_mem_clear(_ldch_drv_mem_ctx);
|
_fec_drv_mem_ctx.type = MEM_TYPE_FEC;
|
_fec_drv_mem_ctx.ops_ctx = this;
|
_fec_drv_mem_ctx.mem_info = (void*)(fec_mem_info_array);
|
|
_ldch_drv_mem_ctx.type = MEM_TYPE_LDCH;
|
_ldch_drv_mem_ctx.ops_ctx = this;
|
_ldch_drv_mem_ctx.mem_info = (void*)(ldch_mem_info_array);
|
xcam_mem_clear(_crop_rect);
|
mParamsAssembler = new IspParamsAssembler("ISP_PARAMS_ASSEMBLER");
|
}
|
|
CamHwIsp20::~CamHwIsp20()
|
{}
|
|
static XCamReturn get_isp_ver(rk_aiq_isp_hw_info_t *hw_info) {
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
struct v4l2_capability cap;
|
V4l2Device vdev(hw_info->isp_info[0].stats_path);
|
|
|
ret = vdev.open();
|
if (ret != XCAM_RETURN_NO_ERROR) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to open dev (%s)", hw_info->isp_info[0].stats_path);
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
if (vdev.query_cap(cap) == XCAM_RETURN_NO_ERROR) {
|
char *p;
|
p = strrchr((char*)cap.driver, '_');
|
if (p == NULL) {
|
ret = XCAM_RETURN_ERROR_FAILED;
|
goto out;
|
}
|
|
if (*(p + 1) != 'v') {
|
ret = XCAM_RETURN_ERROR_FAILED;
|
goto out;
|
}
|
|
hw_info->hw_ver_info.isp_ver = atoi(p + 2);
|
//awb/aec version?
|
vdev.close();
|
return XCAM_RETURN_NO_ERROR;
|
} else {
|
ret = XCAM_RETURN_ERROR_FAILED;
|
goto out;
|
}
|
|
out:
|
vdev.close();
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get isp version failed !");
|
return ret;
|
}
|
|
static XCamReturn get_sensor_caps(rk_sensor_full_info_t *sensor_info) {
|
struct v4l2_subdev_frame_size_enum fsize_enum;
|
struct v4l2_subdev_mbus_code_enum code_enum;
|
std::vector<uint32_t> formats;
|
rk_frame_fmt_t frameSize;
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
V4l2SubDevice vdev(sensor_info->device_name.c_str());
|
ret = vdev.open();
|
if (ret != XCAM_RETURN_NO_ERROR) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to open dev (%s)", sensor_info->device_name.c_str());
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
//get module info
|
struct rkmodule_inf *minfo = &(sensor_info->mod_info);
|
if(vdev.io_control(RKMODULE_GET_MODULE_INFO, minfo) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s %s: Get sensor module info failed", __FUNCTION__, sensor_info->device_name.c_str());
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
sensor_info->len_name = std::string(minfo->base.lens);
|
|
#if 0
|
memset(&code_enum, 0, sizeof(code_enum));
|
while (vdev.io_control(VIDIOC_SUBDEV_ENUM_MBUS_CODE, &code_enum) == 0) {
|
formats.push_back(code_enum.code);
|
code_enum.index++;
|
};
|
|
//TODO: sensor driver not supported now
|
for (auto it = formats.begin(); it != formats.end(); ++it) {
|
fsize_enum.pad = 0;
|
fsize_enum.index = 0;
|
fsize_enum.code = *it;
|
while (vdev.io_control(VIDIOC_SUBDEV_ENUM_FRAME_SIZE, &fsize_enum) == 0) {
|
frameSize.format = (rk_aiq_format_t)fsize_enum.code;
|
frameSize.width = fsize_enum.max_width;
|
frameSize.height = fsize_enum.max_height;
|
sensor_info->frame_size.push_back(frameSize);
|
fsize_enum.index++;
|
};
|
}
|
if(!formats.size() || !sensor_info->frame_size.size()) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s %s: Enum sensor frame size failed", __FUNCTION__, sensor_info->device_name.c_str());
|
ret = XCAM_RETURN_ERROR_FAILED;
|
}
|
#endif
|
|
struct v4l2_subdev_frame_interval_enum fie;
|
memset(&fie, 0, sizeof(fie));
|
while(vdev.io_control(VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL, &fie) == 0) {
|
frameSize.format = (rk_aiq_format_t)fie.code;
|
frameSize.width = fie.width;
|
frameSize.height = fie.height;
|
frameSize.fps = fie.interval.denominator / fie.interval.numerator;
|
frameSize.hdr_mode = fie.reserved[0];
|
sensor_info->frame_size.push_back(frameSize);
|
fie.index++;
|
}
|
if (fie.index == 0)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s %s: Enum sensor frame interval failed", __FUNCTION__, sensor_info->device_name.c_str());
|
vdev.close();
|
|
return ret;
|
}
|
|
static XCamReturn
|
parse_module_info(rk_sensor_full_info_t *sensor_info)
|
{
|
// sensor entity name format SHOULD be like this:
|
// m00_b_ov13850 1-0010
|
std::string entity_name(sensor_info->sensor_name);
|
|
if (entity_name.empty())
|
return XCAM_RETURN_ERROR_SENSOR;
|
|
int parse_index = 0;
|
|
if (entity_name.at(parse_index) != 'm') {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
|
__LINE__, entity_name.c_str(), parse_index);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
|
std::string index_str = entity_name.substr (parse_index, 3);
|
sensor_info->module_index_str = index_str;
|
|
parse_index += 3;
|
|
if (entity_name.at(parse_index) != '_') {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
|
__LINE__, entity_name.c_str(), parse_index);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
|
parse_index++;
|
|
if (entity_name.at(parse_index) != 'b' &&
|
entity_name.at(parse_index) != 'f') {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
|
__LINE__, entity_name.c_str(), parse_index);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
sensor_info->phy_module_orient = entity_name.at(parse_index);
|
|
parse_index++;
|
|
if (entity_name.at(parse_index) != '_') {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
|
__LINE__, entity_name.c_str(), parse_index);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
|
parse_index++;
|
|
std::size_t real_name_end = std::string::npos;
|
if ((real_name_end = entity_name.find(' ')) == std::string::npos) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%d:parse sensor entity name %s error at %d, please check sensor driver !",
|
__LINE__, entity_name.c_str(), parse_index);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
|
std::string real_name_str = entity_name.substr(parse_index, real_name_end - parse_index);
|
sensor_info->module_real_sensor_name = real_name_str;
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s:%d, real sensor name %s, module ori %c, module id %s",
|
__FUNCTION__, __LINE__, sensor_info->module_real_sensor_name.c_str(),
|
sensor_info->phy_module_orient, sensor_info->module_index_str.c_str());
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
static rk_aiq_ispp_t*
|
get_ispp_subdevs(struct media_device *device, const char *devpath, rk_aiq_ispp_t* ispp_info)
|
{
|
media_entity *entity = NULL;
|
const char *entity_name = NULL;
|
int index = 0;
|
|
if(!device || !ispp_info || !devpath)
|
return NULL;
|
|
for(index = 0; index < MAX_CAM_NUM; index++) {
|
if (0 == strlen(ispp_info[index].media_dev_path))
|
break;
|
if (0 == strncmp(ispp_info[index].media_dev_path, devpath, sizeof(ispp_info[index].media_dev_path))) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp info of path %s exists!", devpath);
|
return &ispp_info[index];
|
}
|
}
|
|
if (index >= MAX_CAM_NUM)
|
return NULL;
|
|
if (strcmp(device->info.model, "rkispp0") == 0 ||
|
strcmp(device->info.model, "rkispp") == 0)
|
ispp_info[index].model_idx = 0;
|
else if (strcmp(device->info.model, "rkispp1") == 0)
|
ispp_info[index].model_idx = 1;
|
else if (strcmp(device->info.model, "rkispp2") == 0)
|
ispp_info[index].model_idx = 2;
|
else if (strcmp(device->info.model, "rkispp3") == 0)
|
ispp_info[index].model_idx = 3;
|
else
|
ispp_info[index].model_idx = -1;
|
|
strncpy(ispp_info[index].media_dev_path, devpath, sizeof(ispp_info[index].media_dev_path));
|
|
entity = media_get_entity_by_name(device, "rkispp_input_image", strlen("rkispp_input_image"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_input_image_path, entity_name, sizeof(ispp_info[index].pp_input_image_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_m_bypass", strlen("rkispp_m_bypass"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_m_bypass_path, entity_name, sizeof(ispp_info[index].pp_m_bypass_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_scale0", strlen("rkispp_scale0"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_scale0_path, entity_name, sizeof(ispp_info[index].pp_scale0_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_scale1", strlen("rkispp_scale1"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_scale1_path, entity_name, sizeof(ispp_info[index].pp_scale1_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_scale2", strlen("rkispp_scale2"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_scale2_path, entity_name, sizeof(ispp_info[index].pp_scale2_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_tnr_params", strlen("rkispp_tnr_params"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_tnr_params_path, entity_name, sizeof(ispp_info[index].pp_tnr_params_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_tnr_stats", strlen("rkispp_tnr_stats"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_tnr_stats_path, entity_name, sizeof(ispp_info[index].pp_tnr_stats_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_nr_params", strlen("rkispp_nr_params"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_nr_params_path, entity_name, sizeof(ispp_info[index].pp_nr_params_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_nr_stats", strlen("rkispp_nr_stats"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_nr_stats_path, entity_name, sizeof(ispp_info[index].pp_nr_stats_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp_fec_params", strlen("rkispp_fec_params"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_fec_params_path, entity_name, sizeof(ispp_info[index].pp_fec_params_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkispp-subdev", strlen("rkispp-subdev"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(ispp_info[index].pp_dev_path, entity_name, sizeof(ispp_info[index].pp_dev_path));
|
}
|
}
|
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "model(%s): ispp_info(%d): ispp-subdev entity name: %s\n",
|
device->info.model, index,
|
ispp_info[index].pp_dev_path);
|
|
return &ispp_info[index];
|
}
|
|
static rk_aiq_isp_t*
|
get_isp_subdevs(struct media_device *device, const char *devpath, rk_aiq_isp_t* isp_info)
|
{
|
media_entity *entity = NULL;
|
const char *entity_name = NULL;
|
int index = 0;
|
if(!device || !isp_info || !devpath)
|
return NULL;
|
|
for(index = 0; index < MAX_CAM_NUM; index++) {
|
if (0 == strlen(isp_info[index].media_dev_path))
|
break;
|
if (0 == strncmp(isp_info[index].media_dev_path, devpath, sizeof(isp_info[index].media_dev_path))) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp info of path %s exists!", devpath);
|
return &isp_info[index];
|
}
|
}
|
if (index >= MAX_CAM_NUM)
|
return NULL;
|
|
if (strcmp(device->info.model, "rkisp0") == 0 ||
|
strcmp(device->info.model, "rkisp") == 0)
|
isp_info[index].model_idx = 0;
|
else if (strcmp(device->info.model, "rkisp1") == 0)
|
isp_info[index].model_idx = 1;
|
else if (strcmp(device->info.model, "rkisp2") == 0)
|
isp_info[index].model_idx = 2;
|
else if (strcmp(device->info.model, "rkisp3") == 0)
|
isp_info[index].model_idx = 3;
|
else
|
isp_info[index].model_idx = -1;
|
|
strncpy(isp_info[index].media_dev_path, devpath, sizeof(isp_info[index].media_dev_path));
|
|
entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].isp_dev_path, entity_name, sizeof(isp_info[index].isp_dev_path));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkisp-csi-subdev", strlen("rkisp-csi-subdev"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].csi_dev_path, entity_name, sizeof(isp_info[index].csi_dev_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp-mpfbc-subdev", strlen("rkisp-mpfbc-subdev"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].mpfbc_dev_path, entity_name, sizeof(isp_info[index].mpfbc_dev_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_mainpath", strlen("rkisp_mainpath"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].main_path, entity_name, sizeof(isp_info[index].main_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_selfpath", strlen("rkisp_selfpath"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].self_path, entity_name, sizeof(isp_info[index].self_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawwr0", strlen("rkisp_rawwr0"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawwr0_path, entity_name, sizeof(isp_info[index].rawwr0_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawwr1", strlen("rkisp_rawwr1"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawwr1_path, entity_name, sizeof(isp_info[index].rawwr1_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawwr2", strlen("rkisp_rawwr2"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawwr2_path, entity_name, sizeof(isp_info[index].rawwr2_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawwr3", strlen("rkisp_rawwr3"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawwr3_path, entity_name, sizeof(isp_info[index].rawwr3_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_dmapath", strlen("rkisp_dmapath"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].dma_path, entity_name, sizeof(isp_info[index].dma_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawrd0_m", strlen("rkisp_rawrd0_m"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawrd0_m_path, entity_name, sizeof(isp_info[index].rawrd0_m_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawrd1_l", strlen("rkisp_rawrd1_l"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawrd1_l_path, entity_name, sizeof(isp_info[index].rawrd1_l_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp_rawrd2_s", strlen("rkisp_rawrd2_s"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].rawrd2_s_path, entity_name, sizeof(isp_info[index].rawrd2_s_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp-statistics", strlen("rkisp-statistics"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].stats_path, entity_name, sizeof(isp_info[index].stats_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp-input-params", strlen("rkisp-input-params"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].input_params_path, entity_name, sizeof(isp_info[index].input_params_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rkisp-mipi-luma", strlen("rkisp-mipi-luma"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].mipi_luma_path, entity_name, sizeof(isp_info[index].mipi_luma_path));
|
}
|
}
|
entity = media_get_entity_by_name(device, "rockchip-mipi-dphy-rx", strlen("rockchip-mipi-dphy-rx"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].mipi_dphy_rx_path, entity_name, sizeof(isp_info[index].mipi_dphy_rx_path));
|
}
|
} else {
|
entity = media_get_entity_by_name(device, "rockchip-csi2-dphy0", strlen("rockchip-csi2-dphy0"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(isp_info[index].mipi_dphy_rx_path, entity_name, sizeof(isp_info[index].mipi_dphy_rx_path));
|
}
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkcif_dvp", strlen("rkcif_dvp"));
|
if(entity)
|
isp_info[index].linked_dvp = true;
|
|
entity = media_get_entity_by_name(device, "rkcif_mipi_lvds", strlen("rkcif_mipi_lvds"));
|
if(entity)
|
isp_info[index].linked_dvp = false;
|
|
if ((entity = media_get_entity_by_name(device, "rkcif_dvp", strlen("rkcif_dvp"))) ||
|
(entity = media_get_entity_by_name(device, "rkcif_lite_mipi_lvds", strlen("rkcif_lite_mipi_lvds"))) ||
|
(entity = media_get_entity_by_name(device, "rkcif_mipi_lvds", strlen("rkcif_mipi_lvds")))) {
|
strncpy(isp_info[index].linked_vicap, entity->info.name, sizeof(isp_info[index].linked_vicap));
|
}
|
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "model(%s): isp_info(%d): ispp-subdev entity name: %s\n",
|
device->info.model, index,
|
isp_info[index].isp_dev_path);
|
|
return &isp_info[index];
|
}
|
|
static rk_aiq_cif_info_t*
|
get_cif_subdevs(struct media_device *device, const char *devpath, rk_aiq_cif_info_t* cif_info)
|
{
|
media_entity *entity = NULL;
|
const char *entity_name = NULL;
|
int index = 0;
|
if(!device || !devpath || !cif_info)
|
return NULL;
|
|
for(index = 0; index < MAX_CAM_NUM; index++) {
|
if (0 == strlen(cif_info[index].media_dev_path))
|
break;
|
if (0 == strncmp(cif_info[index].media_dev_path, devpath, sizeof(cif_info[index].media_dev_path))) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp info of path %s exists!", devpath);
|
return &cif_info[index];
|
}
|
}
|
if (index >= MAX_CAM_NUM)
|
return NULL;
|
|
cif_info[index].model_idx = index;
|
|
strncpy(cif_info[index].media_dev_path, devpath, sizeof(cif_info[index].media_dev_path));
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id0", strlen("stream_cif_mipi_id0"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_id0, entity_name, sizeof(cif_info[index].mipi_id0));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id1", strlen("stream_cif_mipi_id1"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_id1, entity_name, sizeof(cif_info[index].mipi_id1));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id2", strlen("stream_cif_mipi_id2"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_id2, entity_name, sizeof(cif_info[index].mipi_id2));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id3", strlen("stream_cif_mipi_id3"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_id3, entity_name, sizeof(cif_info[index].mipi_id3));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_dvp_id0", strlen("stream_cif_dvp_id0"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].dvp_id0, entity_name, sizeof(cif_info[index].dvp_id0));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_dvp_id1", strlen("stream_cif_dvp_id1"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].dvp_id1, entity_name, sizeof(cif_info[index].dvp_id1));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_dvp_id2", strlen("stream_cif_dvp_id2"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].dvp_id2, entity_name, sizeof(cif_info[index].dvp_id2));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_dvp_id3", strlen("stream_cif_dvp_id3"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].dvp_id3, entity_name, sizeof(cif_info[index].dvp_id3));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkcif-mipi-luma", strlen("rkisp-mipi-luma"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_luma_path, entity_name, sizeof(cif_info[index].mipi_luma_path));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_csi2_sd_path, entity_name, sizeof(cif_info[index].mipi_csi2_sd_path));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].lvds_sd_path, entity_name, sizeof(cif_info[index].lvds_sd_path));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].lvds_sd_path, entity_name, sizeof(cif_info[index].lvds_sd_path));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rockchip-mipi-dphy-rx", strlen("rockchip-mipi-dphy-rx"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_dphy_rx_path, entity_name, sizeof(cif_info[index].mipi_dphy_rx_path));
|
}
|
} else {
|
entity = media_get_entity_by_name(device, "rockchip-csi2-dphy0", strlen("rockchip-csi2-dphy0"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].mipi_dphy_rx_path, entity_name, sizeof(cif_info[index].mipi_dphy_rx_path));
|
}
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif", strlen("stream_cif"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].stream_cif_path, entity_name, sizeof(cif_info[index].stream_cif_path));
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkcif-dvp-sof", strlen("rkcif-dvp-sof"));
|
if(entity) {
|
entity_name = media_entity_get_devname (entity);
|
if(entity_name) {
|
strncpy(cif_info[index].dvp_sof_sd_path, entity_name, sizeof(cif_info[index].dvp_sof_sd_path));
|
}
|
}
|
|
return &cif_info[index];
|
}
|
|
|
static
|
XCamReturn
|
SensorInfoCopy(rk_sensor_full_info_t *finfo, rk_aiq_static_info_t *info) {
|
int fs_num, i = 0;
|
rk_aiq_sensor_info_t *sinfo = NULL;
|
|
//info->media_node_index = finfo->media_node_index;
|
strncpy(info->lens_info.len_name, finfo->len_name.c_str(), sizeof(info->lens_info.len_name));
|
sinfo = &info->sensor_info;
|
strncpy(sinfo->sensor_name, finfo->sensor_name.c_str(), sizeof(sinfo->sensor_name));
|
fs_num = finfo->frame_size.size();
|
if (fs_num) {
|
for (auto iter = finfo->frame_size.begin(); iter != finfo->frame_size.end() && i < 10; ++iter, i++) {
|
sinfo->support_fmt[i].width = (*iter).width;
|
sinfo->support_fmt[i].height = (*iter).height;
|
sinfo->support_fmt[i].format = (*iter).format;
|
sinfo->support_fmt[i].fps = (*iter).fps;
|
sinfo->support_fmt[i].hdr_mode = (*iter).hdr_mode;
|
}
|
sinfo->num = i;
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::selectIqFile(const char* sns_ent_name, char* iqfile_name)
|
{
|
if (!sns_ent_name || !iqfile_name)
|
return XCAM_RETURN_ERROR_SENSOR;
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
|
const struct rkmodule_base_inf* base_inf = NULL;
|
const char *sensor_name, *module_name, *lens_name;
|
char sensor_name_full[32];
|
std::string str(sns_ent_name);
|
|
if ((it = CamHwIsp20::mSensorHwInfos.find(str)) == CamHwIsp20::mSensorHwInfos.end()) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_ent_name);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
base_inf = &(it->second.ptr()->mod_info.base);
|
if (!strlen(base_inf->module) || !strlen(base_inf->sensor) ||
|
!strlen(base_inf->lens)) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no camera module info, check the drv !");
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
sensor_name = base_inf->sensor;
|
strncpy(sensor_name_full, sensor_name, 32);
|
|
module_name = base_inf->module;
|
lens_name = base_inf->lens;
|
if (strlen(module_name) && strlen(lens_name)) {
|
sprintf(iqfile_name, "%s_%s_%s.xml",
|
sensor_name_full, module_name, lens_name);
|
} else {
|
sprintf(iqfile_name, "%s.xml", sensor_name_full);
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
rk_aiq_static_info_t*
|
CamHwIsp20::getStaticCamHwInfo(const char* sns_ent_name, uint16_t index)
|
{
|
std::map<std::string, SmartPtr<rk_aiq_static_info_t>>::iterator it;
|
|
if (sns_ent_name) {
|
std::string str(sns_ent_name);
|
|
it = mCamHwInfos.find(str);
|
if (it != mCamHwInfos.end()) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "find camerainfo of %s!", sns_ent_name);
|
return it->second.ptr();
|
} else {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camerainfo of %s not fount!", sns_ent_name);
|
}
|
} else {
|
if (index >= 0 && index < mCamHwInfos.size()) {
|
int i = 0;
|
for (it = mCamHwInfos.begin(); it != mCamHwInfos.end(); it++, i++) {
|
if (it->first == "FakeCamera")
|
index++;
|
else if (i == index)
|
return it->second.ptr();
|
}
|
}
|
}
|
|
return NULL;
|
}
|
|
XCamReturn
|
CamHwIsp20::clearStaticCamHwInfo()
|
{
|
/* std::map<std::string, SmartPtr<rk_aiq_static_info_t>>::iterator it1; */
|
/* std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it2; */
|
|
/* for (it1 = mCamHwInfos.begin(); it1 != mCamHwInfos.end(); it1++) { */
|
/* rk_aiq_static_info_t *ptr = it1->second.ptr(); */
|
/* delete ptr; */
|
/* } */
|
/* for (it2 = mSensorHwInfos.begin(); it2 != mSensorHwInfos.end(); it2++) { */
|
/* rk_sensor_full_info_t *ptr = it2->second.ptr(); */
|
/* delete ptr; */
|
/* } */
|
mCamHwInfos.clear();
|
mSensorHwInfos.clear();
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
void
|
CamHwIsp20::findAttachedSubdevs(struct media_device *device, uint32_t count, rk_sensor_full_info_t *s_info)
|
{
|
const struct media_entity_desc *entity_info = NULL;
|
struct media_entity *entity = NULL;
|
uint32_t k;
|
|
for (k = 0; k < count; ++k) {
|
entity = media_get_entity (device, k);
|
entity_info = media_entity_get_info(entity);
|
if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_LENS)) {
|
if ((entity_info->name[0] == 'm') &&
|
(strncmp(entity_info->name, s_info->module_index_str.c_str(), 3) == 0)) {
|
if (entity_info->flags == 1)
|
s_info->module_ircut_dev_name = std::string(media_entity_get_devname(entity));
|
else//vcm
|
s_info->module_lens_dev_name = std::string(media_entity_get_devname(entity));
|
}
|
} else if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_FLASH)) {
|
if ((entity_info->name[0] == 'm') &&
|
(strncmp(entity_info->name, s_info->module_index_str.c_str(), 3) == 0)) {
|
|
/* check if entity name has the format string mxx_x_xxx-irxxx */
|
if (strstr(entity_info->name, "-ir") != NULL) {
|
s_info->module_flash_ir_dev_name[s_info->flash_ir_num++] =
|
std::string(media_entity_get_devname(entity));
|
} else
|
s_info->module_flash_dev_name[s_info->flash_num++] =
|
std::string(media_entity_get_devname(entity));
|
}
|
}
|
}
|
// query flash infos
|
if (s_info->flash_num) {
|
SmartPtr<FlashLightHw> fl = new FlashLightHw(s_info->module_flash_dev_name, s_info->flash_num);
|
fl->init(1);
|
s_info->fl_strth_adj_sup = fl->isStrengthAdj();
|
fl->deinit();
|
}
|
if (s_info->flash_ir_num) {
|
SmartPtr<FlashLightHw> fl_ir = new FlashLightHw(s_info->module_flash_ir_dev_name, s_info->flash_ir_num);
|
fl_ir->init(1);
|
s_info->fl_ir_strth_adj_sup = fl_ir->isStrengthAdj();
|
fl_ir->deinit();
|
}
|
}
|
|
XCamReturn
|
CamHwIsp20::initCamHwInfos()
|
{
|
char sys_path[64], devpath[32];
|
FILE *fp = NULL;
|
struct media_device *device = NULL;
|
uint32_t nents, j = 0, i = 0, node_index = 0;
|
const struct media_entity_desc *entity_info = NULL;
|
struct media_entity *entity = NULL;
|
|
xcam_mem_clear (CamHwIsp20::mIspHwInfos);
|
xcam_mem_clear (CamHwIsp20::mCifHwInfos);
|
|
while (i < MAX_MEDIA_INDEX) {
|
node_index = i;
|
snprintf (sys_path, 64, "/dev/media%d", i++);
|
fp = fopen (sys_path, "r");
|
if (!fp)
|
continue;
|
fclose (fp);
|
device = media_device_new (sys_path);
|
|
/* Enumerate entities, pads and links. */
|
media_device_enumerate (device);
|
|
rk_aiq_isp_t* isp_info = NULL;
|
rk_aiq_cif_info_t* cif_info = NULL;
|
bool dvp_itf = false;
|
if (strcmp(device->info.model, "rkispp0") == 0 ||
|
strcmp(device->info.model, "rkispp1") == 0 ||
|
strcmp(device->info.model, "rkispp2") == 0 ||
|
strcmp(device->info.model, "rkispp3") == 0 ||
|
strcmp(device->info.model, "rkispp") == 0) {
|
rk_aiq_ispp_t* ispp_info = get_ispp_subdevs(device, sys_path, CamHwIsp20::mIspHwInfos.ispp_info);
|
if (ispp_info)
|
ispp_info->valid = true;
|
goto media_unref;
|
} else if (strcmp(device->info.model, "rkisp0") == 0 ||
|
strcmp(device->info.model, "rkisp1") == 0 ||
|
strcmp(device->info.model, "rkisp2") == 0 ||
|
strcmp(device->info.model, "rkisp3") == 0 ||
|
strcmp(device->info.model, "rkisp") == 0) {
|
isp_info = get_isp_subdevs(device, sys_path, CamHwIsp20::mIspHwInfos.isp_info);
|
isp_info->valid = true;
|
} else if (strcmp(device->info.model, "rkcif") == 0 ||
|
strcmp(device->info.model, "rkcif_dvp") == 0 ||
|
strcmp(device->info.model, "rkcif_mipi_lvds") == 0 ||
|
strcmp(device->info.model, "rkcif_lite_mipi_lvds") == 0) {
|
cif_info = get_cif_subdevs(device, sys_path, CamHwIsp20::mCifHwInfos.cif_info);
|
strncpy(cif_info->model_str, device->info.model, sizeof(cif_info->model_str));
|
|
if (strcmp(device->info.model, "rkcif_dvp") == 0)
|
dvp_itf = true;
|
} else {
|
goto media_unref;
|
}
|
|
nents = media_get_entities_count (device);
|
for (j = 0; j < nents; ++j) {
|
entity = media_get_entity (device, j);
|
entity_info = media_entity_get_info(entity);
|
if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_SENSOR)) {
|
rk_aiq_static_info_t *info = new rk_aiq_static_info_t();
|
rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t();
|
s_full_info->media_node_index = node_index;
|
strncpy(devpath, media_entity_get_devname(entity), sizeof(devpath));
|
s_full_info->device_name = std::string(devpath);
|
s_full_info->sensor_name = std::string(entity_info->name);
|
s_full_info->parent_media_dev = std::string(sys_path);
|
parse_module_info(s_full_info);
|
get_sensor_caps(s_full_info);
|
|
if (cif_info) {
|
s_full_info->linked_to_isp = false;
|
s_full_info->cif_info = cif_info;
|
s_full_info->isp_info = NULL;
|
s_full_info->dvp_itf = dvp_itf;
|
} else if (isp_info) {
|
s_full_info->linked_to_isp = true;
|
isp_info->linked_sensor = true;
|
s_full_info->isp_info = isp_info;
|
} else {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "sensor device mount error!\n");
|
}
|
|
findAttachedSubdevs(device, nents, s_full_info);
|
SensorInfoCopy(s_full_info, info);
|
info->has_lens_vcm = s_full_info->module_lens_dev_name.empty() ? false : true;
|
info->has_fl = s_full_info->flash_num > 0 ? true : false;
|
info->has_irc = s_full_info->module_ircut_dev_name.empty() ? false : true;
|
info->fl_strth_adj_sup = s_full_info->fl_ir_strth_adj_sup;
|
info->fl_ir_strth_adj_sup = s_full_info->fl_ir_strth_adj_sup;
|
CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
|
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = info;
|
}
|
}
|
|
media_unref:
|
media_device_unref (device);
|
}
|
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator iter;
|
for(iter = CamHwIsp20::mSensorHwInfos.begin(); \
|
iter != CamHwIsp20::mSensorHwInfos.end(); iter++) {
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "match the sensor_name(%s) media link\n", (iter->first).c_str());
|
SmartPtr<rk_sensor_full_info_t> s_full_info = iter->second;
|
|
/*
|
* The ISP and ISPP match links through the media device model
|
*/
|
if (s_full_info->linked_to_isp) {
|
for (i = 0; i < MAX_CAM_NUM; i++) {
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "isp model_idx: %d, ispp(%d) model_idx: %d\n",
|
s_full_info->isp_info->model_idx,
|
i,
|
CamHwIsp20::mIspHwInfos.ispp_info[i].model_idx);
|
|
if (CamHwIsp20::mIspHwInfos.ispp_info[i].valid &&
|
(s_full_info->isp_info->model_idx == CamHwIsp20::mIspHwInfos.ispp_info[i].model_idx)) {
|
s_full_info->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "isp(%d) link to ispp(%d)\n",
|
s_full_info->isp_info->model_idx,
|
CamHwIsp20::mIspHwInfos.ispp_info[i].model_idx);
|
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx =
|
atoi(s_full_info->ispp_info->media_dev_path + strlen("/dev/media"));
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor %s adapted to pp media %d:%s\n",
|
s_full_info->sensor_name.c_str(),
|
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx,
|
s_full_info->ispp_info->media_dev_path);
|
break;
|
}
|
}
|
} else {
|
/*
|
* Determine which isp that vipCap is linked
|
*/
|
for (i = 0; i < MAX_CAM_NUM; i++) {
|
rk_aiq_isp_t* isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
|
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "vicap %s, linked_vicap %s",
|
s_full_info->cif_info->model_str, isp_info->linked_vicap);
|
if (strcmp(s_full_info->cif_info->model_str, isp_info->linked_vicap) == 0) {
|
s_full_info->isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
|
if (CamHwIsp20::mIspHwInfos.ispp_info[i].valid)
|
s_full_info->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "vicap link to isp(%d) to ispp(%d)\n",
|
s_full_info->isp_info->model_idx,
|
s_full_info->ispp_info ? s_full_info->ispp_info->model_idx : -1);
|
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx =
|
s_full_info->ispp_info ? atoi(s_full_info->ispp_info->media_dev_path + strlen("/dev/media")) :
|
-1;
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor %s adapted to pp media %d:%s\n",
|
s_full_info->sensor_name.c_str(),
|
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx,
|
s_full_info->ispp_info ? s_full_info->ispp_info->media_dev_path : "null");
|
CamHwIsp20::mIspHwInfos.isp_info[i].linked_sensor = true;
|
break;
|
}
|
}
|
}
|
|
if (!s_full_info->isp_info/* || !s_full_info->ispp_info*/) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get isp or ispp info fail, something gos wrong!");
|
} else {
|
//CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->linked_isp_info = *s_full_info->isp_info;
|
//CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->linked_ispp_info = *s_full_info->ispp_info;
|
}
|
}
|
|
/* Look for free isp&ispp link to fake camera */
|
for (i = 0; i < 2; i++) {
|
if (CamHwIsp20::mIspHwInfos.isp_info[i].valid &&
|
!CamHwIsp20::mIspHwInfos.isp_info[i].linked_sensor) {
|
rk_aiq_static_info_t *hwinfo = new rk_aiq_static_info_t();
|
rk_sensor_full_info_t *fullinfo = new rk_sensor_full_info_t();
|
|
fullinfo->isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
|
fullinfo->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
|
fullinfo->media_node_index = -1;
|
fullinfo->device_name = std::string("/dev/null");
|
fullinfo->sensor_name = std::string("FakeCamera");
|
fullinfo->parent_media_dev = std::string("/dev/null");
|
fullinfo->linked_to_isp = true;
|
|
hwinfo->sensor_info.binded_strm_media_idx =
|
atoi(fullinfo->ispp_info->media_dev_path + strlen("/dev/media"));
|
|
CamHwIsp20::mIspHwInfos.isp_info[i].linked_sensor = true;
|
|
SensorInfoCopy(fullinfo, hwinfo);
|
hwinfo->has_lens_vcm = false;
|
hwinfo->has_fl = false;
|
hwinfo->has_irc = false;
|
hwinfo->fl_strth_adj_sup = 0;
|
hwinfo->fl_ir_strth_adj_sup = 0;
|
CamHwIsp20::mSensorHwInfos[fullinfo->sensor_name] = fullinfo;
|
CamHwIsp20::mCamHwInfos[fullinfo->sensor_name] = hwinfo;
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "fake camera link to isp(%d) to ispp(%d)\n",
|
fullinfo->isp_info->model_idx,
|
fullinfo->ispp_info->model_idx);
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor %s adapted to pp media %d:%s\n",
|
fullinfo->sensor_name.c_str(),
|
CamHwIsp20::mCamHwInfos[fullinfo->sensor_name]->sensor_info.binded_strm_media_idx,
|
fullinfo->ispp_info->media_dev_path);
|
break;
|
}
|
}
|
if (i == 2) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "No free isp&ispp needed by fake camera!");
|
}
|
|
get_isp_ver(&CamHwIsp20::mIspHwInfos);
|
for (auto &item : mCamHwInfos)
|
item.second->isp_hw_ver = mIspHwInfos.hw_ver_info.isp_ver;
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
const char*
|
CamHwIsp20::getBindedSnsEntNmByVd(const char* vd)
|
{
|
if (!vd)
|
return NULL;
|
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator iter;
|
for(iter = CamHwIsp20::mSensorHwInfos.begin(); \
|
iter != CamHwIsp20::mSensorHwInfos.end(); iter++) {
|
SmartPtr<rk_sensor_full_info_t> s_full_info = iter->second;
|
|
if (s_full_info->isp_info == NULL)
|
continue;
|
|
bool stream_vd = false;
|
if (s_full_info->ispp_info) {
|
if (strstr(s_full_info->ispp_info->pp_m_bypass_path, vd) ||
|
strstr(s_full_info->ispp_info->pp_scale0_path, vd) ||
|
strstr(s_full_info->ispp_info->pp_scale1_path, vd) ||
|
strstr(s_full_info->ispp_info->pp_scale2_path, vd))
|
stream_vd = true;
|
} else {
|
if (strstr(s_full_info->isp_info->main_path, vd) ||
|
strstr(s_full_info->isp_info->self_path, vd))
|
stream_vd = true;
|
}
|
if (stream_vd) {
|
// check linked
|
FILE *fp = NULL;
|
struct media_device *device = NULL;
|
uint32_t nents, j = 0, i = 0;
|
const struct media_entity_desc *entity_info = NULL;
|
struct media_entity *entity = NULL;
|
media_pad *src_pad_s = NULL;
|
char sys_path[64], devpath[32];
|
|
snprintf (sys_path, 64, "/dev/media%d", s_full_info->media_node_index);
|
fp = fopen (sys_path, "r");
|
if (!fp)
|
continue;
|
fclose (fp);
|
device = media_device_new (sys_path);
|
|
/* Enumerate entities, pads and links. */
|
media_device_enumerate (device);
|
entity = media_get_entity_by_name(device,
|
s_full_info->sensor_name.c_str(),
|
s_full_info->sensor_name.size());
|
entity_info = media_entity_get_info(entity);
|
if (entity && entity->num_links > 0) {
|
if (entity->links[0].flags == MEDIA_LNK_FL_ENABLED) {
|
media_device_unref (device);
|
return s_full_info->sensor_name.c_str();
|
}
|
}
|
media_device_unref (device);
|
}
|
}
|
|
return NULL;
|
}
|
|
XCamReturn
|
CamHwIsp20::init_pp(rk_sensor_full_info_t *s_info)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<PollThread> isp20IsppPollthread;
|
|
if (!s_info->ispp_info)
|
return ret;
|
|
if (!strlen(s_info->ispp_info->media_dev_path))
|
return ret;
|
_ispp_sd = new V4l2SubDevice(s_info->ispp_info->pp_dev_path);
|
_ispp_sd ->open();
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "pp_dev_path: %s\n", s_info->ispp_info->pp_dev_path);
|
|
mTnrStreamProcUnit = new TnrStreamProcUnit(s_info);
|
mTnrStreamProcUnit->set_devices(this, _ispp_sd);
|
mNrStreamProcUnit = new NrStreamProcUnit(s_info);
|
mNrStreamProcUnit->set_devices(this, _ispp_sd);
|
mFecParamStream = new FecParamStream(s_info);
|
mFecParamStream->set_devices(this, _ispp_sd);
|
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::init(const char* sns_ent_name)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw;
|
SmartPtr<LensHw> lensHw;
|
SmartPtr<V4l2Device> mipi_tx_devs[3];
|
SmartPtr<V4l2Device> mipi_rx_devs[3];
|
std::string sensor_name(sns_ent_name);
|
|
ENTER_CAMHW_FUNCTION();
|
|
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
|
if ((it = mSensorHwInfos.find(sensor_name)) == mSensorHwInfos.end()) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_ent_name);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
rk_sensor_full_info_t *s_info = it->second.ptr();
|
sensorHw = new SensorHw(s_info->device_name.c_str());
|
mSensorDev = sensorHw;
|
mSensorDev->open();
|
|
strncpy(sns_name, sns_ent_name, sizeof(sns_name));
|
|
if (s_info->linked_to_isp)
|
_linked_to_isp = true;
|
|
mIspCoreDev = new V4l2SubDevice(s_info->isp_info->isp_dev_path);
|
mIspCoreDev->open();
|
|
if (strlen(s_info->isp_info->mipi_luma_path)) {
|
if (_linked_to_isp) {
|
mIspLumaDev = new V4l2Device(s_info->isp_info->mipi_luma_path);
|
} else
|
mIspLumaDev = new V4l2Device(s_info->cif_info->mipi_luma_path);
|
mIspLumaDev->open();
|
}
|
|
mIspStatsDev = new V4l2Device (s_info->isp_info->stats_path);
|
mIspStatsDev->open();
|
mIspParamsDev = new V4l2Device (s_info->isp_info->input_params_path);
|
mIspParamsDev->open();
|
|
if (!s_info->module_lens_dev_name.empty()) {
|
lensHw = new LensHw(s_info->module_lens_dev_name.c_str());
|
mLensDev = lensHw;
|
mLensDev->open();
|
}
|
|
if(!s_info->module_ircut_dev_name.empty()) {
|
mIrcutDev = new V4l2SubDevice(s_info->module_ircut_dev_name.c_str());
|
mIrcutDev->open();
|
}
|
|
if (!_linked_to_isp) {
|
if (strlen(s_info->cif_info->mipi_csi2_sd_path) > 0)
|
_cif_csi2_sd = new V4l2SubDevice (s_info->cif_info->mipi_csi2_sd_path);
|
else if (strlen(s_info->cif_info->lvds_sd_path) > 0)
|
_cif_csi2_sd = new V4l2SubDevice (s_info->cif_info->lvds_sd_path);
|
else if (strlen(s_info->cif_info->dvp_sof_sd_path) > 0)
|
_cif_csi2_sd = new V4l2SubDevice (s_info->cif_info->dvp_sof_sd_path);
|
else
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "_cif_csi2_sd is null! \n");
|
_cif_csi2_sd->open();
|
}
|
|
init_pp(s_info);
|
|
mIspSpDev = new V4l2Device (s_info->isp_info->self_path);//rkisp_selfpath
|
mIspSpDev->open();
|
mSpStreamUnit = new SPStreamProcUnit(mIspSpDev, ISP_POLL_SP);
|
mSpStreamUnit->set_devices(this, mIspCoreDev, _ispp_sd);
|
|
mRawCapUnit = new RawStreamCapUnit(s_info, _linked_to_isp);
|
mRawProcUnit = new RawStreamProcUnit(s_info, _linked_to_isp);
|
mRawProcUnit->set_devices(mIspCoreDev, this);
|
mRawCapUnit->set_devices(mIspCoreDev, this, mRawProcUnit.ptr());
|
//isp stats
|
mIspStatsStream = new RKStatsStream(mIspStatsDev, ISP_POLL_3A_STATS);
|
mIspStatsStream->setPollCallback (this);
|
mIspStatsStream->set_event_handle_dev(sensorHw);
|
if(lensHw.ptr()) {
|
mIspStatsStream->set_focus_handle_dev(lensHw);
|
}
|
mIspStatsStream->set_rx_handle_dev(this);
|
//luma
|
if (mIspLumaDev.ptr()) {
|
mLumaStream = new RKStream(mIspLumaDev, ISP_POLL_LUMA);
|
mLumaStream->setPollCallback (this);
|
}
|
//isp params
|
mIspParamStream = new RKStream(mIspParamsDev, ISP_POLL_PARAMS);
|
|
//sof event
|
if (_linked_to_isp)
|
mIspSofStream = new RKSofEventStream(mIspCoreDev, ISP_POLL_SOF);
|
else
|
mIspSofStream = new RKSofEventStream(_cif_csi2_sd, ISP_POLL_SOF);
|
mIspSofStream->setPollCallback (this);
|
|
if (s_info->flash_num) {
|
mFlashLight = new FlashLightHw(s_info->module_flash_dev_name, s_info->flash_num);
|
mFlashLight->init(s_info->flash_num);
|
}
|
if (s_info->flash_ir_num) {
|
mFlashLightIr = new FlashLightHw(s_info->module_flash_ir_dev_name, s_info->flash_ir_num);
|
mFlashLightIr->init(s_info->flash_ir_num);
|
}
|
|
xcam_mem_clear (_full_active_isp_params);
|
xcam_mem_clear (_full_active_ispp_params);
|
|
_state = CAM_HW_STATE_INITED;
|
|
EXIT_CAMHW_FUNCTION();
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::deInit()
|
{
|
if (mFlashLight.ptr())
|
mFlashLight->deinit();
|
if (mFlashLightIr.ptr())
|
mFlashLightIr->deinit();
|
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
|
if ((it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
|
rk_sensor_full_info_t *s_info = it->second.ptr();
|
int isp_index = s_info->isp_info->model_idx;
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sensor_name(%s) is linked to isp_index(%d)",
|
sns_name, isp_index);
|
if (!mNoReadBack) {
|
setupHdrLink(RK_AIQ_WORKING_MODE_ISP_HDR3, isp_index, false);
|
setupHdrLink_vidcap(_hdr_mode, isp_index, false);
|
}
|
|
_state = CAM_HW_STATE_INVALID;
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::poll_buffer_ready (SmartPtr<VideoBuffer> &buf)
|
{
|
if (buf->_buf_type == ISP_POLL_3A_STATS) {
|
// stats is comming, means that next params should be ready
|
if (mNoReadBack)
|
mParamsAssembler->forceReady(buf->get_sequence() + 1);
|
}
|
return CamHwBase::poll_buffer_ready(buf);
|
}
|
|
XCamReturn
|
CamHwIsp20::setupPipelineFmtCif(struct v4l2_subdev_selection& sns_sd_sel,
|
struct v4l2_subdev_format& sns_sd_fmt,
|
__u32 sns_v4l_pix_fmt)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
// TODO: set cif crop according to sensor crop bounds
|
|
mRawCapUnit->set_tx_format(sns_sd_sel, sns_v4l_pix_fmt);
|
mRawProcUnit->set_rx_format(sns_sd_sel, sns_v4l_pix_fmt);
|
|
// set isp sink fmt, same as sensor bounds - crop
|
struct v4l2_subdev_format isp_sink_fmt;
|
|
memset(&isp_sink_fmt, 0, sizeof(isp_sink_fmt));
|
isp_sink_fmt.pad = 0;
|
isp_sink_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
ret = mIspCoreDev->getFormat(isp_sink_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
|
return ret;
|
}
|
isp_sink_fmt.format.width = sns_sd_sel.r.width;
|
isp_sink_fmt.format.height = sns_sd_sel.r.height;
|
isp_sink_fmt.format.code = sns_sd_fmt.format.code;
|
|
ret = mIspCoreDev->setFormat(isp_sink_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
|
return ret;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink fmt info: fmt 0x%x, %dx%d !",
|
isp_sink_fmt.format.code, isp_sink_fmt.format.width, isp_sink_fmt.format.height);
|
|
// set selection, isp needn't do the crop
|
struct v4l2_subdev_selection aSelection;
|
memset(&aSelection, 0, sizeof(aSelection));
|
|
aSelection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
aSelection.pad = 0;
|
aSelection.flags = 0;
|
aSelection.target = V4L2_SEL_TGT_CROP;
|
aSelection.r.width = sns_sd_sel.r.width;
|
aSelection.r.height = sns_sd_sel.r.height;
|
aSelection.r.left = 0;
|
aSelection.r.top = 0;
|
ret = mIspCoreDev->set_selection (aSelection);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev crop failed !\n");
|
return ret;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink crop info: %dx%d@%d,%d !",
|
aSelection.r.width, aSelection.r.height,
|
aSelection.r.left, aSelection.r.top);
|
|
// set isp rkisp-isp-subdev src crop
|
aSelection.pad = 2;
|
#if 1 // isp src has no crop
|
ret = mIspCoreDev->set_selection (aSelection);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev source crop failed !\n");
|
return ret;
|
}
|
#endif
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src crop info: %dx%d@%d,%d !",
|
aSelection.r.width, aSelection.r.height,
|
aSelection.r.left, aSelection.r.top);
|
|
// set isp rkisp-isp-subdev src pad fmt
|
struct v4l2_subdev_format isp_src_fmt;
|
|
isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
isp_src_fmt.pad = 2;
|
ret = mIspCoreDev->getFormat(isp_src_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get mIspCoreDev src fmt failed !\n");
|
return ret;
|
}
|
|
isp_src_fmt.format.width = aSelection.r.width;
|
isp_src_fmt.format.height = aSelection.r.height;
|
ret = mIspCoreDev->setFormat(isp_src_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev src fmt failed !\n");
|
return ret;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src fmt info: fmt 0x%x, %dx%d !",
|
isp_src_fmt.format.code, isp_src_fmt.format.width, isp_src_fmt.format.height);
|
|
return ret;
|
|
}
|
|
XCamReturn
|
CamHwIsp20::setupPipelineFmtIsp(struct v4l2_subdev_selection& sns_sd_sel,
|
struct v4l2_subdev_format& sns_sd_fmt,
|
__u32 sns_v4l_pix_fmt)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
mRawCapUnit->set_tx_format(sns_sd_fmt, sns_v4l_pix_fmt);
|
mRawProcUnit->set_rx_format(sns_sd_fmt, sns_v4l_pix_fmt);
|
#ifndef ANDROID_OS // Android camera hal will set pipeline itself
|
// set isp sink fmt, same as sensor fmt
|
struct v4l2_subdev_format isp_sink_fmt;
|
|
memset(&isp_sink_fmt, 0, sizeof(isp_sink_fmt));
|
isp_sink_fmt.pad = 0;
|
isp_sink_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
ret = mIspCoreDev->getFormat(isp_sink_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
|
return ret;
|
}
|
|
isp_sink_fmt.format.width = sns_sd_fmt.format.width;
|
isp_sink_fmt.format.height = sns_sd_fmt.format.height;
|
isp_sink_fmt.format.code = sns_sd_fmt.format.code;
|
|
ret = mIspCoreDev->setFormat(isp_sink_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev fmt failed !\n");
|
return ret;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink fmt info: fmt 0x%x, %dx%d !",
|
isp_sink_fmt.format.code, isp_sink_fmt.format.width, isp_sink_fmt.format.height);
|
|
// set selection, isp do the crop
|
struct v4l2_subdev_selection aSelection;
|
memset(&aSelection, 0, sizeof(aSelection));
|
|
aSelection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
aSelection.pad = 0;
|
aSelection.flags = 0;
|
aSelection.target = V4L2_SEL_TGT_CROP;
|
aSelection.r.width = sns_sd_sel.r.width;
|
aSelection.r.height = sns_sd_sel.r.height;
|
aSelection.r.left = sns_sd_sel.r.left;
|
aSelection.r.top = sns_sd_sel.r.top;
|
ret = mIspCoreDev->set_selection (aSelection);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev crop failed !\n");
|
return ret;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp sink crop info: %dx%d@%d,%d !",
|
aSelection.r.width, aSelection.r.height,
|
aSelection.r.left, aSelection.r.top);
|
|
// set isp rkisp-isp-subdev src crop
|
aSelection.pad = 2;
|
aSelection.target = V4L2_SEL_TGT_CROP;
|
aSelection.r.left = 0;
|
aSelection.r.top = 0;
|
aSelection.r.width = sns_sd_sel.r.width;
|
aSelection.r.height = sns_sd_sel.r.height;
|
#if 1 // isp src has no crop
|
ret = mIspCoreDev->set_selection (aSelection);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev source crop failed !\n");
|
return ret;
|
}
|
#endif
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src crop info: %dx%d@%d,%d !",
|
aSelection.r.width, aSelection.r.height,
|
aSelection.r.left, aSelection.r.top);
|
|
// set isp rkisp-isp-subdev src pad fmt
|
struct v4l2_subdev_format isp_src_fmt;
|
|
isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
isp_src_fmt.pad = 2;
|
ret = mIspCoreDev->getFormat(isp_src_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get mIspCoreDev src fmt failed !\n");
|
return ret;
|
}
|
|
isp_src_fmt.format.width = aSelection.r.width;
|
isp_src_fmt.format.height = aSelection.r.height;
|
ret = mIspCoreDev->setFormat(isp_src_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set mIspCoreDev src fmt failed !\n");
|
return ret;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp src fmt info: fmt 0x%x, %dx%d !",
|
isp_src_fmt.format.code, isp_src_fmt.format.width, isp_src_fmt.format.height);
|
#endif
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setupPipelineFmt()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
// get sensor v4l2 pixfmt
|
SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
rk_aiq_exposure_sensor_descriptor sns_des;
|
if (mSensorSubdev->get_format(&sns_des)) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "getSensorModeData failed \n");
|
return XCAM_RETURN_ERROR_UNKNOWN;
|
}
|
__u32 sns_v4l_pix_fmt = sns_des.sensor_pixelformat;
|
|
struct v4l2_subdev_format sns_sd_fmt;
|
|
// get sensor real outupt size
|
sns_sd_fmt.pad = 0;
|
sns_sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
ret = mSensorDev->getFormat(sns_sd_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get sensor fmt failed !\n");
|
return ret;
|
}
|
|
// get sensor crop bounds
|
struct v4l2_subdev_selection sns_sd_sel;
|
memset(&sns_sd_sel, 0, sizeof(sns_sd_sel));
|
|
ret = mSensorDev->get_selection(0, V4L2_SEL_TGT_CROP_BOUNDS, sns_sd_sel);
|
if (ret) {
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get_selection failed !\n");
|
// TODO, some sensor driver has not implemented this
|
// ioctl now
|
sns_sd_sel.r.width = sns_sd_fmt.format.width;
|
sns_sd_sel.r.height = sns_sd_fmt.format.height;
|
ret = XCAM_RETURN_NO_ERROR;
|
}
|
|
if (!_linked_to_isp && _crop_rect.width && _crop_rect.height) {
|
struct v4l2_format mipi_tx_fmt;
|
memset(&mipi_tx_fmt, 0, sizeof(mipi_tx_fmt));
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "vicap get_crop %dx%d@%d,%d\n",
|
_crop_rect.width, _crop_rect.height, _crop_rect.left, _crop_rect.top);
|
ret = mRawCapUnit->get_tx_device(0)->get_format(mipi_tx_fmt);
|
mipi_tx_fmt.fmt.pix.width = _crop_rect.width;
|
mipi_tx_fmt.fmt.pix.height = _crop_rect.height;
|
ret = mRawCapUnit->get_tx_device(0)->set_format(mipi_tx_fmt);
|
sns_sd_sel.r.width = _crop_rect.width;
|
sns_sd_sel.r.height = _crop_rect.height;
|
sns_sd_fmt.format.width = _crop_rect.width;
|
sns_sd_fmt.format.height = _crop_rect.height;
|
ret = XCAM_RETURN_NO_ERROR;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sensor fmt info: bounds %dx%d, crop %dx%d@%d,%d !",
|
sns_sd_sel.r.width, sns_sd_sel.r.height,
|
sns_sd_fmt.format.width, sns_sd_fmt.format.height,
|
sns_sd_sel.r.left, sns_sd_sel.r.top);
|
|
if (_linked_to_isp)
|
ret = setupPipelineFmtIsp(sns_sd_sel, sns_sd_fmt, sns_v4l_pix_fmt);
|
else
|
ret = setupPipelineFmtCif(sns_sd_sel, sns_sd_fmt, sns_v4l_pix_fmt);
|
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set ispcore fmt failed !\n");
|
return ret;
|
}
|
|
if (!_ispp_sd.ptr())
|
return ret;
|
|
struct v4l2_subdev_format isp_src_fmt;
|
|
isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
isp_src_fmt.pad = 2;
|
ret = mIspCoreDev->getFormat(isp_src_fmt);
|
|
// set ispp format, same as isp_src_fmt
|
isp_src_fmt.pad = 0;
|
ret = _ispp_sd->setFormat(isp_src_fmt);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set _ispp_sd sink fmt failed !\n");
|
return ret;
|
}
|
#if 0//not use
|
struct v4l2_subdev_selection aSelection;
|
memset(&aSelection, 0, sizeof(aSelection));
|
|
aSelection.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
aSelection.pad = 0;
|
aSelection.target = V4L2_SEL_TGT_CROP_BOUNDS;
|
aSelection.flags = 0;
|
aSelection.r.left = 0;
|
aSelection.r.top = 0;
|
aSelection.r.width = isp_src_fmt.format.width;
|
aSelection.r.height = isp_src_fmt.format.height;
|
#if 0
|
ret = _ispp_sd->set_selection (aSelection);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set _ispp_sd crop bound failed !\n");
|
return ret;
|
}
|
#endif
|
aSelection.target = V4L2_SEL_TGT_CROP;
|
ret = _ispp_sd->set_selection (aSelection);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set _ispp_sd crop failed !\n");
|
return ret;
|
}
|
#endif
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispp sd fmt info: %dx%d",
|
isp_src_fmt.format.width, isp_src_fmt.format.height);
|
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setupHdrLink_vidcap(int hdr_mode, int cif_index, bool enable)
|
{
|
media_device *device = NULL;
|
media_entity *entity = NULL;
|
media_pad *src_pad_s = NULL, *src_pad_m = NULL, *src_pad_l = NULL, *sink_pad = NULL;
|
|
// TODO: have some bugs now
|
return XCAM_RETURN_NO_ERROR;
|
|
if (_linked_to_isp)
|
return XCAM_RETURN_NO_ERROR;
|
|
// TODO: normal mode
|
device = media_device_new (mCifHwInfos.cif_info[cif_index].media_dev_path);
|
|
/* Enumerate entities, pads and links. */
|
media_device_enumerate (device);
|
entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
|
if(entity) {
|
src_pad_s = (media_pad *)media_entity_get_pad(entity, 1);
|
if (!src_pad_s) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rockchip-mipi-csi2 source pad0 failed !\n");
|
goto FAIL;
|
}
|
} else {
|
entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev"));
|
if(entity) {
|
src_pad_s = (media_pad *)media_entity_get_pad(entity, 1);
|
if (!src_pad_s) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lvds-subdev source pad0 failed !\n");
|
goto FAIL;
|
}
|
} else {
|
entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev"));
|
if(entity) {
|
src_pad_s = (media_pad *)media_entity_get_pad(entity, 1);
|
if (!src_pad_s) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lite-lvds-subdev source pad0 failed !\n");
|
goto FAIL;
|
}
|
}
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id0", strlen("stream_cif_mipi_id0"));
|
if(entity) {
|
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!sink_pad) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR pad s failed!\n");
|
goto FAIL;
|
}
|
}
|
if (enable)
|
media_setup_link(device, src_pad_s, sink_pad, MEDIA_LNK_FL_ENABLED);
|
else
|
media_setup_link(device, src_pad_s, sink_pad, 0);
|
|
entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
|
if(entity) {
|
src_pad_m = (media_pad *)media_entity_get_pad(entity, 2);
|
if (!src_pad_m) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rockchip-mipi-csi2 source pad0 failed !\n");
|
goto FAIL;
|
}
|
} else {
|
entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev"));
|
if(entity) {
|
src_pad_m = (media_pad *)media_entity_get_pad(entity, 2);
|
if (!src_pad_m) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lvds-subdev source pad0 failed !\n");
|
goto FAIL;
|
}
|
} else {
|
entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev"));
|
if(entity) {
|
src_pad_m = (media_pad *)media_entity_get_pad(entity, 2);
|
if (!src_pad_m) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rkcif-lite-lvds-subdev source pad0 failed !\n");
|
goto FAIL;
|
}
|
}
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id1", strlen("stream_cif_mipi_id1"));
|
if(entity) {
|
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!sink_pad) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR pad s failed!\n");
|
goto FAIL;
|
}
|
}
|
if (enable)
|
media_setup_link(device, src_pad_m, sink_pad, MEDIA_LNK_FL_ENABLED);
|
else
|
media_setup_link(device, src_pad_m, sink_pad, 0);
|
|
#if 0
|
entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2"));
|
if(entity) {
|
src_pad_l = (media_pad *)media_entity_get_pad(entity, 3);
|
if (!src_pad_l) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get rockchip-mipi-csi2 source pad0 failed !\n");
|
goto FAIL;
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "stream_cif_mipi_id2", strlen("stream_cif_mipi_id2"));
|
if(entity) {
|
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!sink_pad) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR pad s failed!\n");
|
goto FAIL;
|
}
|
}
|
|
if (RK_AIQ_HDR_GET_WORKING_MODE(hdr_mode) == RK_AIQ_WORKING_MODE_ISP_HDR3) {
|
if (enable)
|
media_setup_link(device, src_pad_l, sink_pad, MEDIA_LNK_FL_ENABLED);
|
else
|
media_setup_link(device, src_pad_l, sink_pad, 0);
|
} else
|
media_setup_link(device, src_pad_l, sink_pad, 0);
|
#endif
|
media_device_unref (device);
|
return XCAM_RETURN_NO_ERROR;
|
FAIL:
|
media_device_unref (device);
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
XCamReturn
|
CamHwIsp20::setupHdrLink(int hdr_mode, int isp_index, bool enable)
|
{
|
media_device *device = NULL;
|
media_entity *entity = NULL;
|
media_pad *src_pad_s = NULL, *src_pad_m = NULL, *src_pad_l = NULL, *sink_pad = NULL;
|
|
device = media_device_new (mIspHwInfos.isp_info[isp_index].media_dev_path);
|
|
/* Enumerate entities, pads and links. */
|
media_device_enumerate (device);
|
entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev"));
|
if(entity) {
|
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!sink_pad) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR sink pad failed!\n");
|
goto FAIL;
|
}
|
}
|
|
entity = media_get_entity_by_name(device, "rkisp_rawrd2_s", strlen("rkisp_rawrd2_s"));
|
if(entity) {
|
src_pad_s = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!src_pad_s) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR source pad s failed!\n");
|
goto FAIL;
|
}
|
}
|
if (src_pad_s && sink_pad) {
|
if (enable)
|
media_setup_link(device, src_pad_s, sink_pad, MEDIA_LNK_FL_ENABLED);
|
else
|
media_setup_link(device, src_pad_s, sink_pad, 0);
|
}
|
|
entity = media_get_entity_by_name(device, "rkisp_rawrd0_m", strlen("rkisp_rawrd0_m"));
|
if(entity) {
|
src_pad_m = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!src_pad_m) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR source pad m failed!\n");
|
goto FAIL;
|
}
|
}
|
|
if (src_pad_m && sink_pad) {
|
if (RK_AIQ_HDR_GET_WORKING_MODE(hdr_mode) >= RK_AIQ_WORKING_MODE_ISP_HDR2 && enable) {
|
media_setup_link(device, src_pad_m, sink_pad, MEDIA_LNK_FL_ENABLED);
|
} else
|
media_setup_link(device, src_pad_m, sink_pad, 0);
|
}
|
|
entity = media_get_entity_by_name(device, "rkisp_rawrd1_l", strlen("rkisp_rawrd1_l"));
|
if(entity) {
|
src_pad_l = (media_pad *)media_entity_get_pad(entity, 0);
|
if (!src_pad_l) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR source pad l failed!\n");
|
goto FAIL;
|
}
|
}
|
|
if (src_pad_l && sink_pad) {
|
if (RK_AIQ_HDR_GET_WORKING_MODE(hdr_mode) == RK_AIQ_WORKING_MODE_ISP_HDR3 && enable) {
|
media_setup_link(device, src_pad_l, sink_pad, MEDIA_LNK_FL_ENABLED);
|
} else
|
media_setup_link(device, src_pad_l, sink_pad, 0);
|
}
|
media_device_unref (device);
|
return XCAM_RETURN_NO_ERROR;
|
FAIL:
|
media_device_unref (device);
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
XCamReturn
|
CamHwIsp20::setExpDelayInfo(int mode)
|
{
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<BaseSensorHw> sensorHw;
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
|
if(mode != RK_AIQ_WORKING_MODE_NORMAL) {
|
sensorHw->set_exp_delay_info(_cur_calib_infos.sensor.CISExpUpdate.Hdr.time_update,
|
_cur_calib_infos.sensor.CISExpUpdate.Hdr.gain_update,
|
_cur_calib_infos.sensor.CISDcgSet.Hdr.support_en ? \
|
_cur_calib_infos.sensor.CISExpUpdate.Hdr.dcg_update : -1);
|
|
sint32_t timeDelay = _cur_calib_infos.sensor.CISExpUpdate.Hdr.time_update;
|
sint32_t gainDelay = _cur_calib_infos.sensor.CISExpUpdate.Hdr.gain_update;
|
_exp_delay = timeDelay > gainDelay ? timeDelay : gainDelay;
|
} else {
|
sensorHw->set_exp_delay_info(_cur_calib_infos.sensor.CISExpUpdate.Linear.time_update,
|
_cur_calib_infos.sensor.CISExpUpdate.Linear.gain_update,
|
_cur_calib_infos.sensor.CISDcgSet.Linear.support_en ? \
|
_cur_calib_infos.sensor.CISExpUpdate.Linear.dcg_update : -1);
|
|
sint32_t timeDelay = _cur_calib_infos.sensor.CISExpUpdate.Linear.time_update;
|
sint32_t gainDelay = _cur_calib_infos.sensor.CISExpUpdate.Linear.gain_update;
|
_exp_delay = timeDelay > gainDelay ? timeDelay : gainDelay;
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::setLensVcmCfg()
|
{
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> lensHw = mLensDev.dynamic_cast_ptr<LensHw>();
|
rk_aiq_lens_vcmcfg old_cfg, new_cfg;
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
if (lensHw.ptr()) {
|
ret = lensHw->getLensVcmCfg(old_cfg);
|
if (ret != XCAM_RETURN_NO_ERROR)
|
return ret;
|
|
CalibDbV2_Af_VcmCfg_t* vcmcfg = &_cur_calib_infos.af.vcmcfg;
|
|
new_cfg = old_cfg;
|
if (vcmcfg->start_current != -1)
|
new_cfg.start_ma = vcmcfg->start_current;
|
if (vcmcfg->rated_current != -1)
|
new_cfg.rated_ma = vcmcfg->rated_current;
|
if (vcmcfg->step_mode != -1)
|
new_cfg.step_mode = vcmcfg->step_mode;
|
|
if (memcmp(&new_cfg, &old_cfg, sizeof(new_cfg)) != 0)
|
ret = lensHw->setLensVcmCfg(new_cfg);
|
}
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
bool CamHwIsp20::isOnlineByWorkingMode()
|
{
|
return true;
|
}
|
|
void
|
CamHwIsp20::setCalib(const CamCalibDbV2Context_t* calibv2)
|
{
|
mCalibDbV2 = calibv2;
|
CalibDbV2_MFNR_t* mfnr =
|
(CalibDbV2_MFNR_t*)CALIBDBV2_GET_MODULE_PTR((void*)(mCalibDbV2), mfnr_v1);
|
if (mfnr) {
|
_cur_calib_infos.mfnr.enable = mfnr->TuningPara.enable;
|
_cur_calib_infos.mfnr.motion_detect_en = mfnr->TuningPara.motion_detect_en;
|
} else {
|
_cur_calib_infos.mfnr.enable = false;
|
_cur_calib_infos.mfnr.motion_detect_en = false;
|
}
|
|
CalibDb_Aec_ParaV2_t* aec =
|
(CalibDb_Aec_ParaV2_t*)CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, ae_calib);
|
if (aec) {
|
_cur_calib_infos.aec.IrisType = aec->IrisCtrl.IrisType;
|
} else {
|
_cur_calib_infos.aec.IrisType = IRISV2_DC_TYPE;
|
}
|
|
CalibDbV2_AF_t *af =
|
(CalibDbV2_AF_t*)CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af);
|
if (af) {
|
_cur_calib_infos.af.vcmcfg = af->TuningPara.vcmcfg;
|
} else {
|
memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
|
}
|
|
CalibDb_Sensor_ParaV2_t* sensor_calib =
|
(CalibDb_Sensor_ParaV2_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, sensor_calib));
|
if (sensor_calib) {
|
_cur_calib_infos.sensor.CISDcgSet = sensor_calib->CISDcgSet;
|
_cur_calib_infos.sensor.CISExpUpdate = sensor_calib->CISExpUpdate;
|
} else {
|
memset(&_cur_calib_infos.sensor, 0,
|
sizeof(_cur_calib_infos.sensor));
|
}
|
|
// update infos to sensor hw
|
setExpDelayInfo(_hdr_mode);
|
}
|
|
XCamReturn
|
CamHwIsp20::prepare(uint32_t width, uint32_t height, int mode, int t_delay, int g_delay)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw;
|
|
ENTER_CAMHW_FUNCTION();
|
|
XCAM_ASSERT (mCalibDbV2);
|
|
_hdr_mode = mode;
|
|
Isp20Params::set_working_mode(_hdr_mode);
|
|
if ((_hdr_mode > 0 && isOnlineByWorkingMode()) || !_linked_to_isp) {
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "use read back mode!");
|
mNoReadBack = false;
|
}
|
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
|
if ((it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
|
return XCAM_RETURN_ERROR_SENSOR;
|
}
|
|
rk_sensor_full_info_t *s_info = it->second.ptr();
|
int isp_index = s_info->isp_info->model_idx;
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor_name(%s) is linked to isp_index(%d)",
|
sns_name, isp_index);
|
if (!mNoReadBack) {
|
setupHdrLink(RK_AIQ_WORKING_MODE_ISP_HDR3, isp_index, true);
|
if (!_linked_to_isp) {
|
int cif_index = s_info->cif_info->model_idx;
|
setupHdrLink_vidcap(_hdr_mode, cif_index, true);
|
}
|
} else
|
setupHdrLink(RK_AIQ_WORKING_MODE_ISP_HDR3, isp_index, false);
|
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
ret = sensorHw->set_working_mode(mode);
|
if (ret) {
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor mode error !");
|
return ret;
|
}
|
mRawCapUnit->set_working_mode(mode);
|
mRawProcUnit->set_working_mode(mode);
|
setExpDelayInfo(mode);
|
setLensVcmCfg();
|
|
_ispp_module_init_ens = 0;
|
|
ret = setupPipelineFmt();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setupPipelineFmt err: %d\n", ret);
|
}
|
|
if (!_linked_to_isp)
|
mRawCapUnit->prepare_cif_mipi();
|
|
if (_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) {
|
mSpStreamUnit->prepare();
|
}
|
|
_state = CAM_HW_STATE_PREPARED;
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::start()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw;
|
SmartPtr<LensHw> lensHw;
|
|
ENTER_CAMHW_FUNCTION();
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
lensHw = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if (_state != CAM_HW_STATE_PREPARED &&
|
_state != CAM_HW_STATE_STOPPED) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camhw state err: %d\n", ret);
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
// set inital params
|
ret = mParamsAssembler->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
|
}
|
|
if (mParamsAssembler->ready())
|
setIspConfig();
|
|
ret = hdr_mipi_start_mode(_hdr_mode);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
|
}
|
if (mLumaStream.ptr())
|
mLumaStream->start();
|
if (mIspSofStream.ptr())
|
mIspSofStream->start();
|
|
if (_linked_to_isp)
|
mIspCoreDev->subscribe_event(V4L2_EVENT_FRAME_SYNC);
|
ret = mIspCoreDev->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start isp core dev err: %d\n", ret);
|
}
|
if (mIspStatsStream.ptr())
|
mIspStatsStream->start();
|
|
if (mFlashLight.ptr()) {
|
ret = mFlashLight->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start flashlight err: %d\n", ret);
|
}
|
}
|
if (mFlashLightIr.ptr()) {
|
ret = mFlashLightIr->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start flashlight ir err: %d\n", ret);
|
}
|
}
|
if (_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) {
|
mSpStreamUnit->start();
|
}
|
|
if (mIspParamStream.ptr())
|
mIspParamStream->startThreadOnly();
|
|
if (mNrStreamProcUnit.ptr())
|
mNrStreamProcUnit->start();
|
|
if (mTnrStreamProcUnit.ptr())
|
mTnrStreamProcUnit->start();
|
|
if (mFecParamStream.ptr())
|
mFecParamStream->start();
|
|
sensorHw->start();
|
if (lensHw.ptr())
|
lensHw->start();
|
_is_exit = false;
|
_state = CAM_HW_STATE_STARTED;
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
|
XCamReturn
|
CamHwIsp20::hdr_mipi_prepare_mode(int mode)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
int new_mode = RK_AIQ_HDR_GET_WORKING_MODE(mode);
|
|
if (!mNoReadBack) {
|
if (new_mode == RK_AIQ_WORKING_MODE_NORMAL) {
|
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0);
|
ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_0);
|
} else if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
|
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
|
ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
|
} else {
|
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_ALL);
|
ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_ALL);
|
}
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
|
}
|
}
|
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::hdr_mipi_start_mode(int mode)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s enter", __FUNCTION__);
|
if (!mNoReadBack) {
|
mRawCapUnit->start(mode);
|
mRawProcUnit->start(mode);
|
}
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s exit", __FUNCTION__);
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::hdr_mipi_stop()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
mRawCapUnit->stop();
|
mRawProcUnit->stop();
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::stop()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw;
|
SmartPtr<LensHw> lensHw;
|
|
ENTER_CAMHW_FUNCTION();
|
if (mIspStatsStream.ptr())
|
mIspStatsStream->stop();
|
if (mLumaStream.ptr())
|
mLumaStream->stop();
|
if (mIspSofStream.ptr())
|
mIspSofStream->stop();
|
if (mIspParamStream.ptr())
|
mIspParamStream->stop();
|
|
if (_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) {
|
mSpStreamUnit->stop();
|
}
|
|
// stop after pollthread, ensure that no new events
|
// come into snesorHw
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
sensorHw->stop();
|
|
lensHw = mLensDev.dynamic_cast_ptr<LensHw>();
|
if (lensHw.ptr())
|
lensHw->stop();
|
|
if (_linked_to_isp)
|
mIspCoreDev->unsubscribe_event(V4L2_EVENT_FRAME_SYNC);
|
ret = mIspCoreDev->stop();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "stop isp core dev err: %d\n", ret);
|
}
|
|
if (!mNoReadBack) {
|
ret = hdr_mipi_stop();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi stop err: %d\n", ret);
|
}
|
}
|
|
if (mTnrStreamProcUnit.ptr())
|
mTnrStreamProcUnit->stop();
|
|
if (mNrStreamProcUnit.ptr())
|
mNrStreamProcUnit->stop();
|
|
if (mFecParamStream.ptr())
|
mFecParamStream->stop();
|
|
if (mParamsAssembler.ptr())
|
mParamsAssembler->stop();
|
|
if (mFlashLight.ptr()) {
|
ret = mFlashLight->stop();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "stop flashlight err: %d\n", ret);
|
}
|
}
|
if (mFlashLightIr.ptr()) {
|
mFlashLightIr->keep_status(mKpHwSt);
|
ret = mFlashLightIr->stop();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "stop flashlight ir err: %d\n", ret);
|
}
|
}
|
|
if (!mKpHwSt)
|
setIrcutParams(false);
|
|
{
|
SmartLock locker (_isp_params_cfg_mutex);
|
_camIsp3aResult.clear();
|
_effecting_ispparam_map.clear();
|
}
|
_state = CAM_HW_STATE_STOPPED;
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::pause()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw;
|
|
if (mIspStatsStream.ptr())
|
mIspStatsStream->stop();
|
if (mIspSofStream.ptr())
|
mIspSofStream->stop();
|
if (mLumaStream.ptr())
|
mLumaStream->stop();
|
if (!mNoReadBack)
|
hdr_mipi_stop();
|
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
sensorHw->stop();
|
if (mIspParamStream.ptr())
|
mIspParamStream->stop();
|
|
if (mTnrStreamProcUnit.ptr())
|
mTnrStreamProcUnit->start();
|
|
if (mNrStreamProcUnit.ptr())
|
mNrStreamProcUnit->stop();
|
|
if (mFecParamStream.ptr())
|
mFecParamStream->stop();
|
|
if (mParamsAssembler.ptr())
|
mParamsAssembler->stop();
|
|
{
|
SmartLock locker (_isp_params_cfg_mutex);
|
_camIsp3aResult.clear();
|
_effecting_ispparam_map.clear();
|
}
|
|
_state = CAM_HW_STATE_PAUSED;
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::swWorkingModeDyn(int mode)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw;
|
|
if (_linked_to_isp || mNoReadBack) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "sensor linked to isp, not supported now!");
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
|
ret = sensorHw->set_working_mode(mode);
|
if (ret) {
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor mode error !");
|
return ret;
|
}
|
|
setExpDelayInfo(mode);
|
|
Isp20Params::set_working_mode(mode);
|
|
#if 0 // for quick switch, not used now
|
int old_mode = RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode);
|
int new_mode = RK_AIQ_HDR_GET_WORKING_MODE(mode);
|
//set hdr mode to drv
|
if (mIspCoreDev.ptr()) {
|
int drv_mode = ISP2X_HDR_MODE_NOMAL;
|
if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
|
drv_mode = ISP2X_HDR_MODE_X3;
|
else if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2)
|
drv_mode = ISP2X_HDR_MODE_X2;
|
|
if (mIspCoreDev->io_control (RKISP_CMD_SW_HDR_MODE_QUICK, &drv_mode) < 0) {
|
ret = XCAM_RETURN_ERROR_FAILED;
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set RKISP_CMD_SW_HDR_MODE_QUICK failed");
|
return ret;
|
}
|
}
|
// reconfig tx,rx stream
|
if (!old_mode && new_mode) {
|
// normal to hdr
|
if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
|
hdr_mipi_start(MIPI_STREAM_IDX_1 | MIPI_STREAM_IDX_2);
|
else
|
hdr_mipi_start(MIPI_STREAM_IDX_1);
|
} else if (old_mode && !new_mode) {
|
// hdr to normal
|
if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
|
hdr_mipi_stop(MIPI_STREAM_IDX_1 | MIPI_STREAM_IDX_2);
|
else
|
hdr_mipi_stop(MIPI_STREAM_IDX_1);
|
} else if (old_mode == RK_AIQ_WORKING_MODE_ISP_HDR3 &&
|
new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
|
// hdr3 to hdr2
|
hdr_mipi_stop(MIPI_STREAM_IDX_1);
|
} else if (old_mode == RK_AIQ_WORKING_MODE_ISP_HDR2 &&
|
new_mode == RK_AIQ_WORKING_MODE_ISP_HDR3) {
|
// hdr3 to hdr2
|
hdr_mipi_start(MIPI_STREAM_IDX_2);
|
} else {
|
// do nothing
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "do nothing, old mode %d, new mode %d\n",
|
_hdr_mode, mode);
|
}
|
#endif
|
_hdr_mode = mode;
|
mRawCapUnit->set_working_mode(mode);
|
mRawProcUnit->set_working_mode(mode);
|
// remap _mipi_tx_devs for cif
|
if (!_linked_to_isp)
|
mRawCapUnit->prepare_cif_mipi();
|
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::resume()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<BaseSensorHw> sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
|
// set inital params
|
ret = mParamsAssembler->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
|
}
|
|
if (mParamsAssembler->ready())
|
setIspConfig();
|
|
ret = hdr_mipi_start_mode(_hdr_mode);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
|
}
|
sensorHw->start();
|
if (mIspSofStream.ptr())
|
mIspSofStream->start();
|
if (mIspParamStream.ptr())
|
mIspParamStream->startThreadOnly();
|
if (mLumaStream.ptr())
|
mLumaStream->start();
|
if (mIspStatsStream.ptr())
|
mIspStatsStream->start();
|
|
if (mTnrStreamProcUnit.ptr())
|
mTnrStreamProcUnit->start();
|
|
if (mNrStreamProcUnit.ptr())
|
mNrStreamProcUnit->start();
|
|
if (mFecParamStream.ptr())
|
mFecParamStream->start();
|
|
_state = CAM_HW_STATE_STARTED;
|
return ret;
|
}
|
|
/*
|
* some module(HDR/TNR) parameters are related to the next frame exposure
|
* and can only be easily obtained at the hwi layer,
|
* so these parameters are calculated at hwi and the result is overwritten.
|
*/
|
XCamReturn
|
CamHwIsp20::overrideExpRatioToAiqResults(const sint32_t frameId,
|
int module_id,
|
cam3aResultList &results,
|
int hdr_mode)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
SmartPtr<RkAiqExpParamsProxy> curFrameExpParam;
|
SmartPtr<RkAiqExpParamsProxy> nextFrameExpParam;
|
SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
|
if (mSensorSubdev.ptr()) {
|
if (mSensorSubdev->getEffectiveExpParams(curFrameExpParam, frameId) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n",
|
module_id,
|
frameId);
|
return ret;
|
}
|
|
if (mSensorSubdev->getEffectiveExpParams(nextFrameExpParam, frameId + 1) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n",
|
module_id,
|
frameId + 1);
|
return ret;
|
}
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n"
|
"curFrame(%d): lexp: %f-%f, mexp: %f-%f, sexp: %f-%f\n"
|
"nextFrame(%d): lexp: %f-%f, mexp: %f-%f, sexp: %f-%f\n",
|
module_id,
|
frameId,
|
frameId,
|
curFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.analog_gain,
|
curFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.integration_time,
|
curFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain,
|
curFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time,
|
curFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain,
|
curFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time,
|
frameId + 1,
|
nextFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.analog_gain,
|
nextFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.integration_time,
|
nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain,
|
nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time,
|
nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain,
|
nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time);
|
|
rk_aiq_luma_params_t curFrameLumaParam, nextFrameLumaParam;
|
|
//get expo info for merge and tmo
|
float expo[6];
|
int FrameCnt = 0;
|
if(hdr_mode == RK_AIQ_WORKING_MODE_NORMAL)
|
FrameCnt = 1;
|
else if(hdr_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2 && hdr_mode < RK_AIQ_WORKING_MODE_ISP_HDR3)
|
FrameCnt = 2;
|
else if(hdr_mode >= RK_AIQ_WORKING_MODE_ISP_HDR3)
|
FrameCnt = 3;
|
else {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDR mode failed!\n");
|
return ret;
|
}
|
|
hdrtmoGetAeInfo(&nextFrameExpParam->data()->aecExpInfo,
|
&curFrameExpParam->data()->aecExpInfo, FrameCnt, expo);
|
|
float curSExpo = expo[0];
|
float curMExpo = expo[1];
|
float curLExpo = expo[2];
|
float nextSExpo = expo[3];
|
float nextMExpo = expo[4];
|
float nextLExpo = expo[5];
|
float nextRatioLS = 0;
|
float nextRatioLM = 0;
|
float curRatioLS = 0;
|
if(FrameCnt == 1) {
|
nextRatioLS = 1;
|
nextRatioLM = 1;
|
curRatioLS = 1;
|
} else if(FrameCnt == 2) {
|
nextRatioLS = nextLExpo / nextSExpo;
|
nextRatioLM = 1;
|
curRatioLS = curLExpo / curSExpo;
|
} else if(FrameCnt == 3) {
|
nextRatioLS = nextLExpo / nextSExpo;
|
nextRatioLM = nextLExpo / nextMExpo;
|
curRatioLS = curLExpo / curSExpo;
|
}
|
|
float nextLgmax = 12 + log(nextRatioLS) / log(2);
|
float curLgmax = 12 + log(curRatioLS) / log(2);
|
|
|
switch (module_id) {
|
case RK_ISP2X_HDRTMO_ID:
|
{
|
float nextSLuma[16] ;
|
float curSLuma[16] ;
|
float nextMLuma[16] ;
|
float curMLuma[16] ;
|
float nextLLuma[16];
|
float curLLuma[16];
|
float lgmin = 0;
|
|
SmartPtr<cam3aResult> res = get_3a_module_result(results, RESULT_TYPE_TMO_PARAM);
|
SmartPtr<RkAiqIspTmoParamsProxy> tmoParams;
|
if (res.ptr()) {
|
tmoParams = res.dynamic_cast_ptr<RkAiqIspTmoParamsProxy>();
|
} else {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get tmo params from 3a result failed!\n");
|
return ret;
|
}
|
rk_aiq_isp_tmo_t &tmo_proc_res = tmoParams->data()->result;
|
|
if(!(tmo_proc_res.bTmoEn))
|
break;
|
|
if(tmo_proc_res.LongFrameMode) {
|
nextRatioLS = 1;
|
nextRatioLM = 1;
|
curRatioLS = 1;
|
}
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nextRatioLS:%f nextRatioLM:%f curRatioLS:%f\n", nextRatioLS, nextRatioLM, curRatioLS);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nextLgmax:%f curLgmax:%f \n", nextLgmax, curLgmax);
|
|
// shadow resgister,needs to set a frame before, for ctrl_cfg/lg_scl reg
|
tmo_proc_res.Res.sw_hdrtmo_expl_lgratio = \
|
(int)(2048 * (log(curLExpo / nextLExpo) / log(2)));
|
if( tmo_proc_res.LongFrameMode || tmo_proc_res.isLinearTmo)
|
tmo_proc_res.Res.sw_hdrtmo_lgscl_ratio = 128;
|
else
|
tmo_proc_res.Res.sw_hdrtmo_lgscl_ratio = \
|
(int)(128 * (log(nextRatioLS) / log(curRatioLS)));
|
tmo_proc_res.Res.sw_hdrtmo_lgscl = (int)(4096 * 16 / nextLgmax);
|
tmo_proc_res.Res.sw_hdrtmo_lgscl_inv = (int)(4096 * nextLgmax / 16);
|
|
// not shadow resgister
|
tmo_proc_res.Res.sw_hdrtmo_lgmax = (int)(2048 * nextLgmax);
|
tmo_proc_res.Res.sw_hdrtmo_set_lgmax = \
|
tmo_proc_res.Res.sw_hdrtmo_lgmax;
|
|
//sw_hdrtmo_set_lgrange0
|
float value = 0.0;
|
float clipratio0 = tmo_proc_res.Res.sw_hdrtmo_clipratio0 / 256.0;
|
float clipgap0 = tmo_proc_res.Res.sw_hdrtmo_clipgap0 / 4.0;
|
float Lgmax = tmo_proc_res.Res.sw_hdrtmo_set_lgmax / 2048.0;
|
value = lgmin * (1 - clipratio0) + Lgmax * clipratio0;
|
value = MIN(value, (lgmin + clipgap0));
|
tmo_proc_res.Res.sw_hdrtmo_set_lgrange0 = (int)(2048 * value);
|
|
//sw_hdrtmo_set_lgrange1
|
value = 0.0;
|
float clipratio1 = tmo_proc_res.Res.sw_hdrtmo_clipratio1 / 256.0;
|
float clipgap1 = tmo_proc_res.Res.sw_hdrtmo_clipgap1 / 4.0;
|
value = lgmin * (1 - clipratio1) + Lgmax * clipratio1;
|
value = MAX(value, (Lgmax - clipgap1));
|
tmo_proc_res.Res.sw_hdrtmo_set_lgrange1 = (int)(2048 * value);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM,
|
"sw_hdrtmo_expl_lgratio:%d sw_hdrtmo_lgscl_ratio:%d "
|
"sw_hdrtmo_lgmax:%d sw_hdrtmo_set_lgmax:%d sw_hdrtmo_lgscl:%d sw_hdrtmo_lgscl_inv:%d\n",
|
tmo_proc_res.Res.sw_hdrtmo_expl_lgratio,
|
tmo_proc_res.Res.sw_hdrtmo_lgscl_ratio,
|
tmo_proc_res.Res.sw_hdrtmo_lgmax,
|
tmo_proc_res.Res.sw_hdrtmo_set_lgmax,
|
tmo_proc_res.Res.sw_hdrtmo_lgscl,
|
tmo_proc_res.Res.sw_hdrtmo_lgscl_inv);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM,
|
"sw_hdrtmo_set_lgrange0:%d sw_hdrtmo_set_lgrange1:%d\n",
|
tmo_proc_res.Res.sw_hdrtmo_set_lgrange0,
|
tmo_proc_res.Res.sw_hdrtmo_set_lgrange1);
|
|
//predict
|
SmartPtr<cam3aResult> blc_res = get_3a_module_result(results, RESULT_TYPE_BLC_PARAM);
|
SmartPtr<RkAiqIspBlcParamsProxy> blcParams;
|
if (blc_res.ptr()) {
|
blcParams = blc_res.dynamic_cast_ptr<RkAiqIspBlcParamsProxy>();
|
} else {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get blc params from 3a result failed!\n");
|
return ret;
|
}
|
|
rk_aiq_isp_blc_t &blc = blcParams->data()->result;
|
|
float blc_result = (blc.blc_r + blc.blc_gr
|
+ blc.blc_gb + blc.blc_b) / (16.0 * 4.0);
|
int cols = tmo_proc_res.TmoFlicker.width;
|
int rows = tmo_proc_res.TmoFlicker.height;
|
int PixelNum = cols * rows;
|
int PixelNumBlock = PixelNum / ISP2X_MIPI_LUMA_MEAN_MAX;
|
|
//get luma info
|
float luma[96];
|
hdrtmoGetLumaInfo(&nextFrameLumaParam, &curFrameLumaParam, FrameCnt,
|
PixelNumBlock, blc_result, luma);
|
|
//get predict para
|
bool SceneStable = hdrtmoSceneStable(frameId, tmo_proc_res.TmoFlicker.iirmax,
|
tmo_proc_res.TmoFlicker.iir,
|
tmo_proc_res.Res.sw_hdrtmo_set_weightkey,
|
FrameCnt + 1,
|
tmo_proc_res.TmoFlicker.LumaDeviation,
|
tmo_proc_res.TmoFlicker.StableThr);
|
int PredicPara = 0;//hdrtmoPredictK(luma, expo,
|
float GlobalTmoStrength = tmo_proc_res.TmoFlicker.GlobalTmoStrength;
|
tmo_proc_res.Predict.Scenestable = SceneStable;
|
tmo_proc_res.Predict.K_Rolgmean = PredicPara;
|
tmo_proc_res.Predict.cnt_mode = tmo_proc_res.TmoFlicker.cnt_mode;
|
tmo_proc_res.Predict.cnt_vsize = tmo_proc_res.TmoFlicker.cnt_vsize;
|
tmo_proc_res.Predict.iir_max = tmo_proc_res.TmoFlicker.iirmax;
|
tmo_proc_res.Predict.iir = tmo_proc_res.TmoFlicker.iir;
|
tmo_proc_res.Predict.global_tmo_strength = 2048 * log(GlobalTmoStrength) / log(2);
|
if (tmo_proc_res.TmoFlicker.GlobalTmoStrengthDown)
|
tmo_proc_res.Predict.global_tmo_strength *= -1;
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM,
|
"SceneStable:%d K_Rolgmean:%d iir:%d iir_max:%d global_tmo_strength:%d\n",
|
tmo_proc_res.Predict.Scenestable,
|
tmo_proc_res.Predict.K_Rolgmean, tmo_proc_res.Predict.iir,
|
tmo_proc_res.Predict.iir_max, tmo_proc_res.Predict.global_tmo_strength);
|
|
break;
|
}
|
case RK_ISP2X_HDRMGE_ID:
|
{
|
if(FrameCnt == 1)
|
break;
|
|
SmartPtr<cam3aResult> res = get_3a_module_result(results, RESULT_TYPE_MERGE_PARAM);
|
SmartPtr<RkAiqIspMergeParamsProxy> mergeParams;
|
if (res.ptr()) {
|
mergeParams = res.dynamic_cast_ptr<RkAiqIspMergeParamsProxy>();
|
} else {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get merge params from 3a result failed!\n");
|
return ret;
|
}
|
|
rk_aiq_isp_merge_t &merge_proc_res = mergeParams->data()->result;
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nextRatioLS:%f nextRatioLM:%f curRatioLS:%f\n", nextRatioLS, nextRatioLM, curRatioLS);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nextLgmax:%f curLgmax:%f \n", nextLgmax, curLgmax);
|
|
// shadow resgister,needs to set a frame before, for gain0/1/2 reg
|
merge_proc_res.Res.sw_hdrmge_gain0 = (int)(64 * nextRatioLS);
|
if(nextRatioLS == 1)
|
merge_proc_res.Res.sw_hdrmge_gain0_inv = (int)(4096 * (1 / nextRatioLS) - 1);
|
else
|
merge_proc_res.Res.sw_hdrmge_gain0_inv = (int)(4096 * (1 / nextRatioLS));
|
merge_proc_res.Res.sw_hdrmge_gain1 = (int)(64 * nextRatioLM);
|
if(nextRatioLM == 1)
|
merge_proc_res.Res.sw_hdrmge_gain1_inv = (int)(4096 * (1 / nextRatioLM) - 1);
|
else
|
merge_proc_res.Res.sw_hdrmge_gain1_inv = (int)(4096 * (1 / nextRatioLM));
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM,
|
"sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d\n",
|
merge_proc_res.Res.sw_hdrmge_gain0,
|
merge_proc_res.Res.sw_hdrmge_gain0_inv,
|
merge_proc_res.Res.sw_hdrmge_gain1,
|
merge_proc_res.Res.sw_hdrmge_gain1_inv);
|
break;
|
}
|
case RK_ISP2X_PP_TNR_ID:
|
break;
|
default:
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "unkown module id: 0x%x!\n", module_id);
|
break;
|
}
|
|
return ret;
|
}
|
|
void
|
CamHwIsp20::gen_full_ispp_params(const struct rkispp_params_cfg* update_params,
|
struct rkispp_params_cfg* full_params)
|
{
|
XCAM_ASSERT (update_params);
|
XCAM_ASSERT (full_params);
|
|
int end = RK_ISP2X_PP_MAX_ID - RK_ISP2X_PP_TNR_ID;
|
|
ENTER_CAMHW_FUNCTION();
|
for (int i = 0; i < end; i++)
|
if (update_params->module_en_update & (1 << i)) {
|
full_params->module_en_update |= 1 << i;
|
// clear old bit value
|
full_params->module_ens &= ~(1 << i);
|
// set new bit value
|
full_params->module_ens |= update_params->module_ens & (1LL << i);
|
}
|
|
for (int i = 0; i < end; i++)
|
if (update_params->module_cfg_update & (1 << i)) {
|
full_params->module_cfg_update |= 1 << i;
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
}
|
|
void
|
CamHwIsp20::gen_full_isp_params(const struct isp2x_isp_params_cfg* update_params,
|
struct isp2x_isp_params_cfg* full_params,
|
uint64_t* module_en_update_partial,
|
uint64_t* module_cfg_update_partial)
|
{
|
XCAM_ASSERT (update_params);
|
XCAM_ASSERT (full_params);
|
int i = 0;
|
|
ENTER_CAMHW_FUNCTION();
|
for (; i <= RK_ISP2X_MAX_ID; i++)
|
if (update_params->module_en_update & (1LL << i)) {
|
if ((full_params->module_ens & (1LL << i)) !=
|
(update_params->module_ens & (1LL << i)))
|
*module_en_update_partial |= 1LL << i;
|
full_params->module_en_update |= 1LL << i;
|
// clear old bit value
|
full_params->module_ens &= ~(1LL << i);
|
// set new bit value
|
full_params->module_ens |= update_params->module_ens & (1LL << i);
|
}
|
|
for (i = 0; i <= RK_ISP2X_MAX_ID; i++) {
|
if (update_params->module_cfg_update & (1LL << i)) {
|
|
#define CHECK_UPDATE_PARAMS(dst, src) \
|
if (memcmp(&dst, &src, sizeof(dst)) == 0 && \
|
full_params->frame_id > ISP_PARAMS_EFFECT_DELAY_CNT) \
|
continue; \
|
*module_cfg_update_partial |= 1LL << i; \
|
dst = src; \
|
|
full_params->module_cfg_update |= 1LL << i;
|
switch (i) {
|
case RK_ISP2X_RAWAE_BIG1_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawae3, update_params->meas.rawae3);
|
break;
|
case RK_ISP2X_RAWAE_BIG2_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawae1, update_params->meas.rawae1);
|
break;
|
case RK_ISP2X_RAWAE_BIG3_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawae2, update_params->meas.rawae2);
|
break;
|
case RK_ISP2X_RAWAE_LITE_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawae0, update_params->meas.rawae0);
|
break;
|
case RK_ISP2X_RAWHIST_BIG1_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawhist3, update_params->meas.rawhist3);
|
break;
|
case RK_ISP2X_RAWHIST_BIG2_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawhist1, update_params->meas.rawhist1);
|
break;
|
case RK_ISP2X_RAWHIST_BIG3_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawhist2, update_params->meas.rawhist2);
|
break;
|
case RK_ISP2X_RAWHIST_LITE_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawhist0, update_params->meas.rawhist0);
|
break;
|
case RK_ISP2X_YUVAE_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.yuvae, update_params->meas.yuvae);
|
break;
|
case RK_ISP2X_SIHST_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.sihst, update_params->meas.sihst);
|
break;
|
case RK_ISP2X_SIAWB_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.siawb, update_params->meas.siawb);
|
break;
|
case RK_ISP2X_RAWAWB_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawawb, update_params->meas.rawawb);
|
break;
|
case RK_ISP2X_AWB_GAIN_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.awb_gain_cfg, update_params->others.awb_gain_cfg);
|
break;
|
case RK_ISP2X_RAWAF_ID:
|
CHECK_UPDATE_PARAMS(full_params->meas.rawaf, update_params->meas.rawaf);
|
break;
|
case RK_ISP2X_HDRMGE_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.hdrmge_cfg, update_params->others.hdrmge_cfg);
|
break;
|
case RK_ISP2X_HDRTMO_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.hdrtmo_cfg, update_params->others.hdrtmo_cfg);
|
break;
|
case RK_ISP2X_CTK_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.ccm_cfg, update_params->others.ccm_cfg);
|
break;
|
case RK_ISP2X_LSC_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.lsc_cfg, update_params->others.lsc_cfg);
|
break;
|
case RK_ISP2X_GOC_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.gammaout_cfg, update_params->others.gammaout_cfg);
|
break;
|
case RK_ISP2X_3DLUT_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.isp3dlut_cfg, update_params->others.isp3dlut_cfg);
|
break;
|
case RK_ISP2X_DPCC_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.dpcc_cfg, update_params->others.dpcc_cfg);
|
break;
|
case RK_ISP2X_BLS_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.bls_cfg, update_params->others.bls_cfg);
|
break;
|
case RK_ISP2X_DEBAYER_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.debayer_cfg, update_params->others.debayer_cfg);
|
break;
|
case RK_ISP2X_DHAZ_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.dhaz_cfg, update_params->others.dhaz_cfg);
|
break;
|
case RK_ISP2X_RAWNR_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.rawnr_cfg, update_params->others.rawnr_cfg);
|
break;
|
case RK_ISP2X_GAIN_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.gain_cfg, update_params->others.gain_cfg);
|
break;
|
case RK_ISP2X_LDCH_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.ldch_cfg, update_params->others.ldch_cfg);
|
break;
|
case RK_ISP2X_GIC_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.gic_cfg, update_params->others.gic_cfg);
|
break;
|
case RK_ISP2X_CPROC_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.cproc_cfg, update_params->others.cproc_cfg);
|
break;
|
case RK_ISP2X_SDG_ID:
|
CHECK_UPDATE_PARAMS(full_params->others.sdg_cfg, update_params->others.sdg_cfg);
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
EXIT_CAMHW_FUNCTION();
|
}
|
|
#if 0
|
void CamHwIsp20::dump_isp_config(struct isp2x_isp_params_cfg* isp_params,
|
SmartPtr<RkAiqIspParamsProxy> aiq_results,
|
SmartPtr<RkAiqIspParamsProxy> aiq_other_results)
|
{
|
rk_aiq_isp_meas_params_v20_t* isp20_meas_result =
|
static_cast<rk_aiq_isp_meas_params_v20_t*>(aiq_results->data().ptr());
|
rk_aiq_isp_other_params_v20_t* isp20_other_result =
|
static_cast<rk_aiq_isp_other_params_v20_t*>(aiq_other_results->data().ptr());
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params mask: 0x%llx-0x%llx-0x%llx\n",
|
isp_params->module_en_update,
|
isp_params->module_ens,
|
isp_params->module_cfg_update);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "aiq_results: ae-lite.winnum=%d; ae-big2.winnum=%d, sub[1].size: [%dx%d]\n",
|
isp20_meas_result->aec_meas.rawae0.wnd_num,
|
isp20_meas_result->aec_meas.rawae1.wnd_num,
|
isp20_meas_result->aec_meas.rawae1.subwin[1].h_size,
|
isp20_meas_result->aec_meas.rawae1.subwin[1].v_size);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: ae-lite.winnum=%d; ae-big2.winnum=%d, sub[1].size: [%dx%d]\n",
|
isp_params->meas.rawae0.wnd_num,
|
isp_params->meas.rawae1.wnd_num,
|
isp_params->meas.rawae1.subwin[1].h_size,
|
isp_params->meas.rawae1.subwin[1].v_size);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: win size: [%dx%d]-[%dx%d]-[%dx%d]-[%dx%d]\n",
|
isp_params->meas.rawae0.win.h_size,
|
isp_params->meas.rawae0.win.v_size,
|
isp_params->meas.rawae3.win.h_size,
|
isp_params->meas.rawae3.win.v_size,
|
isp_params->meas.rawae1.win.h_size,
|
isp_params->meas.rawae1.win.v_size,
|
isp_params->meas.rawae2.win.h_size,
|
isp_params->meas.rawae2.win.v_size);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: debayer:");
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "clip_en:%d, dist_scale:%d, filter_c_en:%d, filter_g_en:%d",
|
isp_params->others.debayer_cfg.clip_en,
|
isp_params->others.debayer_cfg.dist_scale,
|
isp_params->others.debayer_cfg.filter_c_en,
|
isp_params->others.debayer_cfg.filter_g_en);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "gain_offset:%d,hf_offset:%d,max_ratio:%d,offset:%d,order_max:%d",
|
isp_params->others.debayer_cfg.gain_offset,
|
isp_params->others.debayer_cfg.hf_offset,
|
isp_params->others.debayer_cfg.max_ratio,
|
isp_params->others.debayer_cfg.offset,
|
isp_params->others.debayer_cfg.order_max);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "order_min:%d, shift_num:%d, thed0:%d, thed1:%d",
|
isp_params->others.debayer_cfg.order_min,
|
isp_params->others.debayer_cfg.shift_num,
|
isp_params->others.debayer_cfg.thed0,
|
isp_params->others.debayer_cfg.thed1);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "filter1:[%d, %d, %d, %d, %d]",
|
isp_params->others.debayer_cfg.filter1_coe1,
|
isp_params->others.debayer_cfg.filter1_coe2,
|
isp_params->others.debayer_cfg.filter1_coe3,
|
isp_params->others.debayer_cfg.filter1_coe4,
|
isp_params->others.debayer_cfg.filter1_coe5);
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "filter2:[%d, %d, %d, %d, %d]",
|
isp_params->others.debayer_cfg.filter2_coe1,
|
isp_params->others.debayer_cfg.filter2_coe2,
|
isp_params->others.debayer_cfg.filter2_coe3,
|
isp_params->others.debayer_cfg.filter2_coe4,
|
isp_params->others.debayer_cfg.filter2_coe5);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "isp_params: gic: \n"
|
"edge_open:%d, regmingradthrdark2:%d, regmingradthrdark1:%d, regminbusythre:%d\n"
|
"regdarkthre:%d,regmaxcorvboth:%d,regdarktthrehi:%d,regkgrad2dark:%d,regkgrad1dark:%d\n"
|
"regstrengthglobal_fix:%d, regdarkthrestep:%d, regkgrad2:%d, regkgrad1:%d\n"
|
"reggbthre:%d, regmaxcorv:%d, regmingradthr2:%d, regmingradthr1:%d, gr_ratio:%d\n"
|
"dnloscale:%d, dnhiscale:%d, reglumapointsstep:%d, gvaluelimitlo:%d, gvaluelimithi:%d\n"
|
"fratiohilimt1:%d, strength_fix:%d, noise_cuten:%d, noise_coe_a:%d, noise_coe_b:%d, diff_clip:%d\n",
|
isp_params->others.gic_cfg.edge_open,
|
isp_params->others.gic_cfg.regmingradthrdark2,
|
isp_params->others.gic_cfg.regmingradthrdark1,
|
isp_params->others.gic_cfg.regminbusythre,
|
isp_params->others.gic_cfg.regdarkthre,
|
isp_params->others.gic_cfg.regmaxcorvboth,
|
isp_params->others.gic_cfg.regdarktthrehi,
|
isp_params->others.gic_cfg.regkgrad2dark,
|
isp_params->others.gic_cfg.regkgrad1dark,
|
isp_params->others.gic_cfg.regstrengthglobal_fix,
|
isp_params->others.gic_cfg.regdarkthrestep,
|
isp_params->others.gic_cfg.regkgrad2,
|
isp_params->others.gic_cfg.regkgrad1,
|
isp_params->others.gic_cfg.reggbthre,
|
isp_params->others.gic_cfg.regmaxcorv,
|
isp_params->others.gic_cfg.regmingradthr2,
|
isp_params->others.gic_cfg.regmingradthr1,
|
isp_params->others.gic_cfg.gr_ratio,
|
isp_params->others.gic_cfg.dnloscale,
|
isp_params->others.gic_cfg.dnhiscale,
|
isp_params->others.gic_cfg.reglumapointsstep,
|
isp_params->others.gic_cfg.gvaluelimitlo,
|
isp_params->others.gic_cfg.gvaluelimithi,
|
isp_params->others.gic_cfg.fusionratiohilimt1,
|
isp_params->others.gic_cfg.regstrengthglobal_fix,
|
isp_params->others.gic_cfg.noise_cut_en,
|
isp_params->others.gic_cfg.noise_coe_a,
|
isp_params->others.gic_cfg.noise_coe_b,
|
isp_params->others.gic_cfg.diff_clip);
|
for(int i = 0; i < ISP2X_GIC_SIGMA_Y_NUM; i++) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sigma_y[%d]=%d\n", i, isp_params->others.gic_cfg.sigma_y[i]);
|
}
|
#if 0 //TODO Merge
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "aiq_results: gic: dnloscale=%f, dnhiscale=%f,gvaluelimitlo=%f,gvaluelimithi=%f,fusionratiohilimt1=%f"
|
"textureStrength=%f,globalStrength=%f,noiseCurve_0=%f,noiseCurve_1=%f",
|
isp20_other_result->gic.dnloscale, isp20_other_result->gic.dnhiscale,
|
isp20_other_result->gic.gvaluelimitlo, isp20_other_result->gic.gvaluelimithi,
|
isp20_other_result->gic.fusionratiohilimt1, isp20_other_result->gic.textureStrength,
|
isp20_other_result->gic.globalStrength, isp20_other_result->gic.noiseCurve_0,
|
isp20_other_result->gic.noiseCurve_1);
|
for(int i = 0; i < ISP2X_GIC_SIGMA_Y_NUM; i++) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sigma[%d]=%f\n", i, isp20_other_result->gic.sigma_y[i]);
|
}
|
#endif
|
}
|
#endif
|
|
XCamReturn
|
CamHwIsp20::setIsppSharpFbcRot(struct rkispp_sharp_config* shp_cfg)
|
{
|
// check if sharp enable
|
// check if fec disable
|
if ((_ispp_module_init_ens & ISPP_MODULE_SHP) &&
|
!(_ispp_module_init_ens & ISPP_MODULE_FEC)) {
|
switch (_sharp_fbc_rotation) {
|
case RK_AIQ_ROTATION_0 :
|
shp_cfg->rotation = 0;
|
break;
|
case RK_AIQ_ROTATION_90 :
|
shp_cfg->rotation = 1;
|
break;
|
case RK_AIQ_ROTATION_270 :
|
shp_cfg->rotation = 3;
|
break;
|
default:
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wrong rotation %d\n", _sharp_fbc_rotation);
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
} else {
|
if (_sharp_fbc_rotation != RK_AIQ_ROTATION_0) {
|
shp_cfg->rotation = 0;
|
_sharp_fbc_rotation = RK_AIQ_ROTATION_0;
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't set sharp config, check fec & sharp config\n");
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
}
|
|
LOGD("sharp rotation %d", _sharp_fbc_rotation);
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::getSensorModeData(const char* sns_ent_name,
|
rk_aiq_exposure_sensor_descriptor& sns_des)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
const SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
const SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
struct v4l2_subdev_selection select;
|
|
ret = mSensorSubdev->getSensorModeData(sns_ent_name, sns_des);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "getSensorModeData failed \n");
|
return ret;
|
}
|
|
xcam_mem_clear (select);
|
ret = mIspCoreDev->get_selection(0, V4L2_SEL_TGT_CROP, select);
|
if (ret == XCAM_RETURN_NO_ERROR) {
|
sns_des.isp_acq_width = select.r.width;
|
sns_des.isp_acq_height = select.r.height;
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "get isp acq,w: %d, h: %d\n",
|
sns_des.isp_acq_width,
|
sns_des.isp_acq_height);
|
} else {
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get selecttion error \n");
|
sns_des.isp_acq_width = sns_des.sensor_output_width;
|
sns_des.isp_acq_height = sns_des.sensor_output_height;
|
ret = XCAM_RETURN_NO_ERROR;
|
}
|
|
xcam_mem_clear (sns_des.lens_des);
|
if (mLensSubdev.ptr())
|
mLensSubdev->getLensModeData(sns_des.lens_des);
|
|
std::map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator iter_sns_info;
|
if ((iter_sns_info = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", sns_name);
|
} else {
|
struct rkmodule_inf *minfo = &(iter_sns_info->second->mod_info);
|
if (minfo->awb.flag)
|
memcpy(&sns_des.otp_awb, &minfo->awb, sizeof(minfo->awb));
|
else
|
minfo->awb.flag = 0;
|
|
if (minfo->lsc.flag)
|
sns_des.otp_lsc = &minfo->lsc;
|
else
|
sns_des.otp_lsc = nullptr;
|
}
|
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setExposureParams(SmartPtr<RkAiqExpParamsProxy>& expPar)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
//exp
|
ret = mSensorSubdev->setExposureParams(expPar);
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setIrisParams(SmartPtr<RkAiqIrisParamsProxy>& irisPar, CalibDb_IrisTypeV2_t irisType)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if(irisType == IRISV2_P_TYPE) { //P-iris
|
int step = irisPar->data()->PIris.step;
|
bool update = irisPar->data()->PIris.update;
|
|
if (mLensSubdev.ptr() && update) {
|
LOGE("|||set P-Iris step: %d", step);
|
if (mLensSubdev->setPIrisParams(step) < 0) {
|
LOGE("set P-Iris step failed to device");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
} else if(irisType == IRISV2_DC_TYPE) {
|
//DC-iris
|
int PwmDuty = irisPar->data()->DCIris.pwmDuty;
|
bool update = irisPar->data()->DCIris.update;
|
|
if (mLensSubdev.ptr() && update) {
|
LOGE("|||set DC-Iris PwmDuty: %d", PwmDuty);
|
if (mLensSubdev->setDCIrisParams(PwmDuty) < 0) {
|
LOGE("set DC-Iris PwmDuty failed to device");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
}
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
|
XCamReturn
|
CamHwIsp20::setFocusParams(SmartPtr<RkAiqFocusParamsProxy>& focus_params)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
rk_aiq_focus_params_t* p_focus = &focus_params->data()->result;
|
|
int position = p_focus->next_lens_pos;
|
bool valid = p_focus->lens_pos_valid;
|
|
if (mLensSubdev.ptr() && valid) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set focus result: %d", position);
|
if (mLensSubdev->setFocusParams(position) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set focus result failed to device");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
position = p_focus->next_zoom_pos;
|
valid = p_focus->zoom_pos_valid;
|
if (mLensSubdev.ptr() && valid) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set zoom result: %d", position);
|
if (mLensSubdev->setZoomParams(position) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set zoom result failed to device");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::getZoomPosition(int& position)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if (mLensSubdev.ptr()) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||get zoom result: %d", position);
|
if (mLensSubdev->getZoomParams(&position) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get zoom result failed to device");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if (mLensSubdev.ptr()) {
|
if (mLensSubdev->setLensVcmCfg(lens_cfg) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set vcm config failed");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::FocusCorrection()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if (mLensSubdev.ptr()) {
|
if (mLensSubdev->FocusCorrection() < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "focus correction failed");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::ZoomCorrection()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if (mLensSubdev.ptr()) {
|
if (mLensSubdev->ZoomCorrection() < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "zoom correction failed");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::getLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
|
if (mLensSubdev.ptr()) {
|
if (mLensSubdev->getLensVcmCfg(lens_cfg) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get vcm config failed");
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setCpslParams(SmartPtr<RkAiqCpslParamsProxy>& cpsl_params)
|
{
|
ENTER_CAMHW_FUNCTION();
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
RKAiqCpslInfoWrapper_t* cpsl_setting = cpsl_params->data().ptr();
|
|
if (cpsl_setting->update_fl) {
|
rk_aiq_flash_setting_t* fl_setting = &cpsl_setting->fl;
|
if (mFlashLight.ptr()) {
|
ret = mFlashLight->set_params(*fl_setting);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set flashlight params err: %d\n", ret);
|
}
|
}
|
}
|
|
if (cpsl_setting->update_ir) {
|
rk_aiq_ir_setting_t* ir_setting = &cpsl_setting->ir;
|
ret = setIrcutParams(ir_setting->irc_on);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set ir params err: %d\n", ret);
|
}
|
|
rk_aiq_flash_setting_t* fl_ir_setting = &cpsl_setting->fl_ir;
|
|
if (mFlashLightIr.ptr()) {
|
ret = mFlashLightIr->set_params(*fl_ir_setting);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set flashlight ir params err: %d\n", ret);
|
}
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setHdrProcessCount(rk_aiq_luma_params_t luma_params)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
ENTER_CAMHW_FUNCTION();
|
mRawProcUnit->set_hdr_frame_readback_infos(luma_params.frame_id, luma_params.hdrProcessCnt);
|
|
//isp20Pollthread = mPollthread.dynamic_cast_ptr<Isp20PollThread>();
|
//isp20Pollthread->set_hdr_frame_readback_infos(luma_params);
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::getEffectiveIspParams(rkisp_effect_params_v20& ispParams, int frame_id)
|
{
|
ENTER_CAMHW_FUNCTION();
|
std::map<int, rkisp_effect_params_v20>::iterator it;
|
int search_id = frame_id < 0 ? 0 : frame_id;
|
SmartLock locker (_isp_params_cfg_mutex);
|
|
if (_effecting_ispparam_map.size() == 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't search id %d, _effecting_exp_mapsize is %d\n",
|
frame_id, _effecting_ispparam_map.size());
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
it = _effecting_ispparam_map.find(search_id);
|
|
// havn't found
|
if (it == _effecting_ispparam_map.end()) {
|
std::map<int, rkisp_effect_params_v20>::reverse_iterator rit;
|
|
rit = _effecting_ispparam_map.rbegin();
|
do {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "traverse _effecting_ispparam_map to find id %d, current id is [%d]\n",
|
search_id, rit->first);
|
if (search_id >= rit->first ) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: can't find id %d, get latest id %d in _effecting_ispparam_map\n",
|
search_id, rit->first);
|
break;
|
}
|
} while (++rit != _effecting_ispparam_map.rend());
|
|
if (rit == _effecting_ispparam_map.rend()) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find the latest effecting exposure for id %d, impossible case !", frame_id);
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
ispParams = rit->second;
|
} else {
|
ispParams = it->second;
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
void CamHwIsp20::dumpRawnrFixValue(struct isp2x_rawnr_cfg * pRawnrCfg )
|
{
|
printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
|
int i = 0;
|
|
//(0x0004)
|
printf("(0x0004) gauss_en:%d log_bypass:%d \n",
|
pRawnrCfg->gauss_en,
|
pRawnrCfg->log_bypass);
|
|
//(0x0008 - 0x0010)
|
printf("(0x0008 - 0x0010) filtpar0-2:%d %d %d \n",
|
pRawnrCfg->filtpar0,
|
pRawnrCfg->filtpar1,
|
pRawnrCfg->filtpar2);
|
|
//(0x0014 - 0x001c)
|
printf("(0x0014 - 0x001c) dgain0-2:%d %d %d \n",
|
pRawnrCfg->dgain0,
|
pRawnrCfg->dgain1,
|
pRawnrCfg->dgain2);
|
|
//(0x0020 - 0x002c)
|
for(int i = 0; i < ISP2X_RAWNR_LUMA_RATION_NUM; i++) {
|
printf("(0x0020 - 0x002c) luration[%d]:%d \n",
|
i, pRawnrCfg->luration[i]);
|
}
|
|
//(0x0030 - 0x003c)
|
for(int i = 0; i < ISP2X_RAWNR_LUMA_RATION_NUM; i++) {
|
printf("(0x0030 - 0x003c) lulevel[%d]:%d \n",
|
i, pRawnrCfg->lulevel[i]);
|
}
|
|
//(0x0040)
|
printf("(0x0040) gauss:%d \n",
|
pRawnrCfg->gauss);
|
|
//(0x0044)
|
printf("(0x0044) sigma:%d \n",
|
pRawnrCfg->sigma);
|
|
//(0x0048)
|
printf("(0x0048) pix_diff:%d \n",
|
pRawnrCfg->pix_diff);
|
|
//(0x004c)
|
printf("(0x004c) thld_diff:%d \n",
|
pRawnrCfg->thld_diff);
|
|
//(0x0050)
|
printf("(0x0050) gas_weig_scl1:%d gas_weig_scl2:%d thld_chanelw:%d \n",
|
pRawnrCfg->gas_weig_scl1,
|
pRawnrCfg->gas_weig_scl2,
|
pRawnrCfg->thld_chanelw);
|
|
//(0x0054)
|
printf("(0x0054) lamda:%d \n",
|
pRawnrCfg->lamda);
|
|
//(0x0058 - 0x005c)
|
printf("(0x0058 - 0x005c) fixw0-3:%d %d %d %d\n",
|
pRawnrCfg->fixw0,
|
pRawnrCfg->fixw1,
|
pRawnrCfg->fixw2,
|
pRawnrCfg->fixw3);
|
|
//(0x0060 - 0x0068)
|
printf("(0x0060 - 0x0068) wlamda0-2:%d %d %d\n",
|
pRawnrCfg->wlamda0,
|
pRawnrCfg->wlamda1,
|
pRawnrCfg->wlamda2);
|
|
|
//(0x006c)
|
printf("(0x006c) rgain_filp-2:%d bgain_filp:%d\n",
|
pRawnrCfg->rgain_filp,
|
pRawnrCfg->bgain_filp);
|
|
|
printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
}
|
|
|
|
void CamHwIsp20::dumpTnrFixValue(struct rkispp_tnr_config * pTnrCfg)
|
{
|
int i = 0;
|
printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
|
//0x0080
|
printf("(0x0080) opty_en:%d optc_en:%d gain_en:%d\n",
|
pTnrCfg->opty_en,
|
pTnrCfg->optc_en,
|
pTnrCfg->gain_en);
|
|
//0x0088
|
printf("(0x0088) pk0_y:%d pk1_y:%d pk0_c:%d pk1_c:%d \n",
|
pTnrCfg->pk0_y,
|
pTnrCfg->pk1_y,
|
pTnrCfg->pk0_c,
|
pTnrCfg->pk1_c);
|
|
//0x008c
|
printf("(0x008c) glb_gain_cur:%d glb_gain_nxt:%d \n",
|
pTnrCfg->glb_gain_cur,
|
pTnrCfg->glb_gain_nxt);
|
|
//0x0090
|
printf("(0x0090) glb_gain_cur_div:%d gain_glb_filt_sqrt:%d \n",
|
pTnrCfg->glb_gain_cur_div,
|
pTnrCfg->glb_gain_cur_sqrt);
|
|
//0x0094 - 0x0098
|
for(i = 0; i < TNR_SIGMA_CURVE_SIZE - 1; i++) {
|
printf("(0x0094 - 0x0098) sigma_x[%d]:%d \n",
|
i, pTnrCfg->sigma_x[i]);
|
}
|
|
//0x009c - 0x00bc
|
for(i = 0; i < TNR_SIGMA_CURVE_SIZE; i++) {
|
printf("(0x009c - 0x00bc) sigma_y[%d]:%d \n",
|
i, pTnrCfg->sigma_y[i]);
|
}
|
|
//0x00c4 - 0x00cc
|
//dir_idx = 0;
|
for(i = 0; i < TNR_LUMA_CURVE_SIZE; i++) {
|
printf("(0x00c4 - 0x00cc) luma_curve[%d]:%d \n",
|
i, pTnrCfg->luma_curve[i]);
|
}
|
|
//0x00d0
|
printf("(0x00d0) txt_th0_y:%d txt_th1_y:%d \n",
|
pTnrCfg->txt_th0_y,
|
pTnrCfg->txt_th1_y);
|
|
//0x00d4
|
printf("(0x00d0) txt_th0_c:%d txt_th1_c:%d \n",
|
pTnrCfg->txt_th0_c,
|
pTnrCfg->txt_th1_c);
|
|
//0x00d8
|
printf("(0x00d8) txt_thy_dlt:%d txt_thc_dlt:%d \n",
|
pTnrCfg->txt_thy_dlt,
|
pTnrCfg->txt_thc_dlt);
|
|
//0x00dc - 0x00ec
|
for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
|
printf("(0x00dc - 0x00ec) gfcoef_y0[%d]:%d \n",
|
i, pTnrCfg->gfcoef_y0[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x00dc - 0x00ec) gfcoef_y1[%d]:%d \n",
|
i, pTnrCfg->gfcoef_y1[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x00dc - 0x00ec) gfcoef_y2[%d]:%d \n",
|
i, pTnrCfg->gfcoef_y2[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x00dc - 0x00ec) gfcoef_y3[%d]:%d \n",
|
i, pTnrCfg->gfcoef_y3[i]);
|
}
|
|
//0x00f0 - 0x0100
|
for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
|
printf("(0x00f0 - 0x0100) gfcoef_yg0[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yg0[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x00f0 - 0x0100) gfcoef_yg1[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yg1[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x00f0 - 0x0100) gfcoef_yg2[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yg2[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x00f0 - 0x0100) gfcoef_yg3[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yg3[i]);
|
}
|
|
|
//0x0104 - 0x0110
|
for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
|
printf("(0x0104 - 0x0110) gfcoef_yl0[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yl0[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x0104 - 0x0110) gfcoef_yl1[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yl1[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x0104 - 0x0110) gfcoef_yl2[%d]:%d \n",
|
i, pTnrCfg->gfcoef_yl2[i]);
|
}
|
|
//0x0114 - 0x0120
|
for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
|
printf("(0x0114 - 0x0120) gfcoef_cg0[%d]:%d \n",
|
i, pTnrCfg->gfcoef_cg0[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x0114 - 0x0120) gfcoef_cg1[%d]:%d \n",
|
i, pTnrCfg->gfcoef_cg1[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x0114 - 0x0120) gfcoef_cg2[%d]:%d \n",
|
i, pTnrCfg->gfcoef_cg2[i]);
|
}
|
|
|
//0x0124 - 0x012c
|
for(i = 0; i < TNR_GFCOEF6_SIZE; i++) {
|
printf("(0x0124 - 0x012c) gfcoef_cl0[%d]:%d \n",
|
i, pTnrCfg->gfcoef_cl0[i]);
|
}
|
for(i = 0; i < TNR_GFCOEF3_SIZE; i++) {
|
printf("(0x0124 - 0x012c) gfcoef_cl1[%d]:%d \n",
|
i, pTnrCfg->gfcoef_cl1[i]);
|
}
|
|
|
//0x0130 - 0x0134
|
//dir_idx = 0; i = lvl;
|
for(i = 0; i < TNR_SCALE_YG_SIZE; i++) {
|
printf("(0x0130 - 0x0134) scale_yg[%d]:%d \n",
|
i, pTnrCfg->scale_yg[i]);
|
}
|
|
//0x0138 - 0x013c
|
//dir_idx = 1; i = lvl;
|
for(i = 0; i < TNR_SCALE_YL_SIZE; i++) {
|
printf("(0x0138 - 0x013c) scale_yl[%d]:%d \n",
|
i, pTnrCfg->scale_yl[i]);
|
}
|
|
//0x0140 - 0x0148
|
//dir_idx = 0; i = lvl;
|
for(i = 0; i < TNR_SCALE_CG_SIZE; i++) {
|
printf("(0x0140 - 0x0148) scale_cg[%d]:%d \n",
|
i, pTnrCfg->scale_cg[i]);
|
printf("(0x0140 - 0x0148) scale_y2cg[%d]:%d \n",
|
i, pTnrCfg->scale_y2cg[i]);
|
}
|
|
//0x014c - 0x0154
|
//dir_idx = 1; i = lvl;
|
for(i = 0; i < TNR_SCALE_CL_SIZE; i++) {
|
printf("(0x014c - 0x0154) scale_cl[%d]:%d \n",
|
i, pTnrCfg->scale_cl[i]);
|
}
|
for(i = 0; i < TNR_SCALE_Y2CL_SIZE; i++) {
|
printf("(0x014c - 0x0154) scale_y2cl[%d]:%d \n",
|
i, pTnrCfg->scale_y2cl[i]);
|
}
|
|
//0x0158
|
for(i = 0; i < TNR_WEIGHT_Y_SIZE; i++) {
|
printf("(0x0158) weight_y[%d]:%d \n",
|
i, pTnrCfg->weight_y[i]);
|
}
|
|
printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
}
|
|
|
void CamHwIsp20::dumpUvnrFixValue(struct rkispp_nr_config * pNrCfg)
|
{
|
int i = 0;
|
printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
//0x0080
|
printf("(0x0088) uvnr_step1_en:%d uvnr_step2_en:%d nr_gain_en:%d uvnr_nobig_en:%d uvnr_big_en:%d\n",
|
pNrCfg->uvnr_step1_en,
|
pNrCfg->uvnr_step2_en,
|
pNrCfg->nr_gain_en,
|
pNrCfg->uvnr_nobig_en,
|
pNrCfg->uvnr_big_en);
|
|
//0x0084
|
printf("(0x0084) uvnr_gain_1sigma:%d \n",
|
pNrCfg->uvnr_gain_1sigma);
|
|
//0x0088
|
printf("(0x0088) uvnr_gain_offset:%d \n",
|
pNrCfg->uvnr_gain_offset);
|
|
//0x008c
|
printf("(0x008c) uvnr_gain_uvgain:%d uvnr_step2_en:%d uvnr_gain_t2gen:%d uvnr_gain_iso:%d\n",
|
pNrCfg->uvnr_gain_uvgain[0],
|
pNrCfg->uvnr_gain_uvgain[1],
|
pNrCfg->uvnr_gain_t2gen,
|
pNrCfg->uvnr_gain_iso);
|
|
|
//0x0090
|
printf("(0x0090) uvnr_t1gen_m3alpha:%d \n",
|
pNrCfg->uvnr_t1gen_m3alpha);
|
|
//0x0094
|
printf("(0x0094) uvnr_t1flt_mode:%d \n",
|
pNrCfg->uvnr_t1flt_mode);
|
|
//0x0098
|
printf("(0x0098) uvnr_t1flt_msigma:%d \n",
|
pNrCfg->uvnr_t1flt_msigma);
|
|
//0x009c
|
printf("(0x009c) uvnr_t1flt_wtp:%d \n",
|
pNrCfg->uvnr_t1flt_wtp);
|
|
//0x00a0-0x00a4
|
for(i = 0; i < NR_UVNR_T1FLT_WTQ_SIZE; i++) {
|
printf("(0x00a0-0x00a4) uvnr_t1flt_wtq[%d]:%d \n",
|
i, pNrCfg->uvnr_t1flt_wtq[i]);
|
}
|
|
//0x00a8
|
printf("(0x00a8) uvnr_t2gen_m3alpha:%d \n",
|
pNrCfg->uvnr_t2gen_m3alpha);
|
|
//0x00ac
|
printf("(0x00ac) uvnr_t2gen_msigma:%d \n",
|
pNrCfg->uvnr_t2gen_msigma);
|
|
//0x00b0
|
printf("(0x00b0) uvnr_t2gen_wtp:%d \n",
|
pNrCfg->uvnr_t2gen_wtp);
|
|
//0x00b4
|
for(i = 0; i < NR_UVNR_T2GEN_WTQ_SIZE; i++) {
|
printf("(0x00b4) uvnr_t2gen_wtq[%d]:%d \n",
|
i, pNrCfg->uvnr_t2gen_wtq[i]);
|
}
|
|
//0x00b8
|
printf("(0x00b8) uvnr_t2flt_msigma:%d \n",
|
pNrCfg->uvnr_t2flt_msigma);
|
|
//0x00bc
|
printf("(0x00bc) uvnr_t2flt_wtp:%d \n",
|
pNrCfg->uvnr_t2flt_wtp);
|
for(i = 0; i < NR_UVNR_T2FLT_WT_SIZE; i++) {
|
printf("(0x00bc) uvnr_t2flt_wt[%d]:%d \n",
|
i, pNrCfg->uvnr_t2flt_wt[i]);
|
}
|
|
|
printf("%s:(%d) entor \n", __FUNCTION__, __LINE__);
|
}
|
|
|
void CamHwIsp20::dumpYnrFixValue(struct rkispp_nr_config * pNrCfg)
|
{
|
printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
|
|
int i = 0;
|
|
//0x0104 - 0x0108
|
for(i = 0; i < NR_YNR_SGM_DX_SIZE; i++) {
|
printf("(0x0104 - 0x0108) ynr_sgm_dx[%d]:%d \n",
|
i, pNrCfg->ynr_sgm_dx[i]);
|
}
|
|
//0x010c - 0x012c
|
for(i = 0; i < NR_YNR_SGM_Y_SIZE; i++) {
|
printf("(0x010c - 0x012c) ynr_lsgm_y[%d]:%d \n",
|
i, pNrCfg->ynr_lsgm_y[i]);
|
}
|
|
//0x0130
|
for(i = 0; i < NR_YNR_CI_SIZE; i++) {
|
printf("(0x0130) ynr_lci[%d]:%d \n",
|
i, pNrCfg->ynr_lci[i]);
|
}
|
|
//0x0134
|
for(i = 0; i < NR_YNR_LGAIN_MIN_SIZE; i++) {
|
printf("(0x0134) ynr_lgain_min[%d]:%d \n",
|
i, pNrCfg->ynr_lgain_min[i]);
|
}
|
|
//0x0138
|
printf("(0x0138) ynr_lgain_max:%d \n",
|
pNrCfg->ynr_lgain_max);
|
|
|
//0x013c
|
printf("(0x013c) ynr_lmerge_bound:%d ynr_lmerge_ratio:%d\n",
|
pNrCfg->ynr_lmerge_bound,
|
pNrCfg->ynr_lmerge_ratio);
|
|
//0x0140
|
for(i = 0; i < NR_YNR_LWEIT_FLT_SIZE; i++) {
|
printf("(0x0140) ynr_lweit_flt[%d]:%d \n",
|
i, pNrCfg->ynr_lweit_flt[i]);
|
}
|
|
//0x0144 - 0x0164
|
for(i = 0; i < NR_YNR_SGM_Y_SIZE; i++) {
|
printf("(0x0144 - 0x0164) ynr_hsgm_y[%d]:%d \n",
|
i, pNrCfg->ynr_hsgm_y[i]);
|
}
|
|
//0x0168
|
for(i = 0; i < NR_YNR_CI_SIZE; i++) {
|
printf("(0x0168) ynr_hlci[%d]:%d \n",
|
i, pNrCfg->ynr_hlci[i]);
|
}
|
|
//0x016c
|
for(i = 0; i < NR_YNR_CI_SIZE; i++) {
|
printf("(0x016c) ynr_lhci[%d]:%d \n",
|
i, pNrCfg->ynr_lhci[i]);
|
}
|
|
//0x0170
|
for(i = 0; i < NR_YNR_CI_SIZE; i++) {
|
printf("(0x0170) ynr_hhci[%d]:%d \n",
|
i, pNrCfg->ynr_hhci[i]);
|
}
|
|
//0x0174
|
for(i = 0; i < NR_YNR_HGAIN_SGM_SIZE; i++) {
|
printf("(0x0174) ynr_hgain_sgm[%d]:%d \n",
|
i, pNrCfg->ynr_hgain_sgm[i]);
|
}
|
|
//0x0178 - 0x0188
|
for(i = 0; i < 5; i++) {
|
printf("(0x0178 - 0x0188) ynr_hweit_d[%d - %d]:%d %d %d %d \n",
|
i * 4 + 0, i * 4 + 3,
|
pNrCfg->ynr_hweit_d[i * 4 + 0],
|
pNrCfg->ynr_hweit_d[i * 4 + 1],
|
pNrCfg->ynr_hweit_d[i * 4 + 2],
|
pNrCfg->ynr_hweit_d[i * 4 + 3]);
|
}
|
|
|
//0x018c - 0x01a0
|
for(i = 0; i < 6; i++) {
|
printf("(0x018c - 0x01a0) ynr_hgrad_y[%d - %d]:%d %d %d %d \n",
|
i * 4 + 0, i * 4 + 3,
|
pNrCfg->ynr_hgrad_y[i * 4 + 0],
|
pNrCfg->ynr_hgrad_y[i * 4 + 1],
|
pNrCfg->ynr_hgrad_y[i * 4 + 2],
|
pNrCfg->ynr_hgrad_y[i * 4 + 3]);
|
}
|
|
//0x01a4 -0x01a8
|
for(i = 0; i < NR_YNR_HWEIT_SIZE; i++) {
|
printf("(0x01a4 -0x01a8) ynr_hweit[%d]:%d \n",
|
i, pNrCfg->ynr_hweit[i]);
|
}
|
|
//0x01b0
|
printf("(0x01b0) ynr_hmax_adjust:%d \n",
|
pNrCfg->ynr_hmax_adjust);
|
|
//0x01b4
|
printf("(0x01b4) ynr_hstrength:%d \n",
|
pNrCfg->ynr_hstrength);
|
|
//0x01b8
|
printf("(0x01b8) ynr_lweit_cmp0-1:%d %d\n",
|
pNrCfg->ynr_lweit_cmp[0],
|
pNrCfg->ynr_lweit_cmp[1]);
|
|
//0x01bc
|
printf("(0x01bc) ynr_lmaxgain_lv4:%d \n",
|
pNrCfg->ynr_lmaxgain_lv4);
|
|
//0x01c0 - 0x01e0
|
for(i = 0; i < NR_YNR_HSTV_Y_SIZE; i++) {
|
printf("(0x01c0 - 0x01e0 ) ynr_hstv_y[%d]:%d \n",
|
i, pNrCfg->ynr_hstv_y[i]);
|
}
|
|
//0x01e4 - 0x01e8
|
for(i = 0; i < NR_YNR_ST_SCALE_SIZE; i++) {
|
printf("(0x01e4 - 0x01e8 ) ynr_st_scale[%d]:%d \n",
|
i, pNrCfg->ynr_st_scale[i]);
|
}
|
|
printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
|
}
|
|
|
void CamHwIsp20::dumpSharpFixValue(struct rkispp_sharp_config * pSharpCfg)
|
{
|
printf("%s:(%d) enter \n", __FUNCTION__, __LINE__);
|
int i = 0;
|
|
//0x0080
|
printf("(0x0080) alpha_adp_en:%d yin_flt_en:%d edge_avg_en:%d\n",
|
pSharpCfg->alpha_adp_en,
|
pSharpCfg->yin_flt_en,
|
pSharpCfg->edge_avg_en);
|
|
|
//0x0084
|
printf("(0x0084) hbf_ratio:%d ehf_th:%d pbf_ratio:%d\n",
|
pSharpCfg->hbf_ratio,
|
pSharpCfg->ehf_th,
|
pSharpCfg->pbf_ratio);
|
|
//0x0088
|
printf("(0x0088) edge_thed:%d dir_min:%d smoth_th4:%d\n",
|
pSharpCfg->edge_thed,
|
pSharpCfg->dir_min,
|
pSharpCfg->smoth_th4);
|
|
//0x008c
|
printf("(0x008c) l_alpha:%d g_alpha:%d \n",
|
pSharpCfg->l_alpha,
|
pSharpCfg->g_alpha);
|
|
|
//0x0090
|
for(i = 0; i < 3; i++) {
|
printf("(0x0090) pbf_k[%d]:%d \n",
|
i, pSharpCfg->pbf_k[i]);
|
}
|
|
|
|
//0x0094 - 0x0098
|
for(i = 0; i < 6; i++) {
|
printf("(0x0094 - 0x0098) mrf_k[%d]:%d \n",
|
i, pSharpCfg->mrf_k[i]);
|
}
|
|
|
//0x009c -0x00a4
|
for(i = 0; i < 12; i++) {
|
printf("(0x009c -0x00a4) mbf_k[%d]:%d \n",
|
i, pSharpCfg->mbf_k[i]);
|
}
|
|
|
//0x00a8 -0x00ac
|
for(i = 0; i < 6; i++) {
|
printf("(0x00a8 -0x00ac) hrf_k[%d]:%d \n",
|
i, pSharpCfg->hrf_k[i]);
|
}
|
|
|
//0x00b0
|
for(i = 0; i < 3; i++) {
|
printf("(0x00b0) hbf_k[%d]:%d \n",
|
i, pSharpCfg->hbf_k[i]);
|
}
|
|
|
//0x00b4
|
for(i = 0; i < 3; i++) {
|
printf("(0x00b4) eg_coef[%d]:%d \n",
|
i, pSharpCfg->eg_coef[i]);
|
}
|
|
//0x00b8
|
for(i = 0; i < 3; i++) {
|
printf("(0x00b8) eg_smoth[%d]:%d \n",
|
i, pSharpCfg->eg_smoth[i]);
|
}
|
|
|
//0x00bc - 0x00c0
|
for(i = 0; i < 6; i++) {
|
printf("(0x00bc - 0x00c0) eg_gaus[%d]:%d \n",
|
i, pSharpCfg->eg_gaus[i]);
|
}
|
|
|
//0x00c4 - 0x00c8
|
for(i = 0; i < 6; i++) {
|
printf("(0x00c4 - 0x00c8) dog_k[%d]:%d \n",
|
i, pSharpCfg->dog_k[i]);
|
}
|
|
|
//0x00cc - 0x00d0
|
for(i = 0; i < SHP_LUM_POINT_SIZE; i++) {
|
printf("(0x00cc - 0x00d0) lum_point[%d]:%d \n",
|
i, pSharpCfg->lum_point[i]);
|
}
|
|
//0x00d4
|
printf("(0x00d4) pbf_shf_bits:%d mbf_shf_bits:%d hbf_shf_bits:%d\n",
|
pSharpCfg->pbf_shf_bits,
|
pSharpCfg->mbf_shf_bits,
|
pSharpCfg->hbf_shf_bits);
|
|
|
//0x00d8 - 0x00dc
|
for(i = 0; i < SHP_SIGMA_SIZE; i++) {
|
printf("(0x00d8 - 0x00dc) pbf_sigma[%d]:%d \n",
|
i, pSharpCfg->pbf_sigma[i]);
|
}
|
|
//0x00e0 - 0x00e4
|
for(i = 0; i < SHP_LUM_CLP_SIZE; i++) {
|
printf("(0x00e0 - 0x00e4) lum_clp_m[%d]:%d \n",
|
i, pSharpCfg->lum_clp_m[i]);
|
}
|
|
//0x00e8 - 0x00ec
|
for(i = 0; i < SHP_LUM_MIN_SIZE; i++) {
|
printf("(0x00e8 - 0x00ec) lum_min_m[%d]:%d \n",
|
i, pSharpCfg->lum_min_m[i]);
|
}
|
|
//0x00f0 - 0x00f4
|
for(i = 0; i < SHP_SIGMA_SIZE; i++) {
|
printf("(0x00f0 - 0x00f4) mbf_sigma[%d]:%d \n",
|
i, pSharpCfg->mbf_sigma[i]);
|
}
|
|
//0x00f8 - 0x00fc
|
for(i = 0; i < SHP_LUM_CLP_SIZE; i++) {
|
printf("(0x00f8 - 0x00fc) lum_clp_h[%d]:%d \n",
|
i, pSharpCfg->lum_clp_h[i]);
|
}
|
|
//0x0100 - 0x0104
|
for(i = 0; i < SHP_SIGMA_SIZE; i++) {
|
printf("(0x0100 - 0x0104) hbf_sigma[%d]:%d \n",
|
i, pSharpCfg->hbf_sigma[i]);
|
}
|
|
//0x0108 - 0x010c
|
for(i = 0; i < SHP_EDGE_LUM_THED_SIZE; i++) {
|
printf("(0x0108 - 0x010c) edge_lum_thed[%d]:%d \n",
|
i, pSharpCfg->edge_lum_thed[i]);
|
}
|
|
//0x0110 - 0x0114
|
for(i = 0; i < SHP_CLAMP_SIZE; i++) {
|
printf("(0x0110 - 0x0114) clamp_pos[%d]:%d \n",
|
i, pSharpCfg->clamp_pos[i]);
|
}
|
|
//0x0118 - 0x011c
|
for(i = 0; i < SHP_CLAMP_SIZE; i++) {
|
printf("(0x0118 - 0x011c) clamp_neg[%d]:%d \n",
|
i, pSharpCfg->clamp_neg[i]);
|
}
|
|
//0x0120 - 0x0124
|
for(i = 0; i < SHP_DETAIL_ALPHA_SIZE; i++) {
|
printf("(0x0120 - 0x0124) detail_alpha[%d]:%d \n",
|
i, pSharpCfg->detail_alpha[i]);
|
}
|
|
//0x0128
|
printf("(0x0128) rfl_ratio:%d rfh_ratio:%d\n",
|
pSharpCfg->rfl_ratio, pSharpCfg->rfh_ratio);
|
|
// mf/hf ratio
|
|
//0x012C
|
printf("(0x012C) m_ratio:%d h_ratio:%d\n",
|
pSharpCfg->m_ratio, pSharpCfg->h_ratio);
|
|
printf("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
}
|
|
XCamReturn
|
CamHwIsp20::setModuleCtl(rk_aiq_module_id_t moduleId, bool en)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
if (_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) {
|
if ((moduleId == RK_MODULE_TNR) && (en == false)) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "motion detect is running, operate not permit!");
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
}
|
setModuleStatus(moduleId, en);
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::getModuleCtl(rk_aiq_module_id_t moduleId, bool &en)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
getModuleStatus(moduleId, en);
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::notify_capture_raw()
|
{
|
// SmartPtr<Isp20PollThread> isp20Pollthread = mPollthread.dynamic_cast_ptr<Isp20PollThread>();
|
// if (isp20Pollthread.ptr())
|
return CaptureRawData::getInstance().notify_capture_raw();
|
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
XCamReturn CamHwIsp20::capture_raw_ctl(capture_raw_t type, int count, const char* capture_dir, char* output_dir)
|
{
|
// SmartPtr<Isp20PollThread> isp20Pollthread = mPollthread.dynamic_cast_ptr<Isp20PollThread>();
|
// if (isp20Pollthread.ptr()) {
|
if (type == CAPTURE_RAW_AND_YUV_SYNC)
|
return CaptureRawData::getInstance().capture_raw_ctl(type);
|
else if (type == CAPTURE_RAW_SYNC)
|
return CaptureRawData::getInstance().capture_raw_ctl(type, count, capture_dir, output_dir);
|
// }
|
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
XCamReturn
|
CamHwIsp20::setIrcutParams(bool on)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
|
struct v4l2_control control;
|
|
xcam_mem_clear (control);
|
control.id = V4L2_CID_BAND_STOP_FILTER;
|
if(on)
|
control.value = IRCUT_STATE_CLOSED;
|
else
|
control.value = IRCUT_STATE_OPENED;
|
if (mIrcutDev.ptr()) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set ircut value: %d", control.value);
|
if (mIrcutDev->io_control (VIDIOC_S_CTRL, &control) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set ircut value failed to device!");
|
ret = XCAM_RETURN_ERROR_IOCTL;
|
}
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
uint64_t CamHwIsp20::getIspModuleEnState()
|
{
|
return ispModuleEns;
|
}
|
|
XCamReturn CamHwIsp20::setSensorFlip(bool mirror, bool flip, int skip_frm_cnt)
|
{
|
SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
int32_t skip_frame_sequence = 0;
|
ret = mSensorSubdev->set_mirror_flip(mirror, flip, skip_frame_sequence);
|
|
/* struct timespec tp; */
|
/* clock_gettime(CLOCK_MONOTONIC, &tp); */
|
/* int64_t skip_ts = (int64_t)(tp.tv_sec) * 1000 * 1000 * 1000 + (int64_t)(tp.tv_nsec); */
|
|
if (_state == CAM_HW_STATE_STARTED && skip_frame_sequence != -1)
|
mRawCapUnit->skip_frames(skip_frm_cnt, skip_frame_sequence);
|
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::getSensorFlip(bool& mirror, bool& flip)
|
{
|
SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
|
return mSensorSubdev->get_mirror_flip(mirror, flip);
|
}
|
|
XCamReturn CamHwIsp20::setSensorCrop(rk_aiq_rect_t& rect)
|
{
|
XCamReturn ret;
|
struct v4l2_crop crop;
|
for (int i = 0; i < 3; i++) {
|
SmartPtr<V4l2Device> mipi_tx = mRawCapUnit->get_tx_device(i).dynamic_cast_ptr<V4l2Device>();
|
memset(&crop, 0, sizeof(crop));
|
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
ret = mipi_tx->get_crop(crop);
|
crop.c.left = rect.left;
|
crop.c.top = rect.top;
|
crop.c.width = rect.width;
|
crop.c.height = rect.height;
|
ret = mipi_tx->set_crop(crop);
|
}
|
_crop_rect = rect;
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::getSensorCrop(rk_aiq_rect_t& rect)
|
{
|
XCamReturn ret;
|
struct v4l2_crop crop;
|
SmartPtr<V4l2Device> mipi_tx = mRawCapUnit->get_tx_device(0).dynamic_cast_ptr<V4l2Device>();
|
memset(&crop, 0, sizeof(crop));
|
ret = mipi_tx->get_crop(crop);
|
rect.left = crop.c.left;
|
rect.top = crop.c.top;
|
rect.width = crop.c.width;
|
rect.height = crop.c.height;
|
return ret;
|
}
|
|
void CamHwIsp20::setHdrGlobalTmoMode(int frame_id, bool mode)
|
{
|
if (mNoReadBack)
|
return;
|
|
mRawProcUnit->set_hdr_global_tmo_mode(frame_id, mode);
|
}
|
|
void CamHwIsp20::setMulCamConc(bool cc)
|
{
|
mRawProcUnit->setMulCamConc(cc);
|
if (cc)
|
mNoReadBack = false;
|
}
|
|
void CamHwIsp20::getShareMemOps(isp_drv_share_mem_ops_t** mem_ops)
|
{
|
this->alloc_mem = (alloc_mem_t)&CamHwIsp20::allocMemResource;
|
this->release_mem = (release_mem_t)&CamHwIsp20::releaseMemResource;
|
this->get_free_item = (get_free_item_t)&CamHwIsp20::getFreeItem;
|
*mem_ops = this;
|
}
|
|
void CamHwIsp20::allocMemResource(void *ops_ctx, void *config, void **mem_ctx)
|
{
|
int ret = -1;
|
struct rkisp_ldchbuf_info ldchbuf_info;
|
struct rkispp_fecbuf_info fecbuf_info;
|
struct rkisp_ldchbuf_size ldchbuf_size;
|
struct rkispp_fecbuf_size fecbuf_size;
|
|
CamHwIsp20 *isp20 = static_cast<CamHwIsp20*>((isp_drv_share_mem_ops_t*)ops_ctx);
|
rk_aiq_share_mem_config_t* share_mem_cfg = (rk_aiq_share_mem_config_t *)config;
|
|
SmartLock locker (isp20->_mem_mutex);
|
if (share_mem_cfg->mem_type == MEM_TYPE_LDCH) {
|
ldchbuf_size.meas_width = share_mem_cfg->alloc_param.width;
|
ldchbuf_size.meas_height = share_mem_cfg->alloc_param.height;
|
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_SET_LDCHBUF_SIZE, &ldchbuf_size);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc ldch buf failed!");
|
*mem_ctx = nullptr;
|
return;
|
}
|
xcam_mem_clear(ldchbuf_info);
|
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_GET_LDCHBUF_INFO, &ldchbuf_info);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to get ldch buf info!!");
|
*mem_ctx = nullptr;
|
return;
|
}
|
rk_aiq_ldch_share_mem_info_t* mem_info_array =
|
(rk_aiq_ldch_share_mem_info_t*)(isp20->_ldch_drv_mem_ctx.mem_info);
|
for (int i = 0; i < ISP2X_LDCH_BUF_NUM; i++) {
|
mem_info_array[i].map_addr =
|
mmap(NULL, ldchbuf_info.buf_size[i], PROT_READ | PROT_WRITE, MAP_SHARED, ldchbuf_info.buf_fd[i], 0);
|
if (MAP_FAILED == mem_info_array[i].map_addr)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map ldch buf!!");
|
|
mem_info_array[i].fd = ldchbuf_info.buf_fd[i];
|
mem_info_array[i].size = ldchbuf_info.buf_size[i];
|
struct isp2x_ldch_head *head = (struct isp2x_ldch_head*)mem_info_array[i].map_addr;
|
mem_info_array[i].addr = (void*)((char*)mem_info_array[i].map_addr + head->data_oft);
|
mem_info_array[i].state = (char*)&head->stat;
|
}
|
*mem_ctx = (void*)(&isp20->_ldch_drv_mem_ctx);
|
} else if (share_mem_cfg->mem_type == MEM_TYPE_FEC) {
|
fecbuf_size.meas_width = share_mem_cfg->alloc_param.width;
|
fecbuf_size.meas_height = share_mem_cfg->alloc_param.height;
|
fecbuf_size.meas_mode = share_mem_cfg->alloc_param.reserved[0];
|
ret = isp20->_ispp_sd->io_control(RKISPP_CMD_SET_FECBUF_SIZE, &fecbuf_size);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc fec buf failed!");
|
*mem_ctx = nullptr;
|
return;
|
}
|
xcam_mem_clear(fecbuf_info);
|
ret = isp20->_ispp_sd->io_control(RKISPP_CMD_GET_FECBUF_INFO, &fecbuf_info);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to get fec buf info!!");
|
*mem_ctx = nullptr;
|
return;
|
}
|
rk_aiq_fec_share_mem_info_t* mem_info_array =
|
(rk_aiq_fec_share_mem_info_t*)(isp20->_fec_drv_mem_ctx.mem_info);
|
for (int i = 0; i < FEC_MESH_BUF_NUM; i++) {
|
mem_info_array[i].map_addr =
|
mmap(NULL, fecbuf_info.buf_size[i], PROT_READ | PROT_WRITE, MAP_SHARED, fecbuf_info.buf_fd[i], 0);
|
if (MAP_FAILED == mem_info_array[i].map_addr)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map fec buf!!");
|
|
mem_info_array[i].fd = fecbuf_info.buf_fd[i];
|
mem_info_array[i].size = fecbuf_info.buf_size[i];
|
struct rkispp_fec_head *head = (struct rkispp_fec_head*)mem_info_array[i].map_addr;
|
mem_info_array[i].meshxf =
|
(unsigned char*)mem_info_array[i].map_addr + head->meshxf_oft;
|
mem_info_array[i].meshyf =
|
(unsigned char*)mem_info_array[i].map_addr + head->meshyf_oft;
|
mem_info_array[i].meshxi =
|
(unsigned short*)((char*)mem_info_array[i].map_addr + head->meshxi_oft);
|
mem_info_array[i].meshyi =
|
(unsigned short*)((char*)mem_info_array[i].map_addr + head->meshyi_oft);
|
mem_info_array[i].state = (char*)&head->stat;
|
}
|
*mem_ctx = (void*)(&isp20->_fec_drv_mem_ctx);
|
}
|
}
|
|
void CamHwIsp20::releaseMemResource(void *mem_ctx)
|
{
|
int ret = -1;
|
drv_share_mem_ctx_t* drv_mem_ctx = (drv_share_mem_ctx_t*)mem_ctx;
|
CamHwIsp20 *isp20 = (CamHwIsp20*)(drv_mem_ctx->ops_ctx);
|
|
SmartLock locker (isp20->_mem_mutex);
|
if (drv_mem_ctx->type == MEM_TYPE_LDCH) {
|
rk_aiq_ldch_share_mem_info_t* mem_info_array =
|
(rk_aiq_ldch_share_mem_info_t*)(drv_mem_ctx->mem_info);
|
for (int i = 0; i < ISP2X_LDCH_BUF_NUM; i++) {
|
if (mem_info_array[i].map_addr) {
|
ret = munmap(mem_info_array[i].map_addr, mem_info_array[i].size);
|
if (ret < 0)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap ldch buf info!!");
|
mem_info_array[i].map_addr = NULL;
|
}
|
::close(mem_info_array[i].fd);
|
}
|
} else if (drv_mem_ctx->type == MEM_TYPE_FEC) {
|
rk_aiq_fec_share_mem_info_t* mem_info_array =
|
(rk_aiq_fec_share_mem_info_t*)(drv_mem_ctx->mem_info);
|
for (int i = 0; i < FEC_MESH_BUF_NUM; i++) {
|
if (mem_info_array[i].map_addr) {
|
ret = munmap(mem_info_array[i].map_addr, mem_info_array[i].size);
|
if (ret < 0)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap fec buf info!!");
|
mem_info_array[i].map_addr = NULL;
|
}
|
::close(mem_info_array[i].fd);
|
}
|
}
|
}
|
|
void*
|
CamHwIsp20::getFreeItem(void *mem_ctx)
|
{
|
unsigned int idx;
|
int retry_cnt = 3;
|
drv_share_mem_ctx_t* drv_mem_ctx = (drv_share_mem_ctx_t*)mem_ctx;
|
CamHwIsp20 *isp20 = (CamHwIsp20*)(drv_mem_ctx->ops_ctx);
|
|
SmartLock locker (isp20->_mem_mutex);
|
if (drv_mem_ctx->type == MEM_TYPE_LDCH) {
|
rk_aiq_ldch_share_mem_info_t* mem_info_array =
|
(rk_aiq_ldch_share_mem_info_t*)(drv_mem_ctx->mem_info);
|
do {
|
for (idx = 0; idx < ISP2X_LDCH_BUF_NUM; idx++) {
|
if (mem_info_array[idx].state &&
|
(0 == mem_info_array[idx].state[0])) {
|
return (void*)&mem_info_array[idx];
|
}
|
}
|
} while(retry_cnt--);
|
} else if (drv_mem_ctx->type == MEM_TYPE_FEC) {
|
rk_aiq_fec_share_mem_info_t* mem_info_array =
|
(rk_aiq_fec_share_mem_info_t*)(drv_mem_ctx->mem_info);
|
do {
|
for (idx = 0; idx < FEC_MESH_BUF_NUM; idx++) {
|
if (mem_info_array[idx].state &&
|
(0 == mem_info_array[idx].state[0])) {
|
return (void*)&mem_info_array[idx];
|
}
|
}
|
} while(retry_cnt--);
|
}
|
return NULL;
|
}
|
|
XCamReturn
|
CamHwIsp20::poll_event_ready (uint32_t sequence, int type)
|
{
|
// if (type == V4L2_EVENT_FRAME_SYNC && mIspEvtsListener) {
|
// SmartPtr<SensorHw> mSensor = mSensorDev.dynamic_cast_ptr<SensorHw>();
|
// SmartPtr<Isp20Evt> evtInfo = new Isp20Evt(this, mSensor);
|
// evtInfo->evt_code = type;
|
// evtInfo->sequence = sequence;
|
// evtInfo->expDelay = _exp_delay;
|
|
// return mIspEvtsListener->ispEvtsCb(evtInfo);
|
// }
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
SmartPtr<ispHwEvt_t>
|
CamHwIsp20::make_ispHwEvt (uint32_t sequence, int type, int64_t timestamp)
|
{
|
if (type == V4L2_EVENT_FRAME_SYNC) {
|
SmartPtr<SensorHw> mSensor = mSensorDev.dynamic_cast_ptr<SensorHw>();
|
SmartPtr<Isp20Evt> evtInfo = new Isp20Evt(this, mSensor);
|
evtInfo->evt_code = type;
|
evtInfo->sequence = sequence;
|
evtInfo->expDelay = _exp_delay;
|
evtInfo->setSofTimeStamp(timestamp);
|
|
return evtInfo;
|
}
|
|
return nullptr;
|
}
|
|
XCamReturn
|
CamHwIsp20::poll_event_failed (int64_t timestamp, const char *msg)
|
{
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
XCamReturn
|
CamHwIsp20::applyAnalyzerResult(SmartPtr<SharedItemBase> base, bool sync)
|
{
|
return dispatchResult(base);
|
}
|
|
XCamReturn
|
CamHwIsp20::applyAnalyzerResult(cam3aResultList& list)
|
{
|
return dispatchResult(list);
|
}
|
|
XCamReturn
|
CamHwIsp20::dispatchResult(cam3aResultList& list)
|
{
|
cam3aResultList isp_result_list;
|
for (auto& result : list) {
|
switch (result->getType()) {
|
case RESULT_TYPE_AEC_PARAM:
|
case RESULT_TYPE_HIST_PARAM:
|
case RESULT_TYPE_AWB_PARAM:
|
case RESULT_TYPE_AWBGAIN_PARAM:
|
case RESULT_TYPE_AF_PARAM:
|
case RESULT_TYPE_DPCC_PARAM:
|
case RESULT_TYPE_MERGE_PARAM:
|
case RESULT_TYPE_TMO_PARAM:
|
case RESULT_TYPE_CCM_PARAM:
|
case RESULT_TYPE_LSC_PARAM:
|
case RESULT_TYPE_BLC_PARAM:
|
case RESULT_TYPE_RAWNR_PARAM:
|
case RESULT_TYPE_GIC_PARAM:
|
case RESULT_TYPE_DEBAYER_PARAM:
|
case RESULT_TYPE_LDCH_PARAM:
|
case RESULT_TYPE_LUT3D_PARAM:
|
case RESULT_TYPE_DEHAZE_PARAM:
|
case RESULT_TYPE_AGAMMA_PARAM:
|
case RESULT_TYPE_ADEGAMMA_PARAM:
|
case RESULT_TYPE_WDR_PARAM:
|
case RESULT_TYPE_CSM_PARAM:
|
case RESULT_TYPE_CGC_PARAM:
|
case RESULT_TYPE_CONV422_PARAM:
|
case RESULT_TYPE_YUVCONV_PARAM:
|
case RESULT_TYPE_GAIN_PARAM:
|
case RESULT_TYPE_CP_PARAM:
|
case RESULT_TYPE_IE_PARAM:
|
case RESULT_TYPE_MOTION_PARAM:
|
isp_result_list.push_back(result);
|
break;
|
default:
|
dispatchResult(result);
|
break;
|
}
|
}
|
|
if (isp_result_list.size() > 0) {
|
handleIsp3aReslut(isp_result_list);
|
}
|
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::handleIsp3aReslut(cam3aResultList& list)
|
{
|
ENTER_CAMHW_FUNCTION();
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
if (_is_exit) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set 3a config bypass since ia engine has stop");
|
return XCAM_RETURN_BYPASS;
|
}
|
|
if (_state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_STOPPED ||
|
_state == CAM_HW_STATE_PAUSED) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "hdr-debug: %s: first set ispparams\n",
|
__func__);
|
if (!mIspParamsDev->is_activated()) {
|
ret = mIspParamsDev->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "prepare isp params dev err: %d\n", ret);
|
}
|
|
ret = hdr_mipi_prepare_mode(_hdr_mode);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
|
}
|
}
|
|
for (auto& result : list) {
|
result->setId(0);
|
mParamsAssembler->addReadyCondition(result->getType());
|
}
|
}
|
|
mParamsAssembler->queue(list);
|
|
// set all ready params to drv
|
while (_state == CAM_HW_STATE_STARTED &&
|
mParamsAssembler->ready()) {
|
if (setIspConfig() != XCAM_RETURN_NO_ERROR)
|
break;
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::dispatchResult(SmartPtr<cam3aResult> result)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
if (!result.ptr())
|
return XCAM_RETURN_ERROR_PARAM;
|
|
LOGD("%s enter, msg type(0x%x)", __FUNCTION__, result->getType());
|
switch (result->getType())
|
{
|
case RESULT_TYPE_EXPOSURE:
|
{
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "RESULT_TYPE_EXPOSURE");
|
SmartPtr<RkAiqExpParamsProxy> exp = result.dynamic_cast_ptr<RkAiqExpParamsProxy>();
|
ret = setExposureParams(exp);
|
if (ret)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setExposureParams error %d id %d", ret, result->getId());
|
break;
|
}
|
case RESULT_TYPE_AEC_PARAM:
|
case RESULT_TYPE_HIST_PARAM:
|
case RESULT_TYPE_AWB_PARAM:
|
case RESULT_TYPE_AWBGAIN_PARAM:
|
case RESULT_TYPE_AF_PARAM:
|
case RESULT_TYPE_DPCC_PARAM:
|
case RESULT_TYPE_MERGE_PARAM:
|
case RESULT_TYPE_TMO_PARAM:
|
case RESULT_TYPE_CCM_PARAM:
|
case RESULT_TYPE_LSC_PARAM:
|
case RESULT_TYPE_BLC_PARAM:
|
case RESULT_TYPE_RAWNR_PARAM:
|
case RESULT_TYPE_GIC_PARAM:
|
case RESULT_TYPE_DEBAYER_PARAM:
|
case RESULT_TYPE_LDCH_PARAM:
|
case RESULT_TYPE_LUT3D_PARAM:
|
case RESULT_TYPE_DEHAZE_PARAM:
|
case RESULT_TYPE_AGAMMA_PARAM:
|
case RESULT_TYPE_ADEGAMMA_PARAM:
|
case RESULT_TYPE_WDR_PARAM:
|
case RESULT_TYPE_CSM_PARAM:
|
case RESULT_TYPE_CGC_PARAM:
|
case RESULT_TYPE_CONV422_PARAM:
|
case RESULT_TYPE_YUVCONV_PARAM:
|
case RESULT_TYPE_GAIN_PARAM:
|
case RESULT_TYPE_CP_PARAM:
|
case RESULT_TYPE_IE_PARAM:
|
case RESULT_TYPE_MOTION_PARAM:
|
handleIsp3aReslut(result);
|
break;
|
case RESULT_TYPE_TNR_PARAM:
|
case RESULT_TYPE_YNR_PARAM:
|
case RESULT_TYPE_UVNR_PARAM:
|
case RESULT_TYPE_SHARPEN_PARAM:
|
case RESULT_TYPE_EDGEFLT_PARAM:
|
case RESULT_TYPE_FEC_PARAM:
|
case RESULT_TYPE_ORB_PARAM:
|
handlePpReslut(result);
|
break;
|
case RESULT_TYPE_FOCUS_PARAM:
|
{
|
SmartPtr<RkAiqFocusParamsProxy> focus = result.dynamic_cast_ptr<RkAiqFocusParamsProxy>();
|
ret = setFocusParams(focus);
|
if (ret)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setFocusParams error %d", ret);
|
break;
|
}
|
case RESULT_TYPE_IRIS_PARAM:
|
{
|
SmartPtr<RkAiqIrisParamsProxy> iris = result.dynamic_cast_ptr<RkAiqIrisParamsProxy>();
|
ret = setIrisParams(iris, _cur_calib_infos.aec.IrisType);
|
if (ret)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setIrisParams error %d", ret);
|
break;
|
}
|
case RESULT_TYPE_CPSL_PARAM:
|
{
|
SmartPtr<RkAiqCpslParamsProxy> cpsl = result.dynamic_cast_ptr<RkAiqCpslParamsProxy>();
|
ret = setCpslParams(cpsl);
|
if (ret)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setCpslParams error %d", ret);
|
break;
|
}
|
case RESULT_TYPE_FLASH_PARAM:
|
{
|
#ifdef FLASH_CTL_DEBUG
|
SmartPtr<rk_aiq_flash_setting_t> flash = result.dynamic_cast_ptr<rk_aiq_flash_setting_t>();
|
ret = setFlParams(flash);
|
if (ret)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setFlParams error %d", ret);
|
#endif
|
break;
|
}
|
default:
|
LOGE("unknown param type(0x%x)!", result->getType());
|
break;
|
}
|
return ret;
|
LOGD("%s exit", __FUNCTION__);
|
}
|
|
XCamReturn CamHwIsp20::notify_sof(SmartPtr<VideoBuffer>& buf)
|
{
|
SmartPtr<SofEventBuffer> evtbuf = buf.dynamic_cast_ptr<SofEventBuffer>();
|
SmartPtr<SofEventData> evtdata = evtbuf->get_data();
|
SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
|
mSensorSubdev->handle_sof(evtdata->_timestamp, evtdata->_frameid);
|
mRawProcUnit->notify_sof(evtdata->_timestamp, evtdata->_frameid);
|
if (mLensSubdev.ptr())
|
mLensSubdev->handle_sof(evtdata->_timestamp, evtdata->_frameid);
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
XCamReturn
|
CamHwIsp20::handleIsp3aReslut(SmartPtr<cam3aResult> &result)
|
{
|
ENTER_CAMHW_FUNCTION();
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
if (_is_exit) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set 3a config bypass since ia engine has stop");
|
return XCAM_RETURN_BYPASS;
|
}
|
|
if (_state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_STOPPED ||
|
_state == CAM_HW_STATE_PAUSED) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "hdr-debug: %s: first set ispparams id[%d]\n",
|
__func__, result->getId());
|
if (!mIspParamsDev->is_activated()) {
|
ret = mIspParamsDev->start();
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "prepare isp params dev err: %d\n", ret);
|
}
|
|
ret = hdr_mipi_prepare_mode(_hdr_mode);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
|
}
|
}
|
|
mParamsAssembler->addReadyCondition(result->getType());
|
}
|
|
mParamsAssembler->queue(result);
|
|
// set all ready params to drv
|
while (_state == CAM_HW_STATE_STARTED &&
|
mParamsAssembler->ready()) {
|
if (setIspConfig() != XCAM_RETURN_NO_ERROR)
|
break;
|
}
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
void
|
CamHwIsp20::analyzePpInitEns(SmartPtr<cam3aResult> &result)
|
{
|
if (result->getType() == RESULT_TYPE_TNR_PARAM) {
|
// TODO: tnr init_ens should be always on ?
|
SmartPtr<RkAiqIspTnrParamsProxy> tnr = nullptr;
|
tnr = result.dynamic_cast_ptr<RkAiqIspTnrParamsProxy>();
|
if (tnr.ptr()) {
|
rk_aiq_isp_tnr_t& tnr_param = tnr->data()->result;
|
if(tnr_param.tnr_en) {
|
if (tnr_param.mode > 0)
|
mPpModuleInitEns |= ISPP_MODULE_TNR_3TO1;
|
else
|
mPpModuleInitEns |= ISPP_MODULE_TNR;
|
|
} else {
|
mPpModuleInitEns &= ~ISPP_MODULE_TNR_3TO1;
|
}
|
}
|
} else if (result->getType() == RESULT_TYPE_FEC_PARAM) {
|
SmartPtr<RkAiqIspFecParamsProxy> fec = nullptr;
|
fec = result.dynamic_cast_ptr<RkAiqIspFecParamsProxy>();
|
if (fec.ptr()) {
|
rk_aiq_isp_fec_t& fec_param = fec->data()->result;
|
if(fec_param.fec_en) {
|
if (fec_param.usage == ISPP_MODULE_FEC_ST) {
|
mPpModuleInitEns |= ISPP_MODULE_FEC_ST;
|
} else if (fec_param.usage == ISPP_MODULE_FEC) {
|
mPpModuleInitEns |= ISPP_MODULE_FEC;
|
}
|
} else {
|
mPpModuleInitEns &= ~ISPP_MODULE_FEC_ST;
|
}
|
}
|
} else if (result->getType() == RESULT_TYPE_EDGEFLT_PARAM ||
|
result->getType() == RESULT_TYPE_YNR_PARAM ||
|
result->getType() == RESULT_TYPE_UVNR_PARAM ||
|
result->getType() == RESULT_TYPE_SHARPEN_PARAM) {
|
// TODO: nr,sharp init_ens always on ?
|
mPpModuleInitEns |= ISPP_MODULE_SHP | ISPP_MODULE_NR;
|
} else if (result->getType() == RESULT_TYPE_ORB_PARAM) {
|
SmartPtr<RkAiqIspOrbParamsProxy> orb = nullptr;
|
orb = result.dynamic_cast_ptr<RkAiqIspOrbParamsProxy>();
|
if (orb.ptr()) {
|
rk_aiq_isp_orb_t& orb_param = orb->data()->result;
|
if(orb_param.orb_en)
|
mPpModuleInitEns |= ISPP_MODULE_ORB;
|
else
|
mPpModuleInitEns &= ~ISPP_MODULE_ORB;
|
}
|
}
|
}
|
|
XCamReturn
|
CamHwIsp20::handlePpReslut(SmartPtr<cam3aResult> &result)
|
{
|
ENTER_CAMHW_FUNCTION();
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
if (_is_exit) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "set pp config bypass since ia engine has stop");
|
return XCAM_RETURN_BYPASS;
|
}
|
|
if (_state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_STOPPED ||
|
_state == CAM_HW_STATE_PAUSED) {
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "RKISPP_CMD_SET_INIT_MODULE");
|
analyzePpInitEns(result);
|
if (_ispp_sd->io_control(RKISPP_CMD_SET_INIT_MODULE, &mPpModuleInitEns))
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISPP_CMD_SET_INIT_MODULE ioctl failed");
|
}
|
setPpConfig(result);
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setIspConfig()
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
ENTER_CAMHW_FUNCTION();
|
|
SmartPtr<V4l2Buffer> v4l2buf;
|
uint32_t frameId = -1;
|
{
|
SmartLock locker (_isp_params_cfg_mutex);
|
while (_effecting_ispparam_map.size() > 4)
|
_effecting_ispparam_map.erase(_effecting_ispparam_map.begin());
|
}
|
if (mIspParamsDev.ptr()) {
|
ret = mIspParamsDev->get_buffer(v4l2buf);
|
if (ret) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Can not get isp params buffer \n");
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
} else
|
return XCAM_RETURN_BYPASS;
|
|
cam3aResultList ready_results;
|
ret = mParamsAssembler->deQueOne(ready_results, frameId);
|
if (ret != XCAM_RETURN_NO_ERROR) {
|
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque isp ready parameter failed\n");
|
mIspParamsDev->return_buffer_to_pool (v4l2buf);
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
LOGD_ANALYZER("----------%s, start config id(%d)'s isp params", __FUNCTION__, frameId);
|
|
struct isp2x_isp_params_cfg update_params;
|
|
update_params.module_en_update = 0;
|
update_params.module_ens = 0;
|
update_params.module_cfg_update = 0;
|
if (_state == CAM_HW_STATE_STOPPED || _state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_PAUSED) {
|
// update all ens
|
_full_active_isp_params.module_en_update = ~0;
|
// just re-config the enabled moddules
|
_full_active_isp_params.module_cfg_update = _full_active_isp_params.module_ens;
|
} else {
|
_full_active_isp_params.module_en_update = 0;
|
// use module_ens to store module status, so we can use it to restore
|
// the init params for re-start and re-prepare
|
/* _full_active_isp_params.module_ens = 0; */
|
_full_active_isp_params.module_cfg_update = 0;
|
}
|
|
// merge all pending params
|
|
#if 0 // TODO: compatible with the following cases
|
if (mIspSpThread.ptr()) {
|
rk_aiq_isp_other_params_v20_t* isp20_other_result =
|
static_cast<rk_aiq_isp_other_params_v20_t*>(aiqIspOtherResult->data().ptr());
|
mIspSpThread->update_motion_detection_params(&isp20_other_result->motion);
|
}
|
|
ret = convertAiqMeasResultsToIspParams((void*)&update_params, aiqIspMeasResult, aiqIspOtherResult, _lastAiqIspMeasResult);
|
if (ret != XCAM_RETURN_NO_ERROR) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "rkisp1_convert_results error\n");
|
}
|
|
forceOverwriteAiqIspCfg(update_params, aiqIspMeasResult, aiqIspOtherResult);
|
#else
|
ret = overrideExpRatioToAiqResults(frameId, RK_ISP2X_HDRTMO_ID, ready_results, _hdr_mode);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "TMO convertExpRatioToAiqResults error!\n");
|
}
|
|
ret = overrideExpRatioToAiqResults(frameId, RK_ISP2X_HDRMGE_ID, ready_results, _hdr_mode);
|
if (ret < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "MERGE convertExpRatioToAiqResults error!\n");
|
}
|
|
if (frameId >= 0) {
|
SmartPtr<cam3aResult> awb_res = get_3a_module_result(ready_results, RESULT_TYPE_AWB_PARAM);
|
SmartPtr<RkAiqIspAwbParamsProxy> awbParams;
|
if (awb_res.ptr()) {
|
awbParams = awb_res.dynamic_cast_ptr<RkAiqIspAwbParamsProxy>();
|
{
|
SmartLock locker (_isp_params_cfg_mutex);
|
_effecting_ispparam_map[frameId].awb_cfg = awbParams->data()->result;
|
}
|
} else {
|
SmartLock locker (_isp_params_cfg_mutex);
|
/* use the latest */
|
if (!_effecting_ispparam_map.empty()) {
|
_effecting_ispparam_map[frameId].awb_cfg = (_effecting_ispparam_map.rbegin())->second.awb_cfg;
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "use frame %d awb params for frame %d !\n",
|
frameId, (_effecting_ispparam_map.rbegin())->first);
|
} else {
|
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get awb params from 3a result failed for frame %d !\n", frameId);
|
}
|
}
|
}
|
|
if (merge_isp_results(ready_results, &update_params) != XCAM_RETURN_NO_ERROR)
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "ISP parameter translation error\n");
|
#endif
|
uint64_t module_en_update_partial = 0;
|
uint64_t module_cfg_update_partial = 0;
|
gen_full_isp_params(&update_params, &_full_active_isp_params,
|
&module_en_update_partial, &module_cfg_update_partial);
|
|
if (_state == CAM_HW_STATE_STOPPED)
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispparam ens 0x%llx, en_up 0x%llx, cfg_up 0x%llx",
|
_full_active_isp_params.module_ens,
|
_full_active_isp_params.module_en_update,
|
_full_active_isp_params.module_cfg_update);
|
|
#ifdef RUNTIME_MODULE_DEBUG
|
_full_active_isp_params.module_en_update &= ~g_disable_isp_modules_en;
|
_full_active_isp_params.module_ens |= g_disable_isp_modules_en;
|
_full_active_isp_params.module_cfg_update &= ~g_disable_isp_modules_cfg_update;
|
module_en_update_partial = _full_active_isp_params.module_en_update;
|
module_cfg_update_partial = _full_active_isp_params.module_cfg_update;
|
#endif
|
// dump_isp_config(&_full_active_isp_params, aiqIspMeasResult, aiqIspOtherResult);
|
|
{
|
SmartLock locker (_isp_params_cfg_mutex);
|
if (frameId < 0) {
|
_effecting_ispparam_map[0].isp_params = _full_active_isp_params;
|
} else {
|
_effecting_ispparam_map[frameId].isp_params = _full_active_isp_params;
|
}
|
}
|
if (v4l2buf.ptr()) {
|
struct isp2x_isp_params_cfg* isp_params;
|
int buf_index = v4l2buf->get_buf().index;
|
|
isp_params = (struct isp2x_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
|
*isp_params = _full_active_isp_params;
|
isp_params->module_en_update = module_en_update_partial;
|
isp_params->module_cfg_update = module_cfg_update_partial;
|
//TODO: isp driver has bug now, lsc cfg_up should be set along with
|
//en_up
|
if (isp_params->module_cfg_update & ISP2X_MODULE_LSC)
|
isp_params->module_en_update |= ISP2X_MODULE_LSC;
|
isp_params->frame_id = frameId;
|
|
SmartPtr<SensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<SensorHw>();
|
if (mSensorSubdev.ptr()) {
|
memset(&isp_params->exposure, 0, sizeof(isp_params->exposure));
|
SmartPtr<RkAiqExpParamsProxy> expParam;
|
|
if (mSensorSubdev->getEffectiveExpParams(expParam, frameId) < 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "frame_id(%d), get exposure failed!!!\n", frameId);
|
} else {
|
if (RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode) == RK_AIQ_WORKING_MODE_NORMAL) {
|
isp_params->exposure.linear_exp.analog_gain_code_global = \
|
expParam->data()->aecExpInfo.LinearExp.exp_sensor_params.analog_gain_code_global;
|
isp_params->exposure.linear_exp.coarse_integration_time = \
|
expParam->data()->aecExpInfo.LinearExp.exp_sensor_params.coarse_integration_time;
|
} else {
|
isp_params->exposure.hdr_exp[0].analog_gain_code_global = \
|
expParam->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global;
|
isp_params->exposure.hdr_exp[0].coarse_integration_time = \
|
expParam->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time;
|
isp_params->exposure.hdr_exp[1].analog_gain_code_global = \
|
expParam->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global;
|
isp_params->exposure.hdr_exp[1].coarse_integration_time = \
|
expParam->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time;
|
isp_params->exposure.hdr_exp[2].analog_gain_code_global = \
|
expParam->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global;
|
isp_params->exposure.hdr_exp[2].coarse_integration_time = \
|
expParam->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time;
|
}
|
}
|
}
|
|
if (mIspParamsDev->queue_buffer (v4l2buf) != 0) {
|
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISP1: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n",
|
buf_index, errno, strerror(errno));
|
mIspParamsDev->return_buffer_to_pool (v4l2buf);
|
return XCAM_RETURN_ERROR_IOCTL;
|
}
|
|
ispModuleEns = _full_active_isp_params.module_ens;
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispparam ens 0x%llx, en_up 0x%llx, cfg_up 0x%llx",
|
_full_active_isp_params.module_ens,
|
isp_params->module_en_update,
|
isp_params->module_cfg_update);
|
|
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) queue buffer index %d, queue cnt %d, check exit status again[exit: %d]",
|
XCAM_STR (mIspParamsDev->get_device_name()),
|
buf_index, mIspParamsDev->get_queued_bufcnt(), _is_exit);
|
if (_is_exit)
|
return XCAM_RETURN_BYPASS;
|
} else
|
return XCAM_RETURN_BYPASS;
|
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn
|
CamHwIsp20::setPpConfig(SmartPtr<cam3aResult> &result)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
ENTER_CAMHW_FUNCTION();
|
if (result->getType() == RESULT_TYPE_TNR_PARAM) {
|
ret = mTnrStreamProcUnit->config_params(result->getId(), result);
|
} else if (result->getType() == RESULT_TYPE_FEC_PARAM)
|
ret = mFecParamStream->config_params(result->getId(), result);
|
else if (result->getType() == RESULT_TYPE_EDGEFLT_PARAM ||
|
result->getType() == RESULT_TYPE_YNR_PARAM ||
|
result->getType() == RESULT_TYPE_UVNR_PARAM ||
|
result->getType() == RESULT_TYPE_SHARPEN_PARAM ||
|
result->getType() == RESULT_TYPE_ORB_PARAM) {
|
ret = mNrStreamProcUnit->config_params(result->getId(), result);
|
}
|
EXIT_CAMHW_FUNCTION();
|
return ret;
|
}
|
|
SmartPtr<cam3aResult>
|
CamHwIsp20::get_3a_module_result (cam3aResultList &results, int32_t type)
|
{
|
cam3aResultList::iterator i_res = results.begin();
|
SmartPtr<cam3aResult> res;
|
|
auto it = std::find_if(
|
results.begin(), results.end(),
|
[&](const SmartPtr<cam3aResult> &r) { return type == r->getType(); });
|
if (it != results.end()) {
|
res = *it;
|
}
|
|
return res;
|
}
|
|
XCamReturn CamHwIsp20::get_stream_format(rkaiq_stream_type_t type, struct v4l2_format &format)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
switch (type)
|
{
|
case RKISP20_STREAM_MIPITX_S:
|
case RKISP20_STREAM_MIPITX_M:
|
case RKISP20_STREAM_MIPITX_L:
|
{
|
memset(&format, 0, sizeof(format));
|
ret = mRawCapUnit->get_tx_device(0)->get_format(format);
|
break;
|
}
|
case RKISP20_STREAM_SP:
|
case RKISP20_STREAM_NR:
|
{
|
struct v4l2_subdev_format isp_fmt;
|
isp_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
isp_fmt.pad = 2;
|
ret = mIspCoreDev->getFormat(isp_fmt);
|
if (ret == XCAM_RETURN_NO_ERROR) {
|
SmartPtr<BaseSensorHw> sensorHw;
|
sensorHw = mSensorDev.dynamic_cast_ptr<BaseSensorHw>();
|
format.fmt.pix.width = isp_fmt.format.width;
|
format.fmt.pix.height = isp_fmt.format.height;
|
format.fmt.pix.pixelformat = get_v4l2_pixelformat(isp_fmt.format.code);
|
}
|
break;
|
}
|
default:
|
ret = XCAM_RETURN_ERROR_PARAM;
|
break;
|
}
|
return ret;
|
}
|
|
XCamReturn CamHwIsp20::get_sp_resolution(int &width, int &height, int &aligned_w, int &aligned_h)
|
{
|
return mSpStreamUnit->get_sp_resolution(width, height, aligned_w, aligned_h);
|
}
|
|
}; //namspace RkCam
|