android13/external/camera_engine_rkaiq/hwi/isp20/CamHwIsp20.cpp

6378 lines
224 KiB
C++

/*
* 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 "PdafStreamProcUnit.h"
#include "CaptureRawData.h"
#include "code_to_pixel_format.h"
#include "RkAiqCalibDbV2.h"
#include "IspParamsSplitter.h"
#include "rkisp21-config.h"
#include "rkisp3-config.h"
#include "rkisp32-config.h"
#include "isp3x/Isp3xParams.h"
namespace RkCam {
std::unordered_map<std::string, SmartPtr<rk_aiq_static_info_t>> CamHwIsp20::mCamHwInfos;
std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>> CamHwIsp20::mSensorHwInfos;
std::unordered_map<std::string, std::string> CamHwIsp20::mFakeCameraName;
rk_aiq_isp_hw_info_t CamHwIsp20::mIspHwInfos;
rk_aiq_cif_hw_info_t CamHwIsp20::mCifHwInfos;
bool CamHwIsp20::mIsMultiIspMode = false;
uint16_t CamHwIsp20::mMultiIspExtendedPixel = 0;
#ifdef ISP_HW_V30
#define CAMHWISP_EFFECT_ISP_POOL_NUM 12
#else
#define CAMHWISP_EFFECT_ISP_POOL_NUM 6
#endif
// TODO: Sync 1608 sensor start streaming
XCam::Mutex CamHwIsp20::_sync_1608_mutex;
bool CamHwIsp20::_sync_1608_done = false;
// TODO: Init static struct.
sensor_info_share_t CamHwIsp20::rk1608_share_inf{};
CamHwIsp20::CamHwIsp20()
: _hdr_mode(0)
, _state(CAM_HW_STATE_INVALID)
, _is_exit(false)
, _linked_to_isp(false)
, _linked_to_1608(false)
#if defined(ISP_HW_V20)
, _ispp_module_init_ens(0)
#endif
, _sharp_fbc_rotation(RK_AIQ_ROTATION_0)
{
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);
xcam_mem_clear(_cac_drv_mem_ctx);
xcam_mem_clear(fec_mem_info_array);
xcam_mem_clear(ldch_mem_info_array);
xcam_mem_clear(cac_mem_info_array);
xcam_mem_clear(_dbg_drv_mem_ctx);
xcam_mem_clear(dbg_mem_info_array);
_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);
_cac_drv_mem_ctx.type = MEM_TYPE_CAC;
_cac_drv_mem_ctx.ops_ctx = this;
_cac_drv_mem_ctx.mem_info = (void*)(cac_mem_info_array);
_dbg_drv_mem_ctx.type = MEM_TYPE_DBG_INFO;
_dbg_drv_mem_ctx.ops_ctx = this;
_dbg_drv_mem_ctx.mem_info = (void*)(dbg_mem_info_array);
xcam_mem_clear(_crop_rect);
#ifndef DISABLE_PARAMS_ASSEMBLER
mParamsAssembler = new IspParamsAssembler("ISP_PARAMS_ASSEMBLER");
#endif
mVicapIspPhyLinkSupported = false;
mIspStremEvtTh = NULL;
mIsGroupMode = false;
mIsMain = false;
_isp_stream_status = ISP_STREAM_STATUS_INVALID;
mEffectIspParamsPool = new RkAiqIspEffParamsPool("ISP_EFF", CAMHWISP_EFFECT_ISP_POOL_NUM);
_curIspParamsSeq = 0;
userSensorWidth = 0;
userSensorHeight = 0;
userSensorFmtCode = 0;
}
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;
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
std::vector<uint32_t> formats;
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) {
LOGW_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;
}
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstringop-truncation"
#endif
#if defined(ISP_HW_V20)
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 defined(ISP_HW_V30)
// parse driver pattern: soc:rkisp0-vir0
int model_idx = -1;
char* rkispp = strstr(device->info.driver, "rkispp");
if (rkispp) {
int ispp_idx = atoi(rkispp + strlen("rkispp"));
char* vir = strstr(device->info.driver, "vir");
if (vir) {
int vir_idx = atoi(vir + strlen("vir"));
model_idx = ispp_idx * 4 + vir_idx;
}
}
if (model_idx == -1) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wrong ispp media driver info: %s", device->info.driver);
return NULL;
}
ispp_info[index].model_idx = model_idx;
#else
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;
#endif
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];
}
#endif
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)) {
isp_info[index].logic_id = index;
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 defined(ISP_HW_V30)
// parse driver pattern: soc:rkisp0-vir0
int model_idx = -1;
char* rkisp = strstr(device->info.driver, "rkisp");
if (rkisp) {
char* str_unite = NULL;
str_unite = strstr(device->info.driver, "unite");
if (str_unite) {
model_idx = 0;
} else {
int isp_idx = atoi(rkisp + strlen("rkisp"));
char* vir = strstr(device->info.driver, "vir");
if (vir) {
int vir_idx = atoi(vir + strlen("vir"));
model_idx = isp_idx * 4 + vir_idx;
isp_info[index].phy_id = isp_idx;
}
}
}
if (model_idx == -1) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wrong isp media driver info: %s", device->info.driver);
return NULL;
}
isp_info[index].model_idx = model_idx;
#else
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;
#endif
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;
else
isp_info[index].linked_dvp = false;
entity = media_get_entity_by_name(device, "rkcif-dvp", strlen("rkcif-dvp"));
if(entity)
isp_info[index].linked_dvp = true;
else
isp_info[index].linked_dvp = false;
const char* linked_entity_name_strs[] = {
"rkcif-dvp",
"rkcif_dvp",
"rkcif_lite_mipi_lvds",
"rkcif_mipi_lvds",
"rkcif_mipi_lvds1",
"rkcif_mipi_lvds2",
"rkcif_mipi_lvds3",
"rkcif_mipi_lvds4",
"rkcif_mipi_lvds5",
"rkcif-mipi-lvds",
"rkcif-mipi-lvds1",
"rkcif-mipi-lvds2",
"rkcif-mipi-lvds3",
"rkcif-mipi-lvds4",
"rkcif-mipi-lvds5",
NULL
};
int vicap_idx = 0;
for (int i = 0; linked_entity_name_strs[i] != NULL; i++) {
entity = media_get_entity_by_name(device, linked_entity_name_strs[i], strlen(linked_entity_name_strs[i]));
if (entity) {
strncpy(isp_info[index].linked_vicap[vicap_idx], entity->info.name, sizeof(isp_info[index].linked_vicap[vicap_idx]));
isp_info[index].linked_sensor = true;
if (vicap_idx++ >= MAX_ISP_LINKED_VICAP_CNT) {
break;
}
}
}
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) - 1);
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
entity = media_get_entity_by_name(device, "rkcif_scale_ch0", strlen("rkcif_scale_ch0"));
if(entity) {
entity_name = media_entity_get_devname (entity);
if(entity_name) {
strncpy(cif_info[index].mipi_scl0, entity_name, sizeof(cif_info[index].mipi_scl0) - 1);
}
}
entity = media_get_entity_by_name(device, "rkcif_scale_ch1", strlen("rkcif_scale_ch1"));
if(entity) {
entity_name = media_entity_get_devname (entity);
if(entity_name) {
strncpy(cif_info[index].mipi_scl1, entity_name, sizeof(cif_info[index].mipi_scl1) - 1);
}
}
entity = media_get_entity_by_name(device, "rkcif_scale_ch2", strlen("rkcif_scale_ch2"));
if(entity) {
entity_name = media_entity_get_devname (entity);
if(entity_name) {
strncpy(cif_info[index].mipi_scl2, entity_name, sizeof(cif_info[index].mipi_scl2) - 1);
}
}
entity = media_get_entity_by_name(device, "rkcif_scale_ch3", strlen("rkcif_scale_ch3"));
if(entity) {
entity_name = media_entity_get_devname (entity);
if(entity_name) {
strncpy(cif_info[index].mipi_scl3, entity_name, sizeof(cif_info[index].mipi_scl3) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
}
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) - 1);
}
} 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) - 1);
}
}
}
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) - 1);
}
}
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) - 1);
}
}
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;
}
if (finfo->module_index_str.size()) {
sinfo->phyId = atoi(finfo->module_index_str.c_str() + 1);
} else {
sinfo->phyId = -1;
}
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;
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);
auto it = CamHwIsp20::mSensorHwInfos.find(str);
if (it == 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.json",
sensor_name_full, module_name, lens_name);
} else {
sprintf(iqfile_name, "%s.json", sensor_name_full);
}
return XCAM_RETURN_NO_ERROR;
}
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
rk_aiq_static_info_t*
CamHwIsp20::getStaticCamHwInfoByPhyId(const char* sns_ent_name, uint16_t index)
{
if (sns_ent_name) {
std::string str(sns_ent_name);
auto 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 {
std::string index_str{"m"};
if (index < 10) {
index_str.append("0");
}
index_str.append(std::to_string(index));
auto it = std::find_if(
std::begin(mCamHwInfos), std::end(mCamHwInfos),
[&](const std::pair<std::string, SmartPtr<rk_aiq_static_info_t>>& info) -> bool {
return !info.first.compare(0, 3, index_str);
});
if (it != mCamHwInfos.end()) {
return it->second.ptr();
}
}
return NULL;
}
rk_aiq_static_info_t*
CamHwIsp20::getStaticCamHwInfo(const char* sns_ent_name, uint16_t index)
{
if (sns_ent_name) {
std::string str(sns_ent_name);
auto 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 < mCamHwInfos.size()) {
int i = 0;
for (auto it = mCamHwInfos.begin(); it != mCamHwInfos.end(); it++, i++) {
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;
int 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);
if (!device) {
continue;
}
/* 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) {
#if defined(ISP_HW_V20)
rk_aiq_ispp_t* ispp_info = get_ispp_subdevs(device, sys_path, CamHwIsp20::mIspHwInfos.ispp_info);
if (ispp_info)
ispp_info->valid = true;
#endif
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);
if (strstr(device->info.driver, "rkisp-unite")) {
isp_info->is_multi_isp_mode = true;
mIsMultiIspMode = true;
mMultiIspExtendedPixel = RKMOUDLE_UNITE_EXTEND_PIXEL;
} else {
isp_info->is_multi_isp_mode = false;
mIsMultiIspMode = false;
mMultiIspExtendedPixel = 0;
}
isp_info->valid = true;
} else if (strcmp(device->info.model, "rkcif") == 0 ||
strcmp(device->info.model, "rkcif-dvp") == 0 ||
strcmp(device->info.model, "rkcif_dvp") == 0 ||
strstr(device->info.model, "rkcif_mipi_lvds") ||
strstr(device->info.model, "rkcif-mipi-lvds") ||
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 || 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)) {
if (strstr(entity_info->name, "1608")) {
// [baron] skip psy-sensor(m_09_RK1608Dphy), save cif inf addr.
if (cif_info) {
CamHwIsp20::rk1608_share_inf.reference_mipi_cif = cif_info;
}
continue;
}
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) - 1);
devpath[sizeof(devpath) - 1] = '\0';
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;
// [baron] add flag for 1608 sensor
s_full_info->linked_to_1608 = false;
info->_is_1608_sensor = false;
} else if (isp_info) {
s_full_info->linked_to_isp = true;
isp_info->linked_sensor = true;
isp_info->isMultiplex = false;
s_full_info->isp_info = isp_info;
#if defined(ISP_HW_V30)
// FIXME: Just support isp3x(rk3588-8/9camera).
for (int vi_idx = 0; vi_idx < MAX_ISP_LINKED_VICAP_CNT; vi_idx++) {
if (strlen(isp_info->linked_vicap[vi_idx]) > 0) {
strcpy(CamHwIsp20::rk1608_share_inf.reference_name, isp_info->linked_vicap[vi_idx]);
s_full_info->cif_info = CamHwIsp20::rk1608_share_inf.reference_mipi_cif;
info->_is_1608_sensor = true;
s_full_info->linked_to_1608 = true;
}
}
#endif
} else {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "sensor device mount error!\n");
}
#if 0
printf(" >>>>>>>>> sensor(%s): cif addr(%p), link_to_1608[%d], share_vi(%s)\n",
entity_info->name,
s_full_info->cif_info,
s_full_info->linked_to_1608,
CamHwIsp20::rk1608_share_inf.reference_name
);
#endif
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;
if (s_full_info->isp_info)
info->is_multi_isp_mode = s_full_info->isp_info->is_multi_isp_mode;
info->multi_isp_extended_pixel = mMultiIspExtendedPixel;
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "Init sensor %s with Multi-ISP Mode:%d Extended Pixels:%d ",
s_full_info->sensor_name.c_str(), info->is_multi_isp_mode,
info->multi_isp_extended_pixel);
CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = info;
}
}
media_unref:
media_device_unref (device);
}
#if defined(ISP_HW_V30)
// judge isp if multiplex by multiple cams
rk_aiq_isp_t* isp_info = NULL;
for (i = 0; i < MAX_CAM_NUM; i++) {
isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
if (isp_info->valid) {
for (j = i - 1; j >= 0; j--) {
if (isp_info->phy_id == CamHwIsp20::mIspHwInfos.isp_info[j].phy_id) {
isp_info->isMultiplex = true;
CamHwIsp20::mIspHwInfos.isp_info[j].isMultiplex = true;
}
}
}
}
#endif
std::unordered_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];
for (int vicap_idx = 0; vicap_idx < MAX_ISP_LINKED_VICAP_CNT; vicap_idx++) {
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "vicap %s, linked_vicap %s",
s_full_info->cif_info->model_str, isp_info->linked_vicap[vicap_idx]);
if (strcmp(s_full_info->cif_info->model_str, isp_info->linked_vicap[vicap_idx]) == 0) {
s_full_info->isp_info = &CamHwIsp20::mIspHwInfos.isp_info[i];
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]->is_multi_isp_mode =
s_full_info->isp_info->is_multi_isp_mode;
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name]
->multi_isp_extended_pixel = mMultiIspExtendedPixel;
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;
}
}
}
}
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 < MAX_CAM_NUM; 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];
if (CamHwIsp20::mIspHwInfos.ispp_info[i].valid) {
fullinfo->ispp_info = &CamHwIsp20::mIspHwInfos.ispp_info[i];
hwinfo->sensor_info.binded_strm_media_idx =
atoi(fullinfo->ispp_info->media_dev_path + strlen("/dev/media"));
}
fullinfo->media_node_index = -1;
fullinfo->device_name = std::string("/dev/null");
fullinfo->sensor_name = std::string("FakeCamera");
fullinfo->sensor_name += std::to_string(i);
fullinfo->parent_media_dev = std::string("/dev/null");
fullinfo->linked_to_isp = true;
hwinfo->sensor_info.support_fmt[0].hdr_mode = NO_HDR;
hwinfo->sensor_info.support_fmt[1].hdr_mode = HDR_X2;
hwinfo->sensor_info.support_fmt[2].hdr_mode = HDR_X3;
hwinfo->sensor_info.num = 3;
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;
hwinfo->is_multi_isp_mode = fullinfo->isp_info->is_multi_isp_mode;
hwinfo->multi_isp_extended_pixel = mMultiIspExtendedPixel;
CamHwIsp20::mSensorHwInfos[fullinfo->sensor_name] = fullinfo;
CamHwIsp20::mCamHwInfos[fullinfo->sensor_name] = hwinfo;
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "fake camera %d link to isp(%d) to ispp(%d)\n",
i,
fullinfo->isp_info->model_idx,
fullinfo->ispp_info ? fullinfo->ispp_info->model_idx : -1);
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 ? fullinfo->ispp_info->media_dev_path : "null");
}
}
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::unordered_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;
// skip 1608-dphy 'sensor'
if (strstr(s_full_info->sensor_name.c_str(), "1608"))
continue;
if (!s_full_info->isp_info)
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
if ((strstr(s_full_info->sensor_name.c_str(), "FakeCamera") == NULL) &&
(strstr(s_full_info->sensor_name.c_str(), "_s_") == NULL)) {
FILE *fp = NULL;
struct media_device *device = NULL;
uint32_t 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];
snprintf (sys_path, 64, "/dev/media%d", s_full_info->media_node_index);
if (0 != access(sys_path, F_OK))
continue;
device = media_device_new (sys_path);
if (!device)
return nullptr;
/* 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);
} else
return s_full_info->sensor_name.c_str();
}
}
return NULL;
}
#if defined(ISP_HW_V20)
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;
}
#endif
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::unordered_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());
sensorHw->setCamPhyId(mCamPhyId);
mSensorDev = sensorHw;
mSensorDev->open();
sensorHw->setTbInfo (mTbInfo.is_pre_aiq);
Isp20Params::setCamPhyId(mCamPhyId);
strncpy(sns_name, sns_ent_name, sizeof(sns_name) - 1);
sns_name[sizeof(sns_name) - 1] = '\0';
// normal env.
if (s_info->linked_to_isp) {
_linked_to_isp = true;
_linked_to_1608 = false;
} else {
_linked_to_isp = false;
_linked_to_1608 = false;
}
// 1608 sensor env.
if (s_info->linked_to_1608) {
_linked_to_isp = false;
_linked_to_1608 = true;
// [baron] Record the number of use sensors(valid 1608 sensor)
CamHwIsp20::rk1608_share_inf.en_sns_num++;
}
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 defined(ISP_HW_V20) || defined(ISP_HW_V21)
else {
// af soft stats need this device on 356x 1126
lensHw = new LensHw(NULL);
mLensDev = lensHw;
}
#endif
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();
}
#if defined(ISP_HW_V20)
init_pp(s_info);
#endif
#if defined(RKAIQ_ENABLE_SPSTREAM)
mIspSpDev = new V4l2Device (s_info->isp_info->self_path);//rkisp_selfpath
mIspSpDev->open();
mSpStreamUnit = new SPStreamProcUnit(mIspSpDev, ISP_POLL_SP, mIspHwInfos.hw_ver_info.isp_ver);
mSpStreamUnit->set_devices(this, mIspCoreDev, _ispp_sd, mLensDev);
#endif
mPdafStreamUnit = new PdafStreamProcUnit(ISP_POLL_PDAF_STATS);
mPdafStreamUnit->set_devices(this);
#ifndef USE_RAWSTREAM_LIB
auto buf_it = std::find_if(
std::begin(mDevBufCntMap), std::end(mDevBufCntMap),
[&](const std::pair<std::string, int>& buf_cnt_map) {
return (
!buf_cnt_map.first.compare("rkraw_tx") || !buf_cnt_map.first.compare("rkraw_rx") ||
!buf_cnt_map.first.compare(0, sizeof("stream_cif_mipi_id"), "stream_cif_mipi_id") ||
!buf_cnt_map.first.compare(0, sizeof("rkisp_rawwr"), "rkisp_rawwr"));
});
int buf_cnt = 0;
if (buf_it != mDevBufCntMap.end()) {
buf_cnt = buf_it->second;
}
if (!_linked_to_1608) {
mRawCapUnit = new RawStreamCapUnit(s_info, _linked_to_isp, buf_cnt);
mRawProcUnit = new RawStreamProcUnit(s_info, _linked_to_isp, buf_cnt);
// set sensor stream flag.
mRawCapUnit->setSensorCategory(false);
mRawProcUnit->setSensorCategory(false);
} else {
// 1608 sensor
if (NULL == CamHwIsp20::rk1608_share_inf.raw_cap_unit.ptr()) {
// [baron] just new buffer in 1st.
mRawCapUnit = new RawStreamCapUnit(s_info, _linked_to_isp, buf_cnt);
CamHwIsp20::rk1608_share_inf.raw_cap_unit = mRawCapUnit;
}
mRawProcUnit = new RawStreamProcUnit(s_info, _linked_to_isp, buf_cnt);
if (mRawProcUnit.ptr()) {
// [baron] save multi rx addr for 1 tx.
CamHwIsp20::rk1608_share_inf.raw_proc_unit[mCamPhyId] = mRawProcUnit.ptr();
}
// update tx by bakeup tx.
mRawCapUnit = CamHwIsp20::rk1608_share_inf.raw_cap_unit;
mRawCapUnit->setSensorCategory(true);
mRawProcUnit->setSensorCategory(true);
}
mRawCapUnit->set_devices(mIspCoreDev, this, mRawProcUnit.ptr());
mRawProcUnit->set_devices(mIspCoreDev, this);
mRawCapUnit->setCamPhyId(mCamPhyId);
mRawProcUnit->setCamPhyId(mCamPhyId);
#endif
//cif scale
if (!_linked_to_isp && !_linked_to_1608) {
if (strlen(s_info->cif_info->mipi_scl0))
mCifScaleStream = new CifSclStream();
}
//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);
mIspStatsStream->setCamPhyId(mCamPhyId);
//luma
if (mIspLumaDev.ptr()) {
mLumaStream = new RKStream(mIspLumaDev, ISP_POLL_LUMA);
mLumaStream->setPollCallback (this);
}
#ifndef DISABLE_PARAMS_POLL_THREAD
//isp params
mIspParamStream = new RKStream(mIspParamsDev, ISP_POLL_PARAMS);
mIspParamStream->setCamPhyId(mCamPhyId);
mIspParamStream->setPollCallback (this);
#endif
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);
}
#if defined(ISP_HW_V20)
xcam_mem_clear (_full_active_ispp_params);
#endif
_state = CAM_HW_STATE_INITED;
EXIT_CAMHW_FUNCTION();
return XCAM_RETURN_NO_ERROR;
}
XCamReturn
CamHwIsp20::deInit()
{
if (mPdafStreamUnit.ptr())
mPdafStreamUnit->deinit();
if (mFlashLight.ptr())
mFlashLight->deinit();
if (mFlashLightIr.ptr())
mFlashLightIr->deinit();
std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t>>::iterator it;
if (strlen(sns_name) == 0 || (it = mSensorHwInfos.find(sns_name)) == mSensorHwInfos.end()) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "can't find sensor %s", strlen(sns_name) ? sns_name : "");
return XCAM_RETURN_ERROR_SENSOR;
}
rk_sensor_full_info_t *s_info = it->second.ptr();
int isp_index = s_info->isp_info->logic_id;
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);
}
{
// TODO: These parameters only deinited when the first sensor deinit!
if (CamHwIsp20::rk1608_share_inf.raw_cap_unit.ptr()) {
CamHwIsp20::rk1608_share_inf.raw_cap_unit = NULL;
for (int i = 0; i < CAM_INDEX_FOR_1608; i++) {
CamHwIsp20::rk1608_share_inf.raw_proc_unit[i] = NULL;
}
// [Stage 01] {init} <-> {deinit}.
CamHwIsp20::rk1608_share_inf.en_sns_num = 0; // last sensor valid!
CamHwIsp20::rk1608_share_inf.us_open_cnt = 0;
// [Stage 02] {Prepare} <-> {deinit}
CamHwIsp20::rk1608_share_inf.us_prepare_cnt = 0; // prepare stage use
}
CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId] = 1; // prepare stage use
}
_state = CAM_HW_STATE_INVALID;
if (strstr(sns_name, "_s_")) {
rawReproc_deInit(sns_name);
}
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
#ifndef DISABLE_PARAMS_ASSEMBLER
if (/*mNoReadBack*/true) {
if (buf->get_sequence() > 0)
mParamsAssembler->forceReady(buf->get_sequence() + 1);
// set all ready params to drv
while (_state == CAM_HW_STATE_STARTED &&
mParamsAssembler->ready()) {
if (setIspConfig() != XCAM_RETURN_NO_ERROR)
break;
}
}
#endif
} else if (buf->_buf_type == ISP_POLL_PARAMS) {
V4l2BufferProxy* v4lbuf = buf.get_cast_ptr<V4l2BufferProxy>();
struct isp2x_isp_params_cfg* data = (struct isp2x_isp_params_cfg*)(v4lbuf->get_v4l2_userptr());
static int frame_id0_cnt = 0;
if (mTbInfo.is_pre_aiq) {
if (data->frame_id == 0) {
++frame_id0_cnt;
}
LOGK_CAMHW("<TB> poll param id %d cnt %d", data->frame_id, frame_id0_cnt);
}
if (!mTbInfo.is_pre_aiq && frame_id0_cnt < 1) {
return XCAM_RETURN_NO_ERROR;
}
}
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;
int8_t bpp = 0;
pixFmt2Bpp(sns_v4l_pix_fmt, bpp);
#ifndef USE_RAWSTREAM_LIB
if (mIsMultiIspMode && !mNoReadBack) {
ret = mRawCapUnit->set_csi_mem_word_big_align(sns_sd_sel.r.width, sns_sd_sel.r.height,
sns_v4l_pix_fmt, bpp);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "tx set csi_mem_word_big_align failed!\n");
return ret;
}
ret = mRawProcUnit->set_csi_mem_word_big_align(sns_sd_sel.r.width, sns_sd_sel.r.height,
sns_v4l_pix_fmt, bpp);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "rx set csi_mem_word_big_align failed!\n");
return ret;
}
}
// TODO: set cif crop according to sensor crop bounds
if (!_linked_to_1608) {
mRawCapUnit->set_tx_format(sns_sd_sel, sns_v4l_pix_fmt);
} else {
// [baron] Only processed the first time
if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
// [baron] Timing issue, for 1608.
mRawCapUnit->set_tx_format(sns_sd_sel, sns_v4l_pix_fmt);
}
}
mRawProcUnit->set_rx_format(sns_sd_sel, sns_v4l_pix_fmt);
#endif
//set cif scale fmt
if (mCifScaleStream.ptr()) {
mCifScaleStream->set_format(sns_sd_sel, sns_v4l_pix_fmt, bpp);
}
// 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;
memset(&isp_src_fmt, 0, sizeof(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;
#ifndef USE_RAWSTREAM_LIB
if (!_linked_to_1608 || CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
mRawCapUnit->set_tx_format(sns_sd_fmt, sns_v4l_pix_fmt);
}
mRawProcUnit->set_rx_format(sns_sd_fmt, sns_v4l_pix_fmt);
#endif
// set scale fmt
if (mCifScaleStream.ptr()) {
int8_t bpp = 0;
pixFmt2Bpp(sns_v4l_pix_fmt, bpp);
mCifScaleStream->set_format(sns_sd_sel, sns_v4l_pix_fmt, bpp);
}
#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
BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
rk_aiq_exposure_sensor_descriptor sns_des;
if (mSensorSubdev->get_sensor_desc(&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
memset(&sns_sd_fmt, 0, sizeof(sns_sd_fmt));
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;
}
// with librkrawstream, usr may change raw image, such as crop or rotate.
// in this case, pipeline format is differ from sensor format.
if(userSensorWidth && userSensorHeight){
sns_sd_sel.r.width = userSensorWidth;
sns_sd_sel.r.height = userSensorHeight;
}
if(userSensorFmtCode){
sns_sd_fmt.format.code = userSensorFmtCode;
}
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);
#ifndef USE_RAWSTREAM_LIB
if (!_linked_to_1608) {
ret = mRawCapUnit->get_tx_device(0)->get_format(mipi_tx_fmt);
} else {
if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
ret = mRawCapUnit->get_tx_device(0)->get_format(mipi_tx_fmt);
}
}
#endif
mipi_tx_fmt.fmt.pix.width = _crop_rect.width;
mipi_tx_fmt.fmt.pix.height = _crop_rect.height;
#ifndef USE_RAWSTREAM_LIB
if (!_linked_to_1608) {
ret = mRawCapUnit->get_tx_device(0)->set_format(mipi_tx_fmt);
} else {
if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
ret = mRawCapUnit->get_tx_device(0)->set_format(mipi_tx_fmt);
}
}
#endif
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 defined(ISP_HW_V20)
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
// set sp format to NV12 as default
if (mIspSpDev.ptr()) {
struct v4l2_selection selection;
memset(&selection, 0, sizeof(selection));
selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
selection.target = V4L2_SEL_TGT_CROP;
selection.flags = 0;
selection.r.left = 0;
selection.r.top = 0;
selection.r.width = isp_src_fmt.format.width;
selection.r.height = isp_src_fmt.format.height;
ret = mIspSpDev->set_selection (selection);
struct v4l2_format fmt;
ret = mIspSpDev->get_format (fmt);
if (ret) {
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get mIspSpDev fmt failed !\n");
//return;
}
if (V4L2_PIX_FMT_FBCG == fmt.fmt.pix.pixelformat) {
mIspSpDev->set_format(/*isp_src_fmt.format.width*/1920,
/*isp_src_fmt.format.height*/1080,
V4L2_PIX_FMT_NV12,
V4L2_FIELD_NONE, 0);
}
}
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispp sd fmt info: %dx%d",
isp_src_fmt.format.width, isp_src_fmt.format.height);
#endif
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 pad of stream_cif_mipi_id0 failed!\n");
goto FAIL;
}
}
entity = media_get_entity_by_name(device, "stream_cif_dvp_id0", strlen("stream_cif_dvp_id0"));
if(entity) {
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
if (!sink_pad) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_dvp_id0 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 pad of stream_cif_mipi_id1 failed!\n");
goto FAIL;
}
}
entity = media_get_entity_by_name(device, "stream_cif_dvp_id1", strlen("stream_cif_dvp_id1"));
if(entity) {
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
if (!sink_pad) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_dvp_id1 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 pad of stream_cif_mipi_id2 failed!\n");
goto FAIL;
}
}
entity = media_get_entity_by_name(device, "stream_cif_dvp_id2", strlen("stream_cif_dvp_id2"));
if(entity) {
sink_pad = (media_pad *)media_entity_get_pad(entity, 0);
if (!sink_pad) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get pad of stream_cif_dvp_id2 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);
if (!device)
return XCAM_RETURN_ERROR_FAILED;
/* 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;
}
}
#if 0
entity = media_get_entity_by_name(device, mIspHwInfos.isp_info[isp_index].linked_vicap,
strlen(mIspHwInfos.isp_info[isp_index].linked_vicap));
if (entity) {
media_pad* linked_vicap_pad = (media_pad *)media_entity_get_pad(entity, 0);
if (linked_vicap_pad) {
if (enable) {
media_setup_link(device, linked_vicap_pad, sink_pad, 0);
} else {
media_setup_link(device, linked_vicap_pad, sink_pad, MEDIA_LNK_FL_ENABLED);
}
}
}
#endif
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();
BaseSensorHw* sensorHw;
sensorHw = mSensorDev.get_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(struct rkmodule_inf& mod_info)
{
ENTER_CAMHW_FUNCTION();
LensHw* lensHw = mLensDev.get_cast_ptr<LensHw>();
rk_aiq_lens_vcmcfg old_cfg, new_cfg;
int old_maxpos, new_maxpos;
XCamReturn ret = XCAM_RETURN_NO_ERROR;
if (lensHw) {
ret = lensHw->getLensVcmCfg(old_cfg);
if (ret != XCAM_RETURN_NO_ERROR)
return ret;
ret = lensHw->getLensVcmMaxlogpos(old_maxpos);
if (ret != XCAM_RETURN_NO_ERROR)
return ret;
CalibDbV2_Af_VcmCfg_t* vcmcfg = &_cur_calib_infos.af.vcmcfg;
float posture_diff = vcmcfg->posture_diff;
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 (vcmcfg->start_current == -1 && vcmcfg->rated_current == -1 && vcmcfg->step_mode == -1) {
if (mod_info.af.flag) {
new_cfg.start_ma = mod_info.af.af_otp[0].vcm_start;
new_cfg.rated_ma = mod_info.af.af_otp[0].vcm_end;
if (posture_diff != 0) {
int range = new_cfg.rated_ma - new_cfg.start_ma;
int start_ma = new_cfg.start_ma;
int rated_ma = new_cfg.rated_ma;
new_cfg.start_ma = start_ma - (int)(range * posture_diff);
new_cfg.rated_ma = rated_ma + (int)(range * posture_diff);
LOGD_AF("posture_diff %f, start_ma %d -> %d, rated_ma %d -> %d",
posture_diff, start_ma, new_cfg.start_ma, rated_ma, new_cfg.rated_ma);
}
}
}
if ((new_cfg.start_ma != old_cfg.start_ma) ||
(new_cfg.rated_ma != old_cfg.rated_ma) ||
(new_cfg.step_mode != old_cfg.step_mode)) {
ret = lensHw->setLensVcmCfg(new_cfg);
}
new_maxpos = old_maxpos;
if (vcmcfg->max_logical_pos > 0) {
new_maxpos = vcmcfg->max_logical_pos;
}
if (old_maxpos != new_maxpos) {
ret = lensHw->setLensVcmMaxlogpos(new_maxpos);
}
}
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::get_sensor_pdafinfo(rk_sensor_full_info_t *sensor_info,
rk_sensor_pdaf_info_t *pdaf_info) {
XCamReturn ret = XCAM_RETURN_NO_ERROR;
struct rkmodule_channel_info channel;
memset(&channel, 0, sizeof(struct rkmodule_channel_info));
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;
}
pdaf_info->pdaf_support = false;
for (int i = 0; i < 4; i++) {
channel.index = i;
if (vdev.io_control(RKMODULE_GET_CHANNEL_INFO, &channel) == 0) {
if (channel.bus_fmt == MEDIA_BUS_FMT_SPD_2X8) {
pdaf_info->pdaf_support = true;
pdaf_info->pdaf_vc = i;
pdaf_info->pdaf_code = channel.bus_fmt;
pdaf_info->pdaf_width = channel.width;
pdaf_info->pdaf_height = channel.height;
if (channel.data_bit == 10)
pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB10;
else if (channel.data_bit == 12)
pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB12;
else if (channel.data_bit == 8)
pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB8;
else
pdaf_info->pdaf_pixelformat = V4L2_PIX_FMT_SRGGB16;
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "channel.bus_fmt 0x%x, pdaf_width %d, pdaf_height %d",
channel.bus_fmt, pdaf_info->pdaf_width, pdaf_info->pdaf_height);
break;
}
}
}
if (pdaf_info->pdaf_support) {
if (sensor_info->linked_to_isp) {
switch (pdaf_info->pdaf_vc) {
case 0:
strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr0_path);
break;
case 1:
strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr1_path);
break;
case 2:
strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr2_path);
break;
case 3:
default:
strcpy(pdaf_info->pdaf_vdev, sensor_info->isp_info->rawwr3_path);
break;
}
} else {
switch (pdaf_info->pdaf_vc) {
case 0:
strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id0);
break;
case 1:
strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id1);
break;
case 2:
strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id2);
break;
case 3:
default:
strcpy(pdaf_info->pdaf_vdev, sensor_info->cif_info->mipi_id3);
break;
}
}
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "%s: pdaf_vdev %s", __func__, pdaf_info->pdaf_vdev);
vdev.close();
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;
}
if (CHECK_ISP_HW_V32()) {
CalibDbV2_AFV31_t *af_v31 =
(CalibDbV2_AFV31_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v31));
if (af_v31) {
_cur_calib_infos.af.vcmcfg = af_v31->TuningPara.vcmcfg;
} else {
memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
}
memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
} else if (CHECK_ISP_HW_V30()) {
CalibDbV2_AFV30_t *af_v30 =
(CalibDbV2_AFV30_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v30));
if (af_v30) {
_cur_calib_infos.af.vcmcfg = af_v30->TuningPara.vcmcfg;
} else {
memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
}
memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
} else if (CHECK_ISP_HW_V32_LITE()) {
CalibDbV2_AFV32_t *af_v32 =
(CalibDbV2_AFV32_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v32));
if (af_v32) {
_cur_calib_infos.af.vcmcfg = af_v32->TuningPara.vcmcfg;
} else {
memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
}
memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_t));
} else {
CalibDbV2_AF_t *af =
(CalibDbV2_AF_t*)CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af);
if (af) {
_cur_calib_infos.af.vcmcfg = af->TuningPara.vcmcfg;
_cur_calib_infos.af.ldg_param = af->TuningPara.ldg_param;
_cur_calib_infos.af.highlight = af->TuningPara.highlight;
} else {
memset(&_cur_calib_infos.af.vcmcfg, 0, sizeof(CalibDbV2_Af_VcmCfg_t));
memset(&_cur_calib_infos.af.ldg_param, 0, sizeof(CalibDbV2_Af_LdgParam_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;
BaseSensorHw* sensorHw = NULL;
LensHw* lensHw = mLensDev.get_cast_ptr<LensHw>();
ENTER_CAMHW_FUNCTION();
XCAM_ASSERT (mCalibDbV2);
_hdr_mode = mode;
Isp20Params::set_working_mode(_hdr_mode);
std::unordered_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->logic_id;
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "sensor_name(%s) is linked to isp_index(%d)",
sns_name, isp_index);
if ((_hdr_mode > 0 && isOnlineByWorkingMode()) ||
(!_linked_to_isp && !mVicapIspPhyLinkSupported)) {
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "use read back mode!");
mNoReadBack = false;
}
// multimplex mode should be using readback mode
if (s_info->isp_info->isMultiplex)
mNoReadBack = false;
if (mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_DOORLOCK ||
mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_BATIPC) {
mNoReadBack = true;
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "isp hw working mode: %s !", mNoReadBack ? "online" : "readback");
//sof event
if (!mIspSofStream.ptr()) {
if (mNoReadBack) {
if (mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_DOORLOCK ||
mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_BATIPC) {
mIspSofStream = new RKSofEventStream(_cif_csi2_sd, ISP_POLL_SOF);
} else {
mIspSofStream = new RKSofEventStream(mIspCoreDev, ISP_POLL_SOF);
}
} else {
if (_linked_to_isp)
mIspSofStream = new RKSofEventStream(mIspCoreDev, ISP_POLL_SOF);
else
mIspSofStream = new RKSofEventStream(_cif_csi2_sd, ISP_POLL_SOF, _linked_to_1608);
}
mIspSofStream->setPollCallback (this);
}
_isp_stream_status = ISP_STREAM_STATUS_INVALID;
if (/*mIsGroupMode*/true) {
mIspStremEvtTh = new RkStreamEventPollThread("StreamEvt",
new V4l2Device (s_info->isp_info->input_params_path),
this);
}
if (!mNoReadBack) {
setupHdrLink(RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode), 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.get_cast_ptr<BaseSensorHw>();
ret = sensorHw->set_working_mode(mode);
if (ret) {
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor mode error !");
return ret;
}
if (mIsGroupMode) {
ret = sensorHw->set_sync_mode(mIsMain ? INTERNAL_MASTER_MODE : EXTERNAL_MASTER_MODE);
if (ret) {
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "set sensor group mode error !\n");
}
} else {
sensorHw->set_sync_mode(NO_SYNC_MODE);
}
#ifndef USE_RAWSTREAM_LIB
mRawCapUnit->set_working_mode(mode);
mRawProcUnit->set_working_mode(mode);
#endif
setExpDelayInfo(mode);
setLensVcmCfg(s_info->mod_info);
xcam_mem_clear(_lens_des);
if (lensHw)
lensHw->getLensModeData(_lens_des);
#if defined(ISP_HW_V20)
_ispp_module_init_ens = 0;
#endif
ret = setupPipelineFmt();
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setupPipelineFmt err: %d\n", ret);
}
struct v4l2_subdev_format isp_src_fmt;
memset(&isp_src_fmt, 0, sizeof(isp_src_fmt));
isp_src_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
isp_src_fmt.pad = 2;
ret = mIspCoreDev->getFormat(isp_src_fmt);
#if defined(RKAIQ_HAVE_MULTIISP)
if (ret == XCAM_RETURN_NO_ERROR && s_info->isp_info->is_multi_isp_mode) {
uint16_t extended_pixel = mMultiIspExtendedPixel;
uint32_t width = isp_src_fmt.format.width;
uint32_t height = isp_src_fmt.format.height;
mParamsSplitter = new IspParamsSplitter();
mParamsSplitter->SetPicInfo({0, 0, width, height})
.SetLeftIspRect({0, 0, width / 2 + extended_pixel, height})
.SetRightIspRect({width / 2 - extended_pixel, 0, width / 2 + extended_pixel, height});
IspParamsSplitter::Rectangle f = mParamsSplitter->GetPicInfo();
IspParamsSplitter::Rectangle l = mParamsSplitter->GetLeftIspRect();
IspParamsSplitter::Rectangle r = mParamsSplitter->GetRightIspRect();
LOGD_ANALYZER(
"Set Multi-ISP Mode ParamSplitter:\n"
" Extended Pixel%d\n"
" F : { %u, %u, %u, %u }\n"
" L : { %u, %u, %u, %u }\n"
" R : { %u, %u, %u, %u }\n",
extended_pixel,
f.x, f.y, f.w, f.h,
l.x, l.y, l.w, l.h,
r.x, r.y, r.w, r.h);
}
#endif
#ifndef USE_RAWSTREAM_LIB
if (!_linked_to_isp && !mNoReadBack) {
if (!_linked_to_1608) {
mRawCapUnit->prepare_cif_mipi();
} else {
if (CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId]) {
mRawCapUnit->prepare_cif_mipi();
CamHwIsp20::rk1608_share_inf.first_en[mCamPhyId] = 0;
}
}
}
#endif
#if defined(RKAIQ_ENABLE_SPSTREAM)
if ((_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) || _cur_calib_infos.af.ldg_param.enable) {
mSpStreamUnit->prepare(&_cur_calib_infos.af.ldg_param, &_cur_calib_infos.af.highlight);
}
#endif
CalibDbV2_Af_Pdaf_t *pdaf = NULL;
if (CHECK_ISP_HW_V30()) {
CalibDbV2_AFV30_t *af_v30 =
(CalibDbV2_AFV30_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, af_v30));
pdaf = &af_v30->TuningPara.pdaf;
}
get_sensor_pdafinfo(s_info, &mPdafInfo);
if (mPdafInfo.pdaf_support && pdaf && pdaf->enable) {
mPdafInfo.pdaf_lrdiffline = pdaf->pdLRInDiffLine;
mPdafStreamUnit->prepare(&mPdafInfo);
} else {
mPdafInfo.pdaf_support = false;
}
if (mCifScaleStream.ptr()) {
mCifScaleStream->set_working_mode(mode);
mCifScaleStream->prepare();
}
_state = CAM_HW_STATE_PREPARED;
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::start()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
BaseSensorHw* sensorHw = NULL;
LensHw* lensHw = NULL;
ENTER_CAMHW_FUNCTION();
sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
lensHw = mLensDev.get_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;
}
#ifndef DISABLE_PARAMS_ASSEMBLER
// set inital params
if (mParamsAssembler.ptr()) {
mParamsAssembler->setCamPhyId(mCamPhyId);
ret = mParamsAssembler->start();
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "params assembler start err: %d\n", ret);
}
if (mParamsAssembler->ready())
setIspConfig();
}
#endif
if (mLumaStream.ptr())
mLumaStream->start();
if (mIspSofStream.ptr()) {
mIspSofStream->setCamPhyId(mCamPhyId);
mIspSofStream->start();
}
if (_linked_to_isp)
mIspCoreDev->subscribe_event(V4L2_EVENT_FRAME_SYNC);
if (mIspStremEvtTh.ptr()) {
ret = mIspStremEvtTh->start();
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "start isp stream event failed: %d\n", ret);
}
} else {
ret = hdr_mipi_start_mode(_hdr_mode);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
}
}
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 defined(RKAIQ_ENABLE_SPSTREAM)
if ((_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) || _cur_calib_infos.af.ldg_param.enable) {
mSpStreamUnit->start();
}
#endif
if (mPdafInfo.pdaf_support) {
mPdafStreamUnit->start();
}
#ifndef DISABLE_PARAMS_POLL_THREAD
if (mIspParamStream.ptr())
mIspParamStream->startThreadOnly();
#endif
#if defined(ISP_HW_V20)
if (mNrStreamProcUnit.ptr())
mNrStreamProcUnit->start();
if (mTnrStreamProcUnit.ptr())
mTnrStreamProcUnit->start();
if (mFecParamStream.ptr())
mFecParamStream->start();
#endif
sensorHw->start();
if (lensHw)
lensHw->start();
_is_exit = false;
_state = CAM_HW_STATE_STARTED;
#ifndef DISABLE_PARAMS_ASSEMBLER
// in fastboot server stage, F1 param maybe ready
// before _state = CAM_HW_STATE_STARTED.
if (mParamsAssembler->ready())
setIspConfig();
#endif
LOGK_CAMHW("cid[%d] %s success. isGroup:%d, isOnline:%d, isMultiIsp:%d, init_ens:0x%llx",
mCamPhyId, __func__, mIsGroupMode, mNoReadBack, mIsMultiIspMode, _isp_module_ens);
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);
#ifndef USE_RAWSTREAM_LIB
if (!mNoReadBack) {
bool init_state = true;
if (_linked_to_1608) {
if (CamHwIsp20::rk1608_share_inf.us_prepare_cnt > 0) {
init_state = false;
}
CamHwIsp20::rk1608_share_inf.us_prepare_cnt++;
if (CamHwIsp20::rk1608_share_inf.us_prepare_cnt > 10)
CamHwIsp20::rk1608_share_inf.us_prepare_cnt = 10;
}
if (new_mode == RK_AIQ_WORKING_MODE_NORMAL) {
if (!_linked_to_1608) {
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0);
} else {
if (init_state) {
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0);
}
}
ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_0);
} else if (new_mode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
if (!_linked_to_1608) {
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
} else {
if (init_state) {
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
}
}
ret = mRawProcUnit->prepare(MIPI_STREAM_IDX_0 | MIPI_STREAM_IDX_1);
} else {
if (!_linked_to_1608) {
ret = mRawCapUnit->prepare(MIPI_STREAM_IDX_ALL);
} else {
if (init_state) {
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);
}
}
#endif
return ret;
}
XCamReturn
CamHwIsp20::hdr_mipi_start_mode(int mode)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s enter", __FUNCTION__);
#ifndef USE_RAWSTREAM_LIB
if (!mNoReadBack) {
if (!_linked_to_1608) {
mRawCapUnit->start(mode);
mRawProcUnit->start(mode);
} else {
SmartLock locker(_sync_1608_mutex);
bool stream_on = false;
CamHwIsp20::rk1608_share_inf.us_stream_cnt++;
if (CamHwIsp20::rk1608_share_inf.us_stream_cnt > 10)
CamHwIsp20::rk1608_share_inf.us_stream_cnt = 10;
if (CamHwIsp20::rk1608_share_inf.us_stream_cnt >= CamHwIsp20::rk1608_share_inf.en_sns_num) {
// only processed the last streaming
stream_on = true;
}
if (stream_on) {
mRawCapUnit->start(mode);
}
mRawProcUnit->start(mode);
if (stream_on) {
_sync_1608_done = true;
_sync_done_cond.broadcast();
} else {
_sync_1608_done = false;
}
}
}
#endif
if (mCifScaleStream.ptr())
mCifScaleStream->start();
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "%s exit", __FUNCTION__);
return ret;
}
XCamReturn
CamHwIsp20::hdr_mipi_stop()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
#ifndef USE_RAWSTREAM_LIB
mRawProcUnit->stop();
if (!_linked_to_1608) {
mRawCapUnit->stop();
} else {
bool stop_en = false;
CamHwIsp20::rk1608_share_inf.us_stop_cnt++;
if (CamHwIsp20::rk1608_share_inf.us_stop_cnt > 10)
CamHwIsp20::rk1608_share_inf.us_stop_cnt = 10;
if (CamHwIsp20::rk1608_share_inf.us_stop_cnt == CamHwIsp20::rk1608_share_inf.en_sns_num) {
stop_en = true;
}
if (stop_en) {
mRawCapUnit->stop();
}
}
#endif
if (mCifScaleStream.ptr())
mCifScaleStream->stop();
return ret;
}
XCamReturn CamHwIsp20::stop()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
BaseSensorHw* sensorHw = NULL;
LensHw* lensHw = NULL;
ENTER_CAMHW_FUNCTION();
if (_state == CAM_HW_STATE_STOPPED)
return ret;
if (mIspStatsStream.ptr())
mIspStatsStream->stop();
if (mLumaStream.ptr())
mLumaStream->stop();
if (mIspSofStream.ptr())
mIspSofStream->stop();
#if defined(RKAIQ_ENABLE_SPSTREAM)
if ((_cur_calib_infos.mfnr.enable && _cur_calib_infos.mfnr.motion_detect_en) || _cur_calib_infos.af.ldg_param.enable) {
mSpStreamUnit->stop();
}
#endif
if (mPdafInfo.pdaf_support) {
mPdafStreamUnit->stop();
}
// stop after pollthread, ensure that no new events
// come into snesorHw
sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
sensorHw->stop();
lensHw = mLensDev.get_cast_ptr<LensHw>();
if (lensHw)
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);
}
#ifndef DISABLE_PARAMS_ASSEMBLER
if (mParamsAssembler.ptr())
mParamsAssembler->stop();
#endif
if (mIspStremEvtTh.ptr()) {
mIspStremEvtTh->stop();
if (/*_isp_stream_status == ISP_STREAM_STATUS_STREAM_ON*/true) {
SmartLock locker(_stop_cond_mutex);
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "stop isp stream");
#ifndef DISABLE_PARAMS_POLL_THREAD
if (mIspParamStream.ptr())
mIspParamStream->stop();
#else
if (mIspParamsDev.ptr())
mIspParamsDev->stop();
#endif
hdr_mipi_stop();
_isp_stream_status = ISP_STREAM_STATUS_INVALID;
}
} else {
#ifndef DISABLE_PARAMS_POLL_THREAD
if (mIspParamStream.ptr())
mIspParamStream->stop();
#else
if (mIspParamsDev.ptr())
mIspParamsDev->stop();
#endif
if (!mNoReadBack) {
ret = hdr_mipi_stop();
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi stop err: %d\n", ret);
}
}
}
#if defined(ISP_HW_V20)
if (mTnrStreamProcUnit.ptr())
mTnrStreamProcUnit->stop();
if (mNrStreamProcUnit.ptr())
mNrStreamProcUnit->stop();
if (mFecParamStream.ptr())
mFecParamStream->stop();
#endif
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();
}
{
// TODO: [baron] PAL/NTSC mode convert[Start / Stop]. recovery cnt.
// [Stage 02] {start} <-> {stop}
CamHwIsp20::rk1608_share_inf.us_stream_cnt = 0;
if (CamHwIsp20::rk1608_share_inf.us_stop_cnt >= CamHwIsp20::rk1608_share_inf.en_sns_num) {
// ensure all valid 1608-sensor stoped.
CamHwIsp20::rk1608_share_inf.us_stop_cnt = 0;
}
}
_state = CAM_HW_STATE_STOPPED;
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn CamHwIsp20::pause()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
BaseSensorHw* sensorHw = NULL;
if (mIspStatsStream.ptr())
mIspStatsStream->stop();
if (mIspSofStream.ptr())
mIspSofStream->stop();
if (mLumaStream.ptr())
mLumaStream->stop();
if (!mNoReadBack)
hdr_mipi_stop();
sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
sensorHw->stop();
#ifndef DISABLE_PARAMS_POLL_THREAD
if (mIspParamStream.ptr())
mIspParamStream->stop();
#else
if (mIspParamsDev.ptr())
mIspParamsDev->stop();
#endif
#if defined(ISP_HW_V20)
if (mTnrStreamProcUnit.ptr())
mTnrStreamProcUnit->start();
if (mNrStreamProcUnit.ptr())
mNrStreamProcUnit->stop();
if (mFecParamStream.ptr())
mFecParamStream->stop();
#endif
#ifndef DISABLE_PARAMS_ASSEMBLER
if (mParamsAssembler.ptr())
mParamsAssembler->stop();
#endif
if (mPdafStreamUnit.ptr())
mPdafStreamUnit->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;
BaseSensorHw* sensorHw = NULL;
if (_linked_to_isp || mNoReadBack) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "sensor linked to isp, not supported now!");
return XCAM_RETURN_ERROR_FAILED;
}
sensorHw = mSensorDev.get_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;
#ifndef USE_RAWSTREAM_LIB
mRawCapUnit->set_working_mode(mode);
mRawProcUnit->set_working_mode(mode);
// remap _mipi_tx_devs for cif
if (!_linked_to_isp && !mNoReadBack) {
mRawCapUnit->prepare_cif_mipi();
}
#endif
return ret;
}
XCamReturn CamHwIsp20::resume()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
BaseSensorHw* sensorHw = mSensorDev.get_cast_ptr<BaseSensorHw>();
#ifndef DISABLE_PARAMS_ASSEMBLER
// 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();
#endif
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();
#ifndef DISABLE_PARAMS_POLL_THREAD
if (mIspParamStream.ptr())
mIspParamStream->startThreadOnly();
#endif
if (mLumaStream.ptr())
mLumaStream->start();
if (mIspStatsStream.ptr())
mIspStatsStream->start();
#if defined(ISP_HW_V20)
if (mTnrStreamProcUnit.ptr())
mTnrStreamProcUnit->start();
if (mNrStreamProcUnit.ptr())
mNrStreamProcUnit->start();
if (mFecParamStream.ptr())
mFecParamStream->start();
#endif
if (mPdafStreamUnit.ptr())
mPdafStreamUnit->start();
_state = CAM_HW_STATE_STARTED;
return ret;
}
#if defined(ISP_HW_V20)
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();
}
#endif
#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
#if defined(ISP_HW_V20)
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;
}
#endif
XCamReturn
CamHwIsp20::showOtpPdafData(struct rkmodule_pdaf_inf *otp_pdaf)
{
unsigned int gainmap_w, gainmap_h;
unsigned int dccmap_w, dccmap_h;
char print_buf[256];
unsigned int i, j;
if (otp_pdaf->flag) {
gainmap_w = otp_pdaf->gainmap_width;
gainmap_h = otp_pdaf->gainmap_height;
dccmap_w = otp_pdaf->dccmap_width;
dccmap_h = otp_pdaf->dccmap_height;
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "[RKPDAFOTPParam]");
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "flag=%d;", otp_pdaf->flag);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "gainmap_width=%d;", gainmap_w);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "gainmap_height=%d;", gainmap_h);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "gainmap_table=");
for (i = 0; i < gainmap_h; i++) {
memset(print_buf, 0, sizeof(print_buf));
for (j = 0; j < gainmap_w; j++) {
sprintf(print_buf + strlen(print_buf), "%d ", otp_pdaf->gainmap[i * gainmap_w + j]);
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "%s", print_buf);
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dcc_mode=%d;", otp_pdaf->dcc_mode);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dcc_dir=%d;", otp_pdaf->dcc_dir);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dccmap_width=%d;", otp_pdaf->dccmap_width);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dccmap_height=%d;", otp_pdaf->dccmap_height);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dccmap_table=");
for (i = 0; i < dccmap_h; i++) {
memset(print_buf, 0, sizeof(print_buf));
for (j = 0; j < dccmap_w; j++) {
sprintf(print_buf + strlen(print_buf), "%d ", otp_pdaf->dccmap[i * dccmap_w + j]);
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "%s", print_buf);
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "pd_offset=0x%x;", otp_pdaf->pd_offset);
}
return XCAM_RETURN_NO_ERROR;
}
XCamReturn
CamHwIsp20::showOtpAfData(struct rkmodule_af_inf *af_inf)
{
unsigned int i;
if (af_inf->flag) {
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "[RKAFOTPParam]");
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "flag=%d;", af_inf->flag);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "dir_cnt=%d;", af_inf->dir_cnt);
for (i = 0; i < af_inf->dir_cnt; i++) {
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "af_inf=%d;", af_inf->af_otp[i].vcm_dir);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "af_macro=%d;", af_inf->af_otp[i].vcm_start);
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "af_macro=%d;", af_inf->af_otp[i].vcm_end);
}
}
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;
BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
LensHw* mLensSubdev = mLensDev.get_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;
}
if(userSensorWidth && userSensorHeight){
sns_des.sensor_output_width = userSensorWidth;
sns_des.sensor_output_height = userSensorHeight;
sns_des.isp_acq_width = sns_des.sensor_output_width;
sns_des.isp_acq_height = sns_des.sensor_output_height;
}
xcam_mem_clear (sns_des.lens_des);
if (mLensSubdev)
mLensSubdev->getLensModeData(sns_des.lens_des);
auto iter_sns_info = mSensorHwInfos.find(sns_name);
if (iter_sns_info == 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 {
sns_des.otp_awb.flag = 0;
}
if (minfo->lsc.flag)
sns_des.otp_lsc = &minfo->lsc;
else
sns_des.otp_lsc = nullptr;
if (minfo->af.flag) {
sns_des.otp_af = &minfo->af;
showOtpAfData(sns_des.otp_af);
} else {
sns_des.otp_af = nullptr;
}
if (minfo->pdaf.flag) {
sns_des.otp_pdaf = &minfo->pdaf;
showOtpPdafData(sns_des.otp_pdaf);
} else {
sns_des.otp_pdaf = nullptr;
}
}
return ret;
}
XCamReturn
CamHwIsp20::setExposureParams(SmartPtr<RkAiqExpParamsProxy>& expPar)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
//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();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if(irisType == IRISV2_P_TYPE) {
//P-iris
int step = irisPar->data()->PIris.step;
bool update = irisPar->data()->PIris.update;
if (mLensSubdev && update) {
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set P-Iris step: %d", step);
if (mLensSubdev->setPIrisParams(step) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "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 && update) {
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set DC-Iris PwmDuty: %d", PwmDuty);
if (mLensSubdev->setDCIrisParams(PwmDuty) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set DC-Iris PwmDuty failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
}
} else if(irisType == IRISV2_HDC_TYPE) {
//HDC-iris
int target = irisPar->data()->HDCIris.target;
bool update = irisPar->data()->HDCIris.update;
if (mLensSubdev && update) {
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set HDC-Iris Target: %d", target);
if (mLensSubdev->setHDCIrisParams(target) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set HDC-Iris target failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
}
}
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::getIrisParams(SmartPtr<RkAiqIrisParamsProxy>& irisPar, CalibDb_IrisTypeV2_t irisType)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if(irisType == IRISV2_HDC_TYPE) {
//HDC-iris
int adc = 0;
int position = 0;
if (mLensSubdev) {
if (mLensSubdev->getHDCIrisParams(&adc) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get HDC-Iris adc failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
if (mLensSubdev->getZoomParams(&position) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get zoom result failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||get HDC-Iris ADC: %d get zoomPos: %d\n", adc, position);
irisPar->data()->HDCIris.adc = adc;
irisPar->data()->HDCIris.zoomPos = position;
}
}
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::setFocusParams(SmartPtr<RkAiqFocusParamsProxy>& focus_params)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
rk_aiq_focus_params_t* p_focus = &focus_params->data()->result;
bool focus_valid = p_focus->lens_pos_valid;
bool zoom_valid = p_focus->zoom_pos_valid;
bool focus_correction = p_focus->focus_correction;
bool zoom_correction = p_focus->zoom_correction;
bool zoomfocus_modifypos = p_focus->zoomfocus_modifypos;
bool end_zoom_chg = p_focus->end_zoom_chg;
bool vcm_config_valid = p_focus->vcm_config_valid;
if (!mLensSubdev)
goto OUT;
if (zoomfocus_modifypos)
mLensSubdev->ZoomFocusModifyPosition(focus_params);
if (focus_correction)
mLensSubdev->FocusCorrection();
if (zoom_correction)
mLensSubdev->ZoomCorrection();
if (focus_valid && !zoom_valid) {
if (mLensSubdev->setFocusParams(focus_params) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set focus result failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
} else if ((focus_valid && zoom_valid) || end_zoom_chg) {
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||setZoomFocusParams");
if (mLensSubdev->setZoomFocusParams(focus_params) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set setZoomFocusParams failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
}
rk_aiq_lens_vcmcfg lens_cfg;
if (mLensSubdev && vcm_config_valid) {
mLensSubdev->getLensVcmCfg(lens_cfg);
lens_cfg.start_ma = p_focus->vcm_start_ma;
lens_cfg.rated_ma = p_focus->vcm_end_ma;
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||set vcm config: %d, %d", lens_cfg.start_ma, lens_cfg.rated_ma);
if (mLensSubdev->setLensVcmCfg(lens_cfg) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "set vcm config failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
}
OUT:
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::getZoomPosition(int& position)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if (mLensSubdev) {
if (mLensSubdev->getZoomParams(&position) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get zoom result failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||get zoom result: %d", position);
}
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::setLensVcmCfg(rk_aiq_lens_vcmcfg& lens_cfg)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if (mLensSubdev) {
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();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if (mLensSubdev) {
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();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if (mLensSubdev) {
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();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if (mLensSubdev) {
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::setAngleZ(float angleZ)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
if (mLensSubdev) {
if (mLensSubdev->setAngleZ(angleZ) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setAngleZ failed");
return XCAM_RETURN_ERROR_IOCTL;
}
}
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::getFocusPosition(int& position)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_CAMHW_FUNCTION();
SmartPtr<LensHw> mLensSubdev = mLensDev.dynamic_cast_ptr<LensHw>();
if (mLensSubdev.ptr()) {
if (mLensSubdev->getFocusParams(&position) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get focus position failed to device");
return XCAM_RETURN_ERROR_IOCTL;
}
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "|||get focus position: %d", position);
}
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();
#ifndef USE_RAWSTREAM_LIB
mRawProcUnit->set_hdr_frame_readback_infos(luma_params.frame_id, luma_params.hdrProcessCnt);
#endif
EXIT_CAMHW_FUNCTION();
return ret;
}
XCamReturn
CamHwIsp20::getEffectiveIspParams(rkisp_effect_params_v20& ispParams, uint32_t frame_id)
{
ENTER_CAMHW_FUNCTION();
std::map<uint32_t, SmartPtr<RkAiqIspEffParamsProxy>>::iterator it;
uint32_t search_id = frame_id == uint32_t(-1) ? 0 : frame_id;
SmartLock locker (_isp_params_cfg_mutex);
if (_effecting_ispparam_map.size() == 0) {
if (frame_id != 0 && _state == CAM_HW_STATE_STARTED)
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "camId: %d, can't search id %d, _effecting_ispparam_map is %d\n",
mCamPhyId, 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<uint32_t, SmartPtr<RkAiqIspEffParamsProxy>>::reverse_iterator rit;
rit = _effecting_ispparam_map.rbegin();
do {
LOGV_CAMHW_SUBM(ISP20HW_SUBM, "camId: %d, traverse _effecting_ispparam_map to find id %d, current id is [%d]\n",
mCamPhyId, search_id, rit->first);
if (search_id >= rit->first ) {
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "camId: %d, can't find id %d, get latest id %d in _effecting_ispparam_map\n",
mCamPhyId, search_id, rit->first);
break;
}
} while (++rit != _effecting_ispparam_map.rend());
if (rit == _effecting_ispparam_map.rend()) {
if (_effecting_ispparam_map.size() > 0) {
ispParams = _effecting_ispparam_map.rbegin()->second->data()->result;
return XCAM_RETURN_NO_ERROR;
}
LOGE_CAMHW_SUBM(ISP20HW_SUBM,
"camId: %d, can't find the latest effecting ispparams for id %d, impossible case !",
mCamPhyId, frame_id);
return XCAM_RETURN_ERROR_PARAM;
}
ispParams = rit->second->data()->result;
} else {
ispParams = it->second->data()->result;
}
EXIT_CAMHW_FUNCTION();
return XCAM_RETURN_NO_ERROR;
}
#if 0
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__);
}
#endif
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()
{
#ifndef USE_RAWSTREAM_LIB
if (mRawProcUnit.ptr())
return mRawProcUnit->notify_capture_raw();
else
#endif
return XCAM_RETURN_ERROR_FAILED;
}
XCamReturn CamHwIsp20::capture_raw_ctl(capture_raw_t type, int count, const char* capture_dir, char* output_dir)
{
#ifndef USE_RAWSTREAM_LIB
if (!mRawProcUnit.ptr())
return XCAM_RETURN_ERROR_FAILED;
if (type == CAPTURE_RAW_AND_YUV_SYNC)
return mRawProcUnit->capture_raw_ctl(type);
else if (type == CAPTURE_RAW_SYNC)
return mRawProcUnit->capture_raw_ctl(type, count, capture_dir, output_dir);
#endif
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 _isp_module_ens;
}
XCamReturn CamHwIsp20::setSensorFlip(bool mirror, bool flip, int skip_frm_cnt)
{
BaseSensorHw* mSensorSubdev = mSensorDev.get_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); */
#ifndef USE_RAWSTREAM_LIB
if (_state == CAM_HW_STATE_STARTED && skip_frame_sequence != -1) {
mRawCapUnit->skip_frames(skip_frm_cnt, skip_frame_sequence);
}
#endif
return ret;
}
XCamReturn CamHwIsp20::getSensorFlip(bool& mirror, bool& flip)
{
BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
return mSensorSubdev->get_mirror_flip(mirror, flip);
}
XCamReturn CamHwIsp20::setSensorCrop(rk_aiq_rect_t& rect)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
struct v4l2_crop crop;
#ifndef USE_RAWSTREAM_LIB
for (int i = 0; i < 3; i++) {
V4l2Device* mipi_tx = mRawCapUnit->get_tx_device(i).get_cast_ptr<V4l2Device>();
memset(&crop, 0, sizeof(crop));
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (mipi_tx) {
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;
#endif
return ret;
}
XCamReturn CamHwIsp20::getSensorCrop(rk_aiq_rect_t& rect)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
struct v4l2_crop crop;
#ifndef USE_RAWSTREAM_LIB
V4l2Device* mipi_tx = mRawCapUnit->get_tx_device(0).get_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;
#endif
return ret;
}
void CamHwIsp20::setHdrGlobalTmoMode(uint32_t frame_id, bool mode)
{
if (mNoReadBack)
return;
#ifndef USE_RAWSTREAM_LIB
mRawProcUnit->set_hdr_global_tmo_mode(frame_id, mode);
#endif
}
void CamHwIsp20::setMulCamConc(bool cc)
{
#ifndef USE_RAWSTREAM_LIB
mRawProcUnit->setMulCamConc(cc);
if (cc)
mNoReadBack = false;
#endif
}
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(uint8_t id, void *ops_ctx, void *config, void **mem_ctx)
{
int ret = -1;
struct rkispp_fecbuf_info fecbuf_info;
struct rkisp_meshbuf_info cacbuf_info;
struct rkispp_fecbuf_size fecbuf_size;
struct rkisp_meshbuf_size cacbuf_size;
struct rkisp_info2ddr dbgbuf_info;
uint8_t offset = id * ISP3X_MESH_BUF_NUM;
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) {
#if defined(ISP_HW_V20) || defined(ISP_HW_V21)
struct rkisp_ldchbuf_size ldchbuf_size;
struct rkisp_ldchbuf_info ldchbuf_info;
unsigned long cmd = RKISP_CMD_SET_LDCHBUF_SIZE;
ldchbuf_size.meas_width = share_mem_cfg->alloc_param.width;
ldchbuf_size.meas_height = share_mem_cfg->alloc_param.height;
#else
struct rkisp_meshbuf_info ldchbuf_info;
struct rkisp_meshbuf_size ldchbuf_size;
unsigned long cmd = RKISP_CMD_SET_MESHBUF_SIZE;
ldchbuf_size.unite_isp_id = id;
ldchbuf_size.module_id = ISP3X_MODULE_LDCH;
ldchbuf_size.meas_width = share_mem_cfg->alloc_param.width;
ldchbuf_size.meas_height = share_mem_cfg->alloc_param.height;
ldchbuf_size.buf_cnt = ISP2X_MESH_BUF_NUM;
#endif
ret = isp20->mIspCoreDev->io_control(cmd, &ldchbuf_size);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc ldch buf failed!");
*mem_ctx = nullptr;
return;
}
xcam_mem_clear(ldchbuf_info);
#if defined(ISP_HW_V20) || defined(ISP_HW_V21)
cmd = RKISP_CMD_GET_LDCHBUF_INFO;
#else
ldchbuf_info.unite_isp_id = id;
ldchbuf_info.module_id = ISP3X_MODULE_LDCH;
cmd = RKISP_CMD_GET_MESHBUF_INFO;
#endif
ret = isp20->mIspCoreDev->io_control(cmd, &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_MESH_BUF_NUM; i++) {
mem_info_array[offset + 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[offset + i].map_addr)
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map ldch buf!!");
mem_info_array[offset + i].fd = ldchbuf_info.buf_fd[i];
mem_info_array[offset + i].size = ldchbuf_info.buf_size[i];
struct isp2x_mesh_head *head = (struct isp2x_mesh_head*)mem_info_array[offset + i].map_addr;
mem_info_array[offset + i].addr = (void*)((char*)mem_info_array[offset + i].map_addr + head->data_oft);
mem_info_array[offset + i].state = (char*)&head->stat;
}
*mem_ctx = (void*)(&isp20->_ldch_drv_mem_ctx);
#if defined(ISP_HW_V20)
} 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);
#endif
} else if (share_mem_cfg->mem_type == MEM_TYPE_CAC) {
cacbuf_size.unite_isp_id = id;
cacbuf_size.module_id = ISP3X_MODULE_CAC;
cacbuf_size.meas_width = share_mem_cfg->alloc_param.width;
cacbuf_size.meas_height = share_mem_cfg->alloc_param.height;
cacbuf_size.buf_cnt = share_mem_cfg->alloc_param.reserved[0];
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_SET_MESHBUF_SIZE, &cacbuf_size);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc cac buf failed!");
*mem_ctx = nullptr;
return;
}
xcam_mem_clear(cacbuf_info);
cacbuf_info.unite_isp_id = id;
cacbuf_info.module_id = ISP3X_MODULE_CAC;
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_GET_MESHBUF_INFO, &cacbuf_info);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to get cac buf info!!");
*mem_ctx = nullptr;
return;
}
rk_aiq_cac_share_mem_info_t* mem_info_array =
(rk_aiq_cac_share_mem_info_t*)(isp20->_cac_drv_mem_ctx.mem_info);
for (int i = 0; i < cacbuf_size.buf_cnt; i++) {
mem_info_array[offset + i].map_addr =
mmap(NULL, cacbuf_info.buf_size[i], PROT_READ | PROT_WRITE, MAP_SHARED, cacbuf_info.buf_fd[i], 0);
if (MAP_FAILED == mem_info_array[offset + i].map_addr) {
mem_info_array[offset + i].map_addr = NULL;
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map cac buf!!");
*mem_ctx = nullptr;
return;
}
mem_info_array[offset + i].fd = cacbuf_info.buf_fd[i];
mem_info_array[offset + i].size = cacbuf_info.buf_size[i];
struct isp2x_mesh_head* head = (struct isp2x_mesh_head*)mem_info_array[offset + i].map_addr;
mem_info_array[offset + i].addr = (void*)((char*)mem_info_array[offset + i].map_addr + head->data_oft);
mem_info_array[offset + i].state = (char*)&head->stat;
LOGD_CAMHW_SUBM(ISP20HW_SUBM, "Got CAC LUT fd %d for ISP %d", mem_info_array[offset + i].fd, id);
}
*mem_ctx = (void*)(&isp20->_cac_drv_mem_ctx);
} else if (share_mem_cfg->mem_type == MEM_TYPE_DBG_INFO) {
id = 0;
offset = id * RKISP_INFO2DDR_BUF_MAX;
dbgbuf_info.wsize = share_mem_cfg->alloc_param.width;
dbgbuf_info.vsize = share_mem_cfg->alloc_param.height;
dbgbuf_info.owner = (rkisp_info2ddr_owner)(share_mem_cfg->alloc_param.reserved[0]);
if (dbgbuf_info.owner == RKISP_INFO2DRR_OWNER_AWB) {
dbgbuf_info.u.awb.awb2ddr_sel = share_mem_cfg->alloc_param.reserved[1];
} else if (dbgbuf_info.owner == RKISP_INFO2DRR_OWNER_GAIN) {
dbgbuf_info.u.gain.gain2ddr_mode = share_mem_cfg->alloc_param.reserved[1];
} else {
*mem_ctx = nullptr;
return;
}
dbgbuf_info.buf_cnt = share_mem_cfg->alloc_param.reserved[2];
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_INFO2DDR, &dbgbuf_info);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc dbg buf failed!");
*mem_ctx = nullptr;
return;
}
rk_aiq_dbg_share_mem_info_t* mem_info_array =
(rk_aiq_dbg_share_mem_info_t*)(isp20->_dbg_drv_mem_ctx.mem_info);
for (int i = 0; i < dbgbuf_info.buf_cnt; i++) {
mem_info_array[offset + i].map_addr =
mmap(NULL, dbgbuf_info.wsize * dbgbuf_info.vsize, PROT_READ | PROT_WRITE, MAP_SHARED, dbgbuf_info.buf_fd[i], 0);
if (MAP_FAILED == mem_info_array[offset + i].map_addr) {
mem_info_array[offset + i].map_addr = NULL;
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "failed to map dbg buf!!");
*mem_ctx = nullptr;
return;
}
mem_info_array[offset + i].size = dbgbuf_info.wsize * dbgbuf_info.vsize;
mem_info_array[offset + i].fd = dbgbuf_info.buf_fd[i];
}
*mem_ctx = (void*)(&isp20->_dbg_drv_mem_ctx);
}
}
void CamHwIsp20::releaseMemResource(uint8_t id, void *mem_ctx)
{
int ret = -1;
drv_share_mem_ctx_t* drv_mem_ctx = (drv_share_mem_ctx_t*)mem_ctx;
if (mem_ctx == nullptr) return;
CamHwIsp20 *isp20 = (CamHwIsp20*)(drv_mem_ctx->ops_ctx);
uint8_t offset = id * ISP3X_MESH_BUF_NUM;
uint64_t module_id = 0;
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_MESH_BUF_NUM; i++) {
if (mem_info_array[offset + i].map_addr) {
if (mem_info_array[offset + i].state &&
(MESH_BUF_CHIPINUSE != mem_info_array[offset + i].state[0])) {
mem_info_array[offset + i].state[0] = MESH_BUF_INIT;
}
ret = munmap(mem_info_array[offset + i].map_addr, mem_info_array[offset + i].size);
if (ret < 0)
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap ldch buf info!!");
mem_info_array[offset + i].map_addr = NULL;
}
if (mem_info_array[offset + i].fd > 0) {
::close(mem_info_array[offset + i].fd);
mem_info_array[offset + i].fd = -1;
}
}
module_id = ISP2X_MODULE_LDCH;
} 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) {
if (mem_info_array[i].state &&
(MESH_BUF_CHIPINUSE != mem_info_array[i].state[0])) {
mem_info_array[i].state[0] = MESH_BUF_INIT;
}
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;
}
if (mem_info_array[i].fd > 0) {
::close(mem_info_array[i].fd);
mem_info_array[i].fd = -1;
}
}
} else if (drv_mem_ctx->type == MEM_TYPE_CAC) {
rk_aiq_cac_share_mem_info_t* mem_info_array =
(rk_aiq_cac_share_mem_info_t*)(drv_mem_ctx->mem_info);
for (int i = 0; i < ISP3X_MESH_BUF_NUM; i++) {
if (mem_info_array[offset + i].map_addr) {
if (mem_info_array[offset + i].state &&
(MESH_BUF_CHIPINUSE != mem_info_array[offset + i].state[0])) {
mem_info_array[offset + i].state[0] = MESH_BUF_INIT;
}
ret = munmap(mem_info_array[offset + i].map_addr, mem_info_array[offset + i].size);
if (ret < 0)
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "munmap cac buf info!!");
mem_info_array[offset + i].map_addr = NULL;
}
if (mem_info_array[offset + i].fd > 0) {
::close(mem_info_array[offset + i].fd);
mem_info_array[offset + i].fd = -1;
}
}
module_id = ISP3X_MODULE_CAC;
} else if (drv_mem_ctx->type == MEM_TYPE_DBG_INFO) {
rk_aiq_dbg_share_mem_info_t* mem_info_array =
(rk_aiq_dbg_share_mem_info_t*)(drv_mem_ctx->mem_info);
if (mem_info_array == nullptr)
return;
struct rkisp_info2ddr info;
info.owner = RKISP_INFO2DRR_OWNER_NULL;
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_INFO2DDR, &info);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "alloc dbg buf failed!");
return;
}
for (int i = 0; i < RKISP_INFO2DDR_BUF_MAX; i++) {
if (mem_info_array[offset + i].map_addr) {
ret = munmap(mem_info_array[offset + i].map_addr, mem_info_array[offset + i].size);
if (ret < 0)
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "%dth,munmap dbg buf info!! error:%s, map_addr:%p, size:%d",
i, strerror(errno), mem_info_array[offset + i].map_addr,
mem_info_array[offset + i].size);
mem_info_array[offset + i].map_addr = NULL;
}
if (mem_info_array[offset + i].fd > 0) ::close(mem_info_array[offset + i].fd);
}
}
if (module_id != 0) {
ret = isp20->mIspCoreDev->io_control(RKISP_CMD_MESHBUF_FREE, &module_id);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "free dbg buf failed!");
}
}
}
void*
CamHwIsp20::getFreeItem(uint8_t id, 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;
if (!mem_ctx || !drv_mem_ctx->ops_ctx) return nullptr;
CamHwIsp20 *isp20 = (CamHwIsp20*)(drv_mem_ctx->ops_ctx);
uint8_t offset = id * ISP3X_MESH_BUF_NUM;
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_MESH_BUF_NUM; idx++) {
if (mem_info_array[offset + idx].map_addr) {
if (mem_info_array[offset + idx].state &&
(0 == mem_info_array[offset + idx].state[0])) {
return (void*)&mem_info_array[offset + 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);
if (mem_info_array == nullptr) return nullptr;
do {
for (idx = 0; idx < FEC_MESH_BUF_NUM; idx++) {
if (mem_info_array[idx].map_addr) {
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_CAC) {
rk_aiq_cac_share_mem_info_t* mem_info_array =
(rk_aiq_cac_share_mem_info_t*)(drv_mem_ctx->mem_info);
if (mem_info_array == nullptr) return nullptr;
do {
for (idx = 0; idx < ISP3X_MESH_BUF_NUM; idx++) {
if (mem_info_array[offset + idx].map_addr != nullptr) {
if (-1 != mem_info_array[offset + idx].fd) {
return (void*)&mem_info_array[offset + idx];
}
}
}
} while(retry_cnt--);
} else if (drv_mem_ctx->type == MEM_TYPE_DBG_INFO) {
rk_aiq_dbg_share_mem_info_t* mem_info_array =
(rk_aiq_dbg_share_mem_info_t*)(drv_mem_ctx->mem_info);
if (mem_info_array == nullptr) return nullptr;
do {
for (idx = 0; idx < RKISP_INFO2DDR_BUF_MAX; idx++) {
if (mem_info_array[offset + idx].map_addr) {
uint32_t state = *(uint32_t*)(mem_info_array[offset + idx].map_addr);
if (state == RKISP_INFO2DDR_BUF_INIT)
return (void*)&mem_info_array[offset + 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;
}
bool restart = false;
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);
#ifndef DISABLE_PARAMS_ASSEMBLER
mParamsAssembler->addReadyCondition(result->getType());
#endif
}
restart = true;
}
#ifndef DISABLE_PARAMS_ASSEMBLER
mParamsAssembler->queue(list);
// set all ready params to drv
while (_state == CAM_HW_STATE_STARTED &&
mParamsAssembler->ready()) {
SmartLock locker(_stop_cond_mutex);
if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF) {
ret = setIspConfig();
if (ret != XCAM_RETURN_NO_ERROR)
break;
} else {
break;
}
}
#else
SmartLock locker(_stop_cond_mutex);
if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF || restart) {
ret = setIspConfig(&list);
}
#endif
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;
LOG1("%s enter, msg type(0x%x)", __FUNCTION__, result->getType());
switch (result->getType())
{
case RESULT_TYPE_EXPOSURE_PARAM:
{
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:
case RESULT_TYPE_CAC_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:
#if defined(ISP_HW_V20)
handlePpReslut(result);
#endif
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);
ret = getIrisParams(iris, _cur_calib_infos.aec.IrisType);
if (ret)
LOGE_ANALYZER("getIrisParams 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;
}
case RESULT_TYPE_AFD_PARAM:
{
SmartPtr<RkAiqIspAfdParamsProxy> afd = result.dynamic_cast_ptr<RkAiqIspAfdParamsProxy>();
if (mCifScaleStream.ptr()) {
bool enable = afd->data()->result.enable;
int ratio = afd->data()->result.ratio;
setCifSclStartFlag(ratio, enable);
}
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();
BaseSensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<BaseSensorHw>();
LensHw* mLensSubdev = mLensDev.get_cast_ptr<LensHw>();
mSensorSubdev->handle_sof(evtdata->_timestamp, evtdata->_frameid);
#ifndef USE_RAWSTREAM_LIB
if (!mNoReadBack)
mRawProcUnit->notify_sof(evtdata->_timestamp, evtdata->_frameid);
#endif
if (mLensSubdev)
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);
}
}
#ifndef DISABLE_PARAMS_ASSEMBLER
mParamsAssembler->addReadyCondition(result->getType());
#endif
}
#ifndef DISABLE_PARAMS_ASSEMBLER
mParamsAssembler->queue(result);
// set all ready params to drv
while (_state == CAM_HW_STATE_STARTED &&
mParamsAssembler->ready()) {
SmartLock locker(_stop_cond_mutex);
if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF) {
ret = setIspConfig();
if (ret != XCAM_RETURN_NO_ERROR)
break;
} else {
break;
}
}
#else
SmartLock locker(_stop_cond_mutex);
if (_isp_stream_status != ISP_STREAM_STATUS_STREAM_OFF) {
ret = setIspConfig();
if (ret != XCAM_RETURN_NO_ERROR) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "setIspConfig failed !");
}
}
#endif
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 ?
RkAiqIspTnrParamsProxy* tnr = nullptr;
tnr = result.get_cast_ptr<RkAiqIspTnrParamsProxy>();
if (tnr) {
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) {
RkAiqIspFecParamsProxy* fec = nullptr;
fec = result.get_cast_ptr<RkAiqIspFecParamsProxy>();
if (fec) {
rk_aiq_isp_fec_t& fec_param = fec->data()->result;
if(fec_param.sw_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) {
RkAiqIspOrbParamsProxy* orb = nullptr;
orb = result.get_cast_ptr<RkAiqIspOrbParamsProxy>();
if (orb) {
rk_aiq_isp_orb_t& orb_param = orb->data()->result;
if(orb_param.orb_en)
mPpModuleInitEns |= ISPP_MODULE_ORB;
else
mPpModuleInitEns &= ~ISPP_MODULE_ORB;
}
}
}
#if defined(ISP_HW_V20)
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;
}
#endif
bool CamHwIsp20::getParamsForEffMap(uint32_t frameId)
{
if (_effecting_ispparam_map.count(frameId) <= 0) {
if (mEffectIspParamsPool->has_free_items()) {
_effecting_ispparam_map[frameId] = mEffectIspParamsPool->get_item();
return true;
} else {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no free eff ispparam");
return false;
}
}
return true;
}
XCamReturn
CamHwIsp20::setIspConfig(cam3aResultList* result_list)
{
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, queued cnts:%d \n",
mIspParamsDev->get_queued_bufcnt());
return XCAM_RETURN_ERROR_PARAM;
}
} else
return XCAM_RETURN_BYPASS;
#ifndef DISABLE_PARAMS_ASSEMBLER
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;
}
#else
cam3aResultList& ready_results = *result_list;
frameId = (*ready_results.begin())->getId();
#endif
LOGD_CAMHW("----------%s, cam%d start config id(%d)'s isp params", __FUNCTION__, mCamPhyId, frameId);
// add isp dgain results to ready results
SensorHw* mSensorSubdev = mSensorDev.get_cast_ptr<SensorHw>();
if (mSensorSubdev) {
SmartPtr<RkAiqSensorExpParamsProxy> expParam;
if (mSensorSubdev->getEffectiveExpParams(expParam, frameId) < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "frame_id(%d), get exposure failed!!!\n", frameId);
} else {
expParam->setType(RESULT_TYPE_EXPOSURE_PARAM);
ready_results.push_back(expParam);
}
}
if (v4l2buf.ptr()) {
#if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
struct isp32_isp_params_cfg* isp_params =
(struct isp32_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
#elif defined(ISP_HW_V30)
struct isp3x_isp_params_cfg* isp_params =
(struct isp3x_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
#elif defined(ISP_HW_V21)
struct isp21_isp_params_cfg* isp_params =
(struct isp21_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
#else
struct isp20_isp_params_cfg* isp_params =
(struct isp20_isp_params_cfg*)v4l2buf->get_buf().m.userptr;
#endif
int buf_index = v4l2buf->get_buf().index;
bool isMultiIsp = mIsMultiIspMode;
bool extened_pixel = mMultiIspExtendedPixel;
isp_params->module_en_update = 0;
isp_params->module_cfg_update = 0;
isp_params->module_ens = 0;
if (merge_isp_results(ready_results, isp_params, mIsMultiIspMode) != XCAM_RETURN_NO_ERROR)
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "ISP parameter translation error\n");
if (isp_params->module_cfg_update == 0 &&
isp_params->module_en_update == 0) {
mIspParamsDev->return_buffer_to_pool(v4l2buf);
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "no new ISP parameters to drv");
return ret;
}
isp_params->module_cfg_update |= ISP32_MODULE_FORCE;
// 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;
#if defined(ISP_HW_V30)
if(mIsMultiIspMode == false) {
dynamic_cast<Isp3xParams*>(this)->fixedAwbOveflowToIsp3xParams(isp_params, mIsMultiIspMode);
}
#endif
#if defined(RKAIQ_HAVE_MULTIISP) && defined(ISP_HW_V30)
struct isp3x_isp_params_cfg ori_params;
if (mIsMultiIspMode) {
ori_params = *isp_params;
mParamsSplitter->SplitIspParams(&ori_params, isp_params);
dynamic_cast<Isp3xParams*>(this)->fixedAwbOveflowToIsp3xParams((void*)isp_params, mIsMultiIspMode);
}
#endif
#if defined(RKAIQ_HAVE_MULTIISP) && defined(ISP_HW_V32)
struct isp32_isp_params_cfg ori_params;
if (mIsMultiIspMode) {
ori_params = *isp_params;
mParamsSplitter->SplitIspParams(&ori_params, isp_params);
}
#endif
#if defined(RKAIQ_ENABLE_SPSTREAM)
if (mAfParams) {
RkAiqIspAfParamsProxy* afParams =
mAfParams.get_cast_ptr<RkAiqIspAfParamsProxy>();
if (mSpStreamUnit.ptr()) {
mSpStreamUnit->update_af_meas_params(&afParams->data()->result);
}
}
#endif
#if defined(RKAIQ_HAVE_MULTIISP) && (defined(ISP_HW_V30) || defined(ISP_HW_V32))
if (mIsMultiIspMode)
updateEffParams(isp_params, &ori_params);
else
updateEffParams(isp_params, NULL);
#else
updateEffParams(isp_params, NULL);
#endif
bool is_wait_params_done = false;
if (mTbInfo.prd_type != RK_AIQ_PRD_TYPE_NORMAL) {
// skip the params
if (processTb(isp_params)) {
mIspParamsDev->return_buffer_to_pool(v4l2buf);
return XCAM_RETURN_NO_ERROR;
}
if (mTbInfo.is_pre_aiq && frameId == 0)
is_wait_params_done = true;
}
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;
}
#ifdef DISABLE_PARAMS_POLL_THREAD
int timeout = is_wait_params_done ? 100 : 1;
int buf_counts = mIspParamsDev->get_buffer_count ();
int try_time = 3;
while (mIspParamsDev->get_queued_bufcnt() > 2 || is_wait_params_done) {
if (mIspParamsDev->poll_event (timeout, -1) <= 0) {
LOGW_CAMHW_SUBM(ISP20HW_SUBM, "poll params error, queue cnts: %d !",
mIspParamsDev->get_queued_bufcnt());
if (mIspParamsDev->get_queued_bufcnt() == buf_counts && try_time > 0) {
timeout = 30;
try_time--;
continue;
} else
break;
}
SmartPtr<V4l2Buffer> buf;
ret = mIspParamsDev->dequeue_buffer (buf);
if (ret != XCAM_RETURN_NO_ERROR) {
XCAM_LOG_WARNING ("dequeue buffer failed");
//return ret;
} else {
if (is_wait_params_done) {
is_wait_params_done = false;
SmartPtr<VideoBuffer> video_buf = new V4l2BufferProxy (buf, mIspParamsDev);
video_buf->_buf_type = ISP_POLL_PARAMS;
LOGK_CAMHW("<TB> poll param id:%d, call err_cb", frameId);
CamHwBase::poll_buffer_ready(video_buf);
}
mIspParamsDev->return_buffer_to_pool(buf);
}
}
#endif
_isp_module_ens |= isp_params->module_ens & isp_params->module_en_update;
LOGD_CAMHW_SUBM(
ISP20HW_SUBM,
"Config id(%u)'s isp params, full_en 0x%llx ens 0x%llx ens_up 0x%llx, cfg_up 0x%llx", isp_params->frame_id,
_isp_module_ens,
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;
}
#if defined(ISP_HW_V20)
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;
}
#endif
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));
#ifndef USE_RAWSTREAM_LIB
ret = mRawCapUnit->get_tx_device(0)->get_format(format);
#endif
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) {
BaseSensorHw* sensorHw;
sensorHw = mSensorDev.get_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)
{
#if defined(RKAIQ_ENABLE_SPSTREAM)
return mSpStreamUnit->get_sp_resolution(width, height, aligned_w, aligned_h);
#else
return XCAM_RETURN_NO_ERROR;
#endif
}
#if RKAIQ_HAVE_PDAF
bool CamHwIsp20::get_pdaf_support()
{
bool pdaf_support = false;
if (mPdafStreamUnit.ptr())
pdaf_support = mPdafInfo.pdaf_support;
return pdaf_support;
}
#endif
void CamHwIsp20::notify_isp_stream_status(bool on)
{
if (on) {
LOGK_CAMHW_SUBM(ISP20HW_SUBM, "camId:%d, %s on", mCamPhyId, __func__);
XCamReturn ret = hdr_mipi_start_mode(_hdr_mode);
if (ret < 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "hdr mipi start err: %d\n", ret);
}
_isp_stream_status = ISP_STREAM_STATUS_STREAM_ON;
if (mHwResLintener) {
SmartPtr<Isp20Evt> ispEvt =
new Isp20Evt(this, mSensorDev.dynamic_cast_ptr<SensorHw>());
SmartPtr<V4l2Device> dev(NULL);
SmartPtr<Isp20EvtBuffer> ispEvtbuf =
new Isp20EvtBuffer(ispEvt, dev);
ispEvtbuf->_buf_type = VICAP_STREAM_ON_EVT;
SmartPtr<VideoBuffer> vbuf = ispEvtbuf.dynamic_cast_ptr<VideoBuffer>();
// FIXME: [Baron] 2022-06-29, all rx started, tx start
if (!_linked_to_1608) {
mHwResLintener->hwResCb(vbuf);
} else {
waitLastSensorDone();
mHwResLintener->hwResCb(vbuf);
}
}
} else {
LOGK_CAMHW_SUBM(ISP20HW_SUBM, "camId:%d, %s off", mCamPhyId, __func__);
_isp_stream_status = ISP_STREAM_STATUS_STREAM_OFF;
// if CIFISP_V4L2_EVENT_STREAM_STOP event is listened, isp driver
// will wait isp params streaming off
{
SmartLock locker(_stop_cond_mutex);
#ifndef DISABLE_PARAMS_POLL_THREAD
if (mIspParamStream.ptr())
mIspParamStream->stop();
#else
if (mIspParamsDev.ptr())
mIspParamsDev->stop();
#endif
}
hdr_mipi_stop();
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "camId:%d, %s off done", mCamPhyId, __func__);
}
}
XCamReturn CamHwIsp20::reset_hardware()
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
#ifndef USE_RAWSTREAM_LIB
if (mRawCapUnit.ptr()) {
ret = mRawCapUnit->reset_hardware();
}
#endif
return ret;
}
XCamReturn
CamHwIsp20::waitLastSensorDone()
{
SmartLock lock (_sync_1608_mutex);
while (!_sync_1608_done) {
_sync_done_cond.timedwait(_sync_1608_mutex, 100000ULL);
}
return XCamReturn();
}
XCamReturn
CamHwIsp20::pixFmt2Bpp(uint32_t pixFmt, int8_t& bpp)
{
switch (pixFmt) {
case V4L2_PIX_FMT_SBGGR8:
case V4L2_PIX_FMT_SGBRG8:
case V4L2_PIX_FMT_SGRBG8:
case V4L2_PIX_FMT_SRGGB8:
bpp = 8;
break;
case V4L2_PIX_FMT_SBGGR10:
case V4L2_PIX_FMT_SGBRG10:
case V4L2_PIX_FMT_SGRBG10:
case V4L2_PIX_FMT_SRGGB10:
bpp = 10;
break;
case V4L2_PIX_FMT_SBGGR12:
case V4L2_PIX_FMT_SGBRG12:
case V4L2_PIX_FMT_SGRBG12:
case V4L2_PIX_FMT_SRGGB12:
bpp = 12;
break;
case V4L2_PIX_FMT_SBGGR14:
case V4L2_PIX_FMT_SGBRG14:
case V4L2_PIX_FMT_SGRBG14:
case V4L2_PIX_FMT_SRGGB14:
bpp = 14;
break;
case V4L2_PIX_FMT_SBGGR16:
case V4L2_PIX_FMT_SGBRG16:
case V4L2_PIX_FMT_SGRBG16:
case V4L2_PIX_FMT_SRGGB16:
bpp = 16;
break;
default:
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "unknown format");
return XCAM_RETURN_ERROR_PARAM;
}
return XCAM_RETURN_NO_ERROR;
}
XCamReturn
CamHwIsp20::rawReproc_genIspParams (uint32_t sequence, rk_aiq_frame_info_t *offline_finfo, int mode)
{
XCamReturn ret;
if (mode) {
if (offline_finfo) {
SensorHw* mSensor = mSensorDev.get_cast_ptr<SensorHw>();
ret = mSensor->set_offline_effecting_exp_map(sequence + 1, offline_finfo);
}
struct v4l2_event event;
event.u.frame_sync.frame_sequence = sequence;
mIspSofStream->stop();
SmartPtr<VideoBuffer> buf =
mIspSofStream->new_video_buffer(event, NULL);
CamHwBase::poll_buffer_ready(buf);
} else {
// wait until params of frame index 'sequence' have been done
int8_t wait_times = 100;
while ((sequence > _curIspParamsSeq) && (wait_times-- > 0)) {
usleep(10 * 1000);
}
if (wait_times == 0) {
LOGE_CAMHW_SUBM(ISP20HW_SUBM, "wait params %d(cur:%d) done over 1 seconds !", sequence, _curIspParamsSeq);
} else {
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "wait params %d(cur:%d) success !", sequence, _curIspParamsSeq);
}
}
return XCAM_RETURN_NO_ERROR;
}
const char*
CamHwIsp20::rawReproc_preInit(const char* isp_driver, const char* offline_sns_ent_name)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
ENTER_XCORE_FUNCTION();
int isp_driver_index = -1;
if (!isp_driver) {
return NULL;
} else {
#ifdef ISP_HW_V30
char* isp_driver_name = const_cast<char*>(isp_driver);
char *rkisp = strstr(isp_driver_name, "rkisp");
if (rkisp) {
int isp_mode = atoi(rkisp + strlen("rkisp"));
char* vir = strstr(isp_driver_name, "vir");
if (vir) {
int vir_idx = atoi(vir + strlen("vir"));
isp_driver_index = isp_mode * 4 + vir_idx;
}
}
#else
if (strcmp(isp_driver, "rkisp0") == 0 ||
strcmp(isp_driver, "rkisp") == 0)
isp_driver_index = 0;
else if (strcmp(isp_driver, "rkisp1") == 0)
isp_driver_index = 1;
else if (strcmp(isp_driver, "rkisp2") == 0)
isp_driver_index = 2;
else if (strcmp(isp_driver, "rkisp3") == 0)
isp_driver_index = 3;
else
isp_driver_index = -1;
#endif
}
std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator iter;
std::unordered_map<std::string, SmartPtr<rk_aiq_static_info_t> >::iterator iter_info;
for (iter = CamHwIsp20::mSensorHwInfos.begin(); \
iter != CamHwIsp20::mSensorHwInfos.end(); iter++) {
rk_sensor_full_info_t *s_full_info_f = iter->second.ptr();
if (s_full_info_f->isp_info) {
if (s_full_info_f->isp_info->model_idx != isp_driver_index) {
continue;
}
rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t;
*s_full_info = *s_full_info_f;
iter_info = CamHwIsp20::mCamHwInfos.find(iter->first);
if (iter_info == CamHwIsp20::mCamHwInfos.end()) {
continue;
}
rk_aiq_static_info_t *cam_hw_info_f = iter_info->second.ptr();
rk_aiq_static_info_t *cam_hw_info = new rk_aiq_static_info_t;
*cam_hw_info = *cam_hw_info_f;
char sensor_name_real[64];
if (!strstr(s_full_info->sensor_name.c_str(), offline_sns_ent_name)) {
int module_index = 0;
std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator sns_it;
for (sns_it = CamHwIsp20::mSensorHwInfos.begin(); \
sns_it != CamHwIsp20::mSensorHwInfos.end(); sns_it++) {
rk_sensor_full_info_t *sns_full = sns_it->second.ptr();
if (strstr(sns_full->sensor_name.c_str(), "_s_")) {
int sns_index = atoi(sns_full->sensor_name.c_str() + 2);
if (module_index <= sns_index) {
module_index = sns_index + 1;
}
}
}
std::string tmp_sensor_name = s_full_info_f->sensor_name;
s_full_info->phy_module_orient = 's';
memset(sensor_name_real, 0, sizeof(sensor_name_real));
sprintf(sensor_name_real, "%s%d%s%s%s", "m0", module_index, "_s_",
offline_sns_ent_name,
" 1-111a");
std::string sns_fake_name = sensor_name_real;
s_full_info->sensor_name = sns_fake_name;
CamHwIsp20::mFakeCameraName[s_full_info->sensor_name] = tmp_sensor_name;
CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = cam_hw_info;
CamHwIsp20::mSensorHwInfos.erase(tmp_sensor_name);
CamHwIsp20::mCamHwInfos.erase(tmp_sensor_name);
iter_info++;
return s_full_info->sensor_name.c_str();
} else {
std::string tmp_sensor_name = s_full_info_f->sensor_name;
s_full_info->phy_module_orient = 's';
memset(sensor_name_real, 0, sizeof(sensor_name_real));
sprintf(sensor_name_real, "%s%s%s%s", s_full_info->module_index_str.c_str(), "_s_",
s_full_info->module_real_sensor_name.c_str(),
" 1-111a");
std::string sns_fake_name = sensor_name_real;
s_full_info->sensor_name = sns_fake_name;
CamHwIsp20::mFakeCameraName[s_full_info->sensor_name] = tmp_sensor_name;
CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
CamHwIsp20::mCamHwInfos[s_full_info->sensor_name] = cam_hw_info;
CamHwIsp20::mSensorHwInfos.erase(tmp_sensor_name);
CamHwIsp20::mCamHwInfos.erase(tmp_sensor_name);
iter_info++;
return s_full_info->sensor_name.c_str();
}
}
}
LOGI_CAMHW_SUBM(ISP20HW_SUBM, "offline preInit faile\n");
return NULL;
EXIT_XCORE_FUNCTION();
}
XCamReturn
CamHwIsp20::rawReproc_deInit(const char* fakeSensor)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
std::string fake_sns_name = std::string(fakeSensor);
std::string real_sns_name = "";
std::unordered_map<std::string, std::string>::iterator it_sns_name;
it_sns_name = CamHwIsp20::mFakeCameraName.find(fake_sns_name);
if (it_sns_name == CamHwIsp20::mFakeCameraName.end()) {
return XCAM_RETURN_BYPASS;
}
real_sns_name = it_sns_name->second;
std::unordered_map<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator it;
std::unordered_map<std::string, SmartPtr<rk_aiq_static_info_t> >::iterator it_info;
it = CamHwIsp20::mSensorHwInfos.find(fake_sns_name);
it_info = CamHwIsp20::mCamHwInfos.find(fake_sns_name);
if (it != CamHwIsp20::mSensorHwInfos.end()) {
rk_sensor_full_info_t *s_full_info_f = it->second.ptr();
rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t;
*s_full_info = *s_full_info_f;
s_full_info->sensor_name = real_sns_name;
CamHwIsp20::mSensorHwInfos[s_full_info->sensor_name] = s_full_info;
CamHwIsp20::mSensorHwInfos.erase(it);
}
if (it_info != CamHwIsp20::mCamHwInfos.end()) {
rk_aiq_static_info_t *cam_hw_info_f = it_info->second.ptr();
rk_aiq_static_info_t *cam_hw_info = new rk_aiq_static_info_t;
*cam_hw_info = *cam_hw_info_f;
CamHwIsp20::mCamHwInfos[real_sns_name] = cam_hw_info;
CamHwIsp20::mCamHwInfos.erase(it_info);
}
CamHwIsp20::mFakeCameraName.erase(it_sns_name);
return ret;
}
XCamReturn
CamHwIsp20::rawReProc_prepare (uint32_t sequence, rk_aiq_frame_info_t *offline_finfo)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
SensorHw* mSensor = mSensorDev.get_cast_ptr<SensorHw>();
ret = mSensor->set_offline_effecting_exp_map(sequence, &offline_finfo[0]);
ret = mSensor->set_offline_effecting_exp_map(sequence + 1, &offline_finfo[1]);
return ret;
}
XCamReturn
CamHwIsp20::setCifSclStartFlag(int ratio, bool mode)
{
XCamReturn ret = XCAM_RETURN_NO_ERROR;
if (mode == mCifScaleStream->getIsActive())
return ret;
auto it = mSensorHwInfos.find(sns_name);
if ( it == 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();
ret = mCifScaleStream->restart(s_info, ratio, this, mode);
return ret;
}
} //namspace RkCam