Files
TAIXIN/sdk/lib/video/isp/isp_tunning.c

691 lines
28 KiB
C
Raw Normal View History

#include "basic_include.h"
#include "hal/isp_tunning.h"
#include "hal/isp.h"
#include "hal/dual_org.h"
#include "lib/multimedia/framebuff.h"
#include "lib/multimedia/msi.h"
#include "lib/video/dvp/jpeg/jpg.h"
#if ISP_TUNNING_EN
struct isp_tunnning_dev *isp_tunning = NULL;
void isp_tunning_response(struct isp_tunnning_dev *p_dev, uint16 ret_val)
{
uint16 crc_val = 0;
os_memset(p_dev->response, 0, 8);
p_dev->response[0] = p_dev->tunning_head;
p_dev->response[1] = p_dev->cmd_num;
p_dev->response[2] = ret_val;
crc_val = hw_crc(CRC_TYPE_CRC16_MODBUS, (void *)p_dev->response, 6);
p_dev->response[3] = crc_val;
p_dev->response[5] = 0x0a;
p_dev->write_handle(p_dev->device, 0, (void *)p_dev->response, sizeof(p_dev->response));
}
void isp_tunning_message_head(struct isp_tunnning_dev *p_dev, uint32 data_addr, uint32 data_len)
{
p_dev->message_head[0] = p_dev->tunning_head;
p_dev->message_head[1] = p_dev->cmd_num;
p_dev->message_head[2] = (data_len >> 0) & 0xffff;
p_dev->message_head[3] = (data_len >> 16) & 0xffff;
p_dev->message_head[4] = hw_crc(CRC_TYPE_CRC16_MODBUS, (void *)data_addr, data_len);
p_dev->message_head[5] = hw_crc(CRC_TYPE_CRC16_MODBUS, (void *)p_dev->message_head, TUNNING_PACKAGE_INFO_SIZE - 2 - 4);
p_dev->message_head[6] = 0x00;
p_dev->message_head[7] = 0x0a;
p_dev->write_handle(p_dev->device, 0, (void *)p_dev->message_head, TUNNING_PACKAGE_INFO_SIZE);
}
uint32 isp_tunning_get_img(struct isp_tunnning_dev *p_dev)
{
uint32 ret_val = TUNNING_ERR_CODE_RIGHT;
uint32 flen = 0;
uint32 offset = 0;
uint8 *img_addr = NULL;
struct framebuff *get_f = NULL;
uint8 get_max = 10;
uint8 get_idx = 0;
uint8 first_packet = 0;
while((++get_idx) <= get_max)
{
__retry:
get_f = msi_get_fb(p_dev->v_msi, 100);
if (get_f)
{
if (abs(get_f->time - os_jiffies()) > 100)
{
msi_delete_fb(NULL, get_f);
get_f = NULL;
goto __retry;
}
flen = get_f->len;
img_addr = get_f->data;
p_dev->write_data.addr = os_zalloc(TUNNING_PACKET_SIZE+4);
if (p_dev->write_data.addr)
{
// os_printf("%s %d addr : %08x\r\n", __func__, __LINE__, (uint32)p_dev->write_data.addr);
isp_tunning_message_head(p_dev, (uint32)img_addr, flen);
p_dev->write_data.addr[TUNNING_PACKET_SIZE+0] = 0x00;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+1] = 0x00;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+2] = 0x0d;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+3] = 0x0a;
while (flen)
{
offset = (flen > TUNNING_PACKET_SIZE) ? (TUNNING_PACKET_SIZE) : (flen);
hw_memcpy((void *)p_dev->write_data.addr, img_addr, offset);
img_addr += offset;
flen -= offset;
if (offset < TUNNING_PACKET_SIZE)
{
p_dev->write_data.addr[offset+0] = 0x00;
p_dev->write_data.addr[offset+1] = 0x00;
p_dev->write_data.addr[offset+2] = 0x0d;
p_dev->write_data.addr[offset+3] = 0x0a;
}
p_dev->write_handle(p_dev->device, 0, (void *)p_dev->write_data.addr, offset+4);
if (first_packet == 0) {
os_sleep_ms(10);
first_packet = 1;
}else {
os_sleep_ms(1);
}
}
os_free(p_dev->write_data.addr);
} else {
ret_val = TUNNING_ERR_CODE_MALLOC_ERR;
os_printf("%s %d malloc size : %d err\r\n", __func__, __LINE__, TUNNING_PACKET_SIZE);
goto __err;
}
break;
}
}
if ((get_idx > get_max) && (get_f == NULL))
{
ret_val = TUNNING_ERR_CODE_GET_PARAM_ERR;
os_printf("%s %d get frame err\r\n", __func__, __LINE__);
goto __err;
}
goto __end;
__err:
isp_tunning_response(p_dev, ret_val);
__end:
if(get_f)
{
msi_delete_fb(NULL, get_f);
p_dev->v_msi->enable = 0;
while(1)
{
get_f = msi_get_fb(p_dev->v_msi, 0);
if (get_f)
{
msi_delete_fb(NULL, get_f);
} else {
break;
}
}
get_f = NULL;
}
return ret_val;
}
void isp_tunning_get_raw(struct isp_tunnning_dev *p_dev)
{
uint32 ret_val = TUNNING_ERR_CODE_RIGHT;
uint32 flen = 0;
uint32 offset = 0;
uint8 first_packet = 0;
p_dev->backup_addr = dual_save_cfg(p_dev->p_dual, p_dev->cmd_channel, (uint32)&flen);
p_dev->write_data.size = TUNNING_PACKET_SIZE;
p_dev->write_data.addr = os_zalloc(TUNNING_PACKET_SIZE+4);
if (p_dev->write_data.addr)
{
// os_printf("%s %d addr : %08x src : %08x flen : %d\r\n", __func__, __LINE__, (uint32)p_dev->write_data.addr, p_dev->backup_addr, flen);
while(!dual_save_status(p_dev->p_dual));
sys_dcache_invalid_range((void *)p_dev->backup_addr, flen);
isp_tunning_message_head(p_dev, p_dev->backup_addr, flen);
p_dev->write_data.addr[TUNNING_PACKET_SIZE+0] = 0x00;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+1] = 0x00;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+2] = 0x0d;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+3] = 0x0a;
while (flen)
{
// os_printf("%s %d flen : %d\r\n", __func__, __LINE__, flen);
offset = (flen > TUNNING_PACKET_SIZE) ? (TUNNING_PACKET_SIZE) : (flen);
hw_memcpy((void *)p_dev->write_data.addr, (void *)p_dev->backup_addr, offset);
p_dev->backup_addr += offset;
flen -= offset;
if (offset < TUNNING_PACKET_SIZE)
{
p_dev->write_data.addr[offset+0] = 0x00;
p_dev->write_data.addr[offset+1] = 0x00;
p_dev->write_data.addr[offset+2] = 0x0d;
p_dev->write_data.addr[offset+3] = 0x0a;
}
p_dev->write_handle(p_dev->device, 0, (void *)p_dev->write_data.addr, offset+4);
if (first_packet == 0) {
os_sleep_ms(10);
first_packet = 1;
}else {
os_sleep_ms(1);
}
}
dual_recover_cfg(p_dev->p_dual);
os_free(p_dev->write_data.addr);
} else {
os_printf("%s %d get package_size : %d err\r\n", __func__, __LINE__, TUNNING_PACKET_SIZE);
ret_val = TUNNING_ERR_CODE_MALLOC_ERR;
goto __err;
}
return;
__err:
isp_tunning_response(p_dev, ret_val);
return;
}
void isp_tunning_dump_data(struct isp_tunnning_dev *p_dev, uint32 data_addr, uint32 data_size)
{
uint32 ret_val = 0;
uint32 flen = data_size;
uint32 first_packet = 0;
uint32 offset = 0;
uint32 faddr = data_addr;
p_dev->write_data.addr = os_malloc(TUNNING_PACKET_SIZE + 4);
if (p_dev->write_data.addr)
{
isp_tunning_message_head(p_dev, faddr, flen);
p_dev->write_data.addr[TUNNING_PACKET_SIZE+0] = 0x00;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+1] = 0x00;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+2] = 0x0d;
p_dev->write_data.addr[TUNNING_PACKET_SIZE+3] = 0x0a;
while (flen)
{
offset = (flen > TUNNING_PACKET_SIZE) ? (TUNNING_PACKET_SIZE) : (flen);
hw_memcpy((void *)p_dev->write_data.addr, (void *)faddr, offset);
faddr += offset;
flen -= offset;
if (offset < TUNNING_PACKET_SIZE)
{
p_dev->write_data.addr[offset+0] = 0x00;
p_dev->write_data.addr[offset+1] = 0x00;
p_dev->write_data.addr[offset+2] = 0x0d;
p_dev->write_data.addr[offset+3] = 0x0a;
}
p_dev->write_handle(p_dev->device, 0, (void *)p_dev->write_data.addr, offset+4);
if (first_packet == 0) {
os_sleep_ms(10);
first_packet = 1;
}else {
os_sleep_ms(1);
}
}
os_free(p_dev->write_data.addr);
} else {
os_printf("%s %d malloc write_data err\r\n", __func__, __LINE__);
goto __err;
}
return;
__err:
isp_tunning_response(p_dev, ret_val);
return;
}
void isp_tunning_thread(void *dev)
{
uint32 ret_val = 0;
uint8 response_flag = 1;
scatter_data dump_data;
struct isp_tunnning_dev *p_dev = (struct isp_tunnning_dev *)dev;
os_memset(&dump_data, 0, sizeof(scatter_data));
while(1)
{
response_flag = 1;
os_sema_down((void *)&p_dev->usb_cmd_sema, -1);
switch (p_dev->cmd_num)
{
case ISP_IOCTL_CMD_3DNR_ENABLE:
isp_3dnr_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_IMG_MIRROR:
isp_mirror_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_IMG_REVERSE:
isp_reverse_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_GET_IMG:
p_dev->v_msi->enable = 1;
ret_val = isp_tunning_get_img(p_dev);
response_flag = 0;
break;
case ISP_IOCTL_CMD_AWB_MANNUL_MODE_TYPE:
isp_awb_mannul_mode_type(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_CONTROL_STEP:
isp_awb_control_step_config(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_CONTROL_THR:
isp_awb_control_thr_config(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->p_data[3], p_dev->p_data[4], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_AUTO_CTRL:
isp_awb_auto_config(p_dev->p_isp, p_dev->p_data[0], (void *)&p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_FINE_CONSTRAINT_CTRL:
isp_awb_fine_constraint_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_COARSE_CONSTRAINT_CTRL:
isp_awb_coarse_constraint_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_MEAS_MODE:
isp_awb_measure_mode_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_WP_EXPECT:
isp_awb_wp_expect_val(p_dev->p_isp, p_dev->p_data[1], p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_WP_RANGE_CONSTRAINT:
isp_awb_cbcr_constraint(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_WP_RANGE_CONSTRAINTF:
isp_awb_cbcr_constraintf(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_WP_RANGE_CONSTRAINT_RESTRAIN:
isp_awb_cbcr_constraint_restrain(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_RGB_CONSTRAINT:
isp_awb_rgb_constraint(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_WP_NUM_RESTRAIN:
isp_awb_wp_constraint(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_GAIN_TYPE:
isp_awb_gain_type(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_GAIN_CONSTRAINT:
isp_awb_gain_constraint(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_GAIN_COARSE_CONSTRAINT:
isp_awb_gain_coarse_constraint(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_GAIN_FINE_CONSTRAINT:
isp_awb_gain_fine_constraint(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AWB_CROP_RANGE:
ret_val = isp_awb_crop_range(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->p_data[3], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_MANUAL_PARAM:
isp_ae_manul_config(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ROW_TIME_US:
isp_ae_row_time(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ANALOG_GAIN:
isp_ae_analog_gain(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_EXPOSURE_LINE:
isp_ae_exposure_line(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_CONFIG_INTERVAL:
isp_ae_interval_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_DAY_NIGHT_BV:
isp_ae_day_night_bv(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_SCENE_LUT:
isp_ae_scene_lut(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_LOWLIGHT_PARAM:
isp_ae_lowlight_param(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_FRAME_MAX:
isp_ae_frame_max(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_LOCK_PARAM:
isp_ae_lock_param(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_REDUCE_FPS:
isp_ae_reduce_fps(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_LOWLIGHT_LSB_GAIN_EN:
isp_ae_lowlight_gain_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_LOWLIGHT_LSB_GAIN_4HI_FPS:
isp_ae_lowlight_gain_high_gain(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_LOWLIGHT_LSB_GAIN_4LO_FPS:
isp_ae_lowlight_gain_low_gain(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_HIST_HS_BIN_THR:
isp_ae_hist_hs_bin_thr(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_LUMA_TARGET:
isp_ae_luma_target_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_LUMA_WEIGHT:
isp_ae_luma_weight_config(p_dev->p_isp, p_dev->p_data[0], (void *)&p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_LUMA_MAX:
isp_ae_abl_luma_max(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_POS_THR:
isp_ae_pos_thr(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_HIST_THR:
isp_ae_hist_thr(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_AOE_EXPO_GAIN:
isp_ae_aoe_gain(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_LOCK_THR:
isp_ae_abl_lock(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_BRIGHT_DARK_PIXEL_RATIO:
isp_ae_brihgt_dark_pixel_ratio(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->p_data[3], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_DARK_BRIGHT_POS_THR:
isp_ae_abl_dark_bright_pos_ratio(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_AOE_DARK_BRIGHT_POS_THR:
isp_ae_aoe_dark_bright_pos_ratio(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_GAIN_MODE:
isp_ae_abl_gain_type(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_EXPO_LINE_RATIO:
isp_ae_abl_expo_line_ratio(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_EXPO_GAIN_THR:
isp_ae_abl_expo_gain_set(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_ABL_BV_THR:
isp_ae_abl_bv_thr(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_AOE_BV_THR:
isp_ae_aoe_bv_thr(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_HIST_PIXEL_THR:
isp_ae_hist_pixel_thr(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_STG_PARAM:
ret_val = isp_ae_stg_param(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_EV_OFFSET_TYPE:
isp_ae_ev_offset_type(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_AE_CROP_RANGE:
isp_ae_crop_range(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_HIST_CROP_RANGE:
isp_hist_crop_range(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CCM_ARRAY:
isp_ccm_config(p_dev->p_isp, (void *)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_BLC_PARAM:
isp_blc_config(p_dev->p_isp, (void *)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_MD_WINDOW_PARAM:
isp_md_window_config(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->p_data[3], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_MD_DETECT_PARAM:
isp_md_param_config(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CSC_PARAM:
isp_csc_config(p_dev->p_isp, (void *)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_DPC_PARAM:
isp_dpc_config(p_dev->p_isp, (void *)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_YUV_RANGE:
isp_ce_yuv_range(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_LUMA:
isp_ce_luma_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_SATURATION:
isp_ce_saturation_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_CONTRAST:
isp_ce_contrast_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_HUE:
isp_ce_hue_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_OFFSET_PARAM:
isp_ce_offset_config(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CE_ADJ_BY_BV_PARAM:
isp_ce_adj_by_bv_param(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_SHARP_PARAM:
isp_sharp_param(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_RAWNR_MAP:
isp_rawnr_map(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], (uint32)&p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_YUVNR_MAP:
isp_yuvnr_map(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], (uint32)&p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_CSUPP_MAP:
isp_csupp_map(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], (uint32)&p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_Y_GAMMA_TUNNING:
isp_y_gamma_tunning(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_RGB_GAMMA_TUNNING:
isp_rgb_gamma_tunning(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_LSC_TUNNING:
isp_lsc_tunning(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_GIC_PARAM:
isp_gic_init(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_LHS_MAP:
isp_lhs_map(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], (uint32)&p_dev->p_data[2], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_GET_SENSOR_RAW:
isp_tunning_get_raw(p_dev);
response_flag = 0;
break;
case ISP_IOCTL_CMD_GET_Y_GAMMA:
case ISP_IOCTL_CMD_GET_SENSOR_YGAMMA:
case ISP_IOCTL_CMD_GET_RGB_GAMMA:
case ISP_IOCTL_CMD_GET_LSC:
case ISP_IOCTL_CMD_DUMP_SRAM_PARAM:
case ISP_IOCTL_CMD_DUMP_REG_PARAM:
ret_val = isp_ioctl(p_dev->p_isp, p_dev->cmd_num, p_dev->cmd_channel, (uint32)&dump_data);
//os_printf("%s %d dump addr :%08x dump_data : %08x\r\n", __func__, __LINE__, (uint32)dump_data.addr, dump_data.size);
if (!ret_val) isp_tunning_dump_data(p_dev, (uint32)dump_data.addr, dump_data.size);
response_flag = 0;
break;
case ISP_IOCTL_CMD_CONFIG_SRAM_PARAM:
isp_sensor_sram_param_config(p_dev->p_isp, p_dev->cmd_channel, (uint32)p_dev->p_data);
break;
case ISP_IOCTL_CMD_FUNC_ENABLE:
ret_val = isp_sensor_func_enable(p_dev->p_isp, p_dev->cmd_channel, (uint32)p_dev->p_data[0]);
break;
case ISP_IOCTL_CMD_WDR_EN:
isp_wdr_en_config(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_WDR_NOISE_FLOOR:
isp_wdr_noise_floor_config(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_WDR_TUNNING:
isp_wdr_tunning(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_GAMMA_BY_BV_PARAM:
isp_gamma_by_bv_param(p_dev->p_isp, (uint32)p_dev->p_data, p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_GAMMA_BY_BV_ENABLE:
isp_gamma_by_bv_enable(p_dev->p_isp, p_dev->p_data[0], p_dev->cmd_channel);
break;
case ISP_IOCTL_CMD_FPS_OPT:
{
float value = *(float *)p_dev->p_data;
isp_sensor_fps_opt(p_dev->p_isp, value, p_dev->cmd_channel);
}
break;
case ISP_IOCTL_CMD_DYN_YGAMMA_OPT:
isp_dyn_gamma_param(p_dev->p_isp, p_dev->p_data[0], p_dev->p_data[1], p_dev->cmd_channel);
break;
default:
os_printf("tunning get cmd type : %d err type : %d!\r\n", p_dev->cmd_num, ret_val);
break;
}
if (p_dev->p_data) os_free(p_dev->p_data);
if (response_flag) isp_tunning_response(p_dev, ret_val);
}
}
void isp_tunning_get_img_msi_create(struct isp_tunnning_dev *p_dev, enum tunning_img_type type, uint32 img_w, uint32 img_h, uint32 src)
{
if (type)
{
struct msi *h264_msi_init_with_mode(uint32_t drv1_from, uint32_t drv1_w, uint32_t drv1_h, uint32_t drv2_from, uint32_t drv2_w, uint32_t drv2_h);
p_dev->video_msi = msi_find("auto-h264", 1);//h264_msi_init_with_mode(src, img_w, img_h, 0, 0, 0);
} else {
struct msi *jpg_concat_msi_init_start(uint32_t jpgid,uint16_t w, uint16_t h, uint16_t *filter_type,uint8_t src_from,uint8_t run);
p_dev->video_msi = msi_find("auto-jpg", 1);//jpg_concat_msi_init_start(JPGID0, img_w, img_h, NULL, src,1);
}
if (p_dev->video_msi)
{
p_dev->v_msi = msi_new(TUNNING_IMG_MSI,1,NULL);
if (p_dev->v_msi)
{
// p_dev->v_msi->enable = 1;
msi_add_output(p_dev->video_msi, NULL, TUNNING_IMG_MSI);
} else {
p_dev->video_msi = NULL;
p_dev->v_msi = NULL;
}
} else {
p_dev->video_msi = NULL;
p_dev->v_msi = NULL;
}
}
void isp_tunning_init(uint32 img_w, uint32 img_h)
{
rt_ssize_t cdc_usb_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
isp_tunning = os_zalloc(sizeof(struct isp_tunnning_dev));
if (isp_tunning == NULL)
{
os_printf("%s %d isp_tunning_dev malloc err");
return;
}
os_sema_init(&isp_tunning->usb_write_sema, 0);
os_sema_init(&isp_tunning->usb_cmd_sema , 0);
isp_tunning->tunning_head = 0xb103;
isp_tunning->tunning_succ = 0x55aa;
isp_tunning->tunning_err = 0x5a5a;
isp_tunning->p_isp = (struct isp_device *)dev_get(HG_ISP_DEVID);
isp_tunning->p_dual = (struct dual_device *)dev_get(HG_DUALORG_DEVID);
isp_tunning->write_handle = cdc_usb_write;
isp_tunning_get_img_msi_create(isp_tunning, TUNNING_IMG_JPEG, img_w, img_h, 0);
if ((isp_tunning->p_isp == NULL) || (isp_tunning->p_dual == NULL) || (isp_tunning->video_msi == NULL))
{
os_printf("%s %d get device isp:%d dual:%d msi : %d err", __func__, __LINE__, (isp_tunning->p_isp == NULL), (isp_tunning->p_dual == NULL), (isp_tunning->video_msi == NULL));
os_free(isp_tunning);
return;
}
os_printf("%s %d create succ\r\n", __func__, __LINE__);
os_task_create("isp_tunning_demo", isp_tunning_thread, (void *)isp_tunning, OS_TASK_PRIORITY_NORMAL, 0, NULL, 1024);
}
#endif