📄 usbvideo_cam_if.c
字号:
*
* DESCRIPTION
* This function turn off the power of web camera module.
* complete or not.
*
* PARAMETERS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void usbvideo_camera_power_off(void)
{
usbvideo_cam_operation_state=USBVIDEO_CAM_OFF_STATE;
power_off_isp();
} /* usbvideo_camera_power_off() */
void init_working_mem(void)
{
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
intmem_init((kal_uint32 *) g_usbvideo_camera_data.intmem_start_address,
g_usbvideo_camera_data.intmem_size);
extmem_init((kal_uint32 *) g_usbvideo_camera_data.extmem_start_address,
g_usbvideo_camera_data.extmem_size);
#endif
}
void deinit_working_mem(void)
{
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
intmem_deinit();
extmem_deinit();
#endif
}
void config_usbvideo_preview_jpeg(usbvideo_camera_process_struct* usbvideo_param)
{
kal_uint32 event_group;
volatile kal_uint8 i;
kal_uint16 temp_grab_size;
kal_uint8 usbvideo_sub_sample_mode;
scene_id=SCENARIO_USBVIDEO_CAPTURE_JPEG_ID;
usbvideo_complete_flag = KAL_FALSE;
if((usbvideo_param->target_comp_enum)<1)
usbvideo_param->target_comp_enum = 1;
g_usbvideo_camera_data.image_quality=STILL_COMPRESSION[usbvideo_param->target_comp_enum-1].compression;
g_usbvideo_camera_data.target_buffer_start_address = (kal_uint32)g_usbvideo_cam_buff;
g_usbvideo_camera_data.target_size_enum = g_usbvideo_cam_size;
g_usbvideo_camera_data.intmem_start_address = usbvideo_param->intmem_start_address;
g_usbvideo_camera_data.intmem_size = usbvideo_param->intmem_size;
g_usbvideo_camera_data.extmem_start_address = usbvideo_param->extmem_start_address;
g_usbvideo_camera_data.extmem_size = usbvideo_param->extmem_size;
g_usbvideo_camera_data.usbvideo_cam_preview_cb = usbvideo_param->usbvideo_cam_preview_cb;
g_usbvideo_camera_data.jpeg_gray_mode=0;
/* configure sensor */
exposure_window.image_target_width=g_usbvideo_camera_data.target_width;
exposure_window.image_target_height=g_usbvideo_camera_data.target_height;
exposure_window.digital_zoom_factor=isp_digital_zoom_factor;
// Disable AE Count before Start Preview
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
DISABLE_VIEW_FINDER_MODE;
DISABLE_AE_COUNT;
#endif
sensor_config_data.image_mirror=usbvideo_param->image_mirror;
sensor_config_data.frame_rate=0xF0; // webcam mode
image_sensor_func->sensor_preview_setting(&exposure_window,&sensor_config_data);
#if (!defined(YUV_SENSOR_SUPPORT))
/* accoring the zoom factor to calculate the grab window area */
isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFE);
isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);
if ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
(exposure_window.image_target_height * exposure_window.exposure_window_width))
{ /* x limit */
temp_grab_size=isp_grab_height;
isp_grab_height=isp_grab_width * exposure_window.image_target_height/exposure_window.image_target_width;
isp_grab_start_y+=(((temp_grab_size-isp_grab_height)>>1)&0xFFFE);
}
else
{ /* y limit */
temp_grab_size=isp_grab_width;
isp_grab_width=isp_grab_height * exposure_window.image_target_width/exposure_window.image_target_height;
isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFE);
}
SET_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
SET_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
#else // YUV_SENSOR_SUPPORT
/* accoring the zoom factor to calculate the grab window area */
isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFC);
isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);
if ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
(exposure_window.image_target_height * exposure_window.exposure_window_width))
{ /* x limit */
temp_grab_size=isp_grab_height;
isp_grab_height=(isp_grab_width * exposure_window.image_target_height/exposure_window.image_target_width)&0xFFFE;
isp_grab_start_y+=(((temp_grab_size-isp_grab_height)>>1)&0xFFFE);
}
else
{ /* y limit */
temp_grab_size=isp_grab_width;
isp_grab_width=(isp_grab_height * exposure_window.image_target_width/exposure_window.image_target_height)&0xFFFC;;
isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFC);
}
SET_YUV_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
SET_YUV_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
#endif /* YUV_SENSOR_SUPPORT */
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
DISABLE_CMOS_SESNOR;
#endif
kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
ENABLE_CAMERA_IDLE_INT;
SET_CAMERA_CAPTURE_MODE;
SET_CAMERA_FRAME_RATE(0);
ENABLE_VIEW_FINDER_MODE;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
ENABLE_CMOS_SESNOR;
#endif
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
sensor_config_data.enable_shutter_tansfer=KAL_FALSE;
image_sensor_func->set_sensor_eshutter(eShutter);
image_sensor_func->sensor_capture_setting(&exposure_window,&sensor_config_data);
#if (!defined(YUV_SENSOR_SUPPORT))
/* accoring the zoom factor to calculate the grab window area */
isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFE);
isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);
if ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
(exposure_window.image_target_height * exposure_window.exposure_window_width))
{ /* x limit */
temp_grab_size=isp_grab_height;
isp_grab_height=isp_grab_width * exposure_window.image_target_height/exposure_window.image_target_width;
isp_grab_start_y+=(((temp_grab_size-isp_grab_height)>>1)&0xFFFE);
}
else
{ /* y limit */
temp_grab_size=isp_grab_width;
isp_grab_width=isp_grab_height * exposure_window.image_target_width/exposure_window.image_target_height;
isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFE);
}
SET_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
SET_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
ae_config(isp_grab_width,isp_grab_height);
/* Init Banding Flicker Setting */
if(usbvideo_param->banding_freq == CAM_BANDING_50HZ)
{ /* 50Hz */
usbvideo_attr_PU_value_list[GET_ATTR_PU_IDX(USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY)] = 1;
}
else
{ /* 60Hz or Disable */
usbvideo_attr_PU_value_list[GET_ATTR_PU_IDX(USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY)] = 2;
}
ae_select_band(usbvideo_param->banding_freq);
#if (!defined(MT6219))
apply_camera_shading_to_reg(CAMERA_COMP_PREVIEW_NORMAL_SET);
if(camera_oper_data.preview_defect_table_enable==KAL_TRUE)
{
load_defect_table_para(DEFECT_MODE_PREVIEW);
ENABLE_DEFECT_CORRECTION;
}
else
DISABLE_DEFECT_CORRECTION;
#endif
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
REG_ISP_PREPROCESS_CTRL2 |= REG_PREPROCESS2_AE_COUNT_CLEAR_BIT;
SET_AE_FRAME_INTERVAL(1);
REG_ISP_PREPROCESS_CTRL2 &= ~REG_PREPROCESS2_AE_COUNT_CLEAR_BIT;
if(camera_oper_data.ae_awb_cal_period<4)
camera_oper_data.ae_awb_cal_period = 4;
#endif
#if (defined(MT6219))
if ((isp_grab_width<=g_usbvideo_camera_data.target_width) && (isp_grab_height<=g_usbvideo_camera_data.target_height))
{
usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_1;
g_usbvideo_camera_data.source_width = isp_grab_width;
g_usbvideo_camera_data.source_height=isp_grab_height;
}
else if ((isp_grab_width<=(g_usbvideo_camera_data.target_width<<1)) && (isp_grab_height<=(g_usbvideo_camera_data.target_height<<1)))
{
usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_2;
g_usbvideo_camera_data.source_width=isp_grab_width>>1;
g_usbvideo_camera_data.source_height=isp_grab_height>>1;
}
else if ((isp_grab_width<=(g_usbvideo_camera_data.target_width<<2)) && (isp_grab_height<=(g_usbvideo_camera_data.target_height<<2)))
{
usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_4;
g_usbvideo_camera_data.source_width=isp_grab_width>>2;
g_usbvideo_camera_data.source_height=isp_grab_height>>2;
}
else // if ((isp_grab_width<=(g_usbvideo_camera_data.target_width<<3)) && (isp_grab_height<=(g_usbvideo_camera_data.target_height<<3)))
{
usbvideo_sub_sample_mode=CAMERA_SUB_SAMPLE_1_8;
g_usbvideo_camera_data.source_width=isp_grab_width>>3;
g_usbvideo_camera_data.source_height=isp_grab_height>>3;
}
SET_SUB_SAMPLE_MODE(usbvideo_sub_sample_mode);
#elif (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
ENABLE_VERTICAL_SUB_SAMPLE;
ENABLE_HORIZONTAL_SUB_SAMPLE;
SET_HSUB_SRC_SIZE(isp_grab_width);
SET_VSUB_SRC_SIZE(isp_grab_height);
if((isp_grab_width>(g_usbvideo_camera_data.target_width<<2)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<2)))
{ /* grab size > taget size *4 => ISP subsample 4x */
SET_HSUB_DST_SIZE((isp_grab_width>>2)&0xFFFE);
SET_VSUB_DST_SIZE((isp_grab_height>>2)&0xFFFE);
g_usbvideo_camera_data.source_width=(isp_grab_width>>2)&0xFFFE;
g_usbvideo_camera_data.source_height=(isp_grab_height>>2)&0xFFFE;
}
else if((isp_grab_width>(g_usbvideo_camera_data.target_width<<1)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<1)))
{ /* grab size > taget size *2 => ISP subsample 2x */
SET_HSUB_DST_SIZE((isp_grab_width>>1)&0xFFFE);
SET_VSUB_DST_SIZE((isp_grab_height>>1)&0xFFFE);
g_usbvideo_camera_data.source_width=(isp_grab_width>>1)&0xFFFE;
g_usbvideo_camera_data.source_height=(isp_grab_height>>1)&0xFFFE;
}
else if((isp_grab_width>g_usbvideo_camera_data.target_width) || (isp_grab_height>g_usbvideo_camera_data.target_height))
{
SET_HSUB_DST_SIZE((g_usbvideo_camera_data.target_width)&0xFFFE);
SET_VSUB_DST_SIZE((g_usbvideo_camera_data.target_height)&0xFFFE);
g_usbvideo_camera_data.source_width=(g_usbvideo_camera_data.target_width)&0xFFFE;
g_usbvideo_camera_data.source_height=(g_usbvideo_camera_data.target_height)&0xFFFE;
}
else
{
SET_HSUB_DST_SIZE((isp_grab_width)&0xFFFE);
SET_VSUB_DST_SIZE((isp_grab_height)&0xFFFE);
g_usbvideo_camera_data.source_width=(isp_grab_width)&0xFFFE;
g_usbvideo_camera_data.source_height=(isp_grab_height)&0xFFFE;
}
#endif
/* Wait stable frame */
ae_on_off(KAL_TRUE);
awb_on_off(KAL_TRUE);
#else // YUV_SENSOR_SUPPORT
/* accoring the zoom factor to calculate the grab window area */
isp_grab_width= ((exposure_window.exposure_window_width * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_height=((exposure_window.exposure_window_height * ISP_MIN_DIGITAL_ZOOM_FACTOR) / isp_digital_zoom_factor)&0xFFFC ;
isp_grab_start_x=exposure_window.grab_start_x+ (((exposure_window.exposure_window_width-isp_grab_width)>>1)&0xFFFC);
isp_grab_start_y=exposure_window.grab_start_y+ (((exposure_window.exposure_window_height-isp_grab_height)>>1)&0xFFFE);
if ((exposure_window.image_target_width * exposure_window.exposure_window_height) >=
(exposure_window.image_target_height * exposure_window.exposure_window_width))
{ /* x limit */
temp_grab_size=isp_grab_height;
isp_grab_height=(isp_grab_width * exposure_window.image_target_height/exposure_window.image_target_width)&0xFFFE;
isp_grab_start_y+=(((temp_grab_size-isp_grab_height)>>1)&0xFFFE);
}
else
{ /* y limit */
temp_grab_size=isp_grab_width;
isp_grab_width=(isp_grab_height * exposure_window.image_target_width/exposure_window.image_target_height)&0xFFFC;
isp_grab_start_x+=(((temp_grab_size-isp_grab_width)>>1)&0xFFFC);
}
SET_YUV_TG_GRAB_PIXEL(isp_grab_start_x,isp_grab_width);
SET_YUV_TG_GRAB_LINE(isp_grab_start_y,isp_grab_height);
/* (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230)) */
ENABLE_VERTICAL_SUB_SAMPLE;
ENABLE_HORIZONTAL_SUB_SAMPLE;
SET_HSUB_SRC_SIZE(isp_grab_width);
SET_VSUB_SRC_SIZE(isp_grab_height);
if((isp_grab_width>(g_usbvideo_camera_data.target_width<<2)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<2)))
{ /* grab size > taget size *4 => ISP subsample 4x */
SET_HSUB_DST_SIZE((isp_grab_width>>2)&0xFFFC);
SET_VSUB_DST_SIZE((isp_grab_height>>2)&0xFFFE);
g_usbvideo_camera_data.source_width=(isp_grab_width>>2)&0xFFFC;
g_usbvideo_camera_data.source_height=(isp_grab_height>>2)&0xFFFE;
}
else if((isp_grab_width>(g_usbvideo_camera_data.target_width<<1)) || (isp_grab_height>(g_usbvideo_camera_data.target_height<<1)))
{ /* grab size > taget size *2 => ISP subsample 2x */
SET_HSUB_DST_SIZE((isp_grab_width>>1)&0xFFFC);
SET_VSUB_DST_SIZE((isp_grab_height>>1)&0xFFFE);
g_usbvideo_camera_data.source_width=(isp_grab_width>>1)&0xFFFC;
g_usbvideo_camera_data.source_height=(isp_grab_height>>1)&0xFFFE;
}
else if((isp_grab_width>g_usbvideo_camera_data.target_width) || (isp_grab_height>g_usbvideo_camera_data.target_height))
{
SET_HSUB_DST_SIZE((g_usbvideo_camera_data.target_width)&0xFFFC);
SET_VSUB_DST_SIZE((g_usbvideo_camera_data.target_height)&0xFFFE);
g_usbvideo_camera_data.source_width=(g_usbvideo_camera_data.target_width)&0xFFFC;
g_usbvideo_camera_data.source_height=(g_usbvideo_camera_data.target_height)&0xFFFE;
}
else
{
SET_HSUB_DST_SIZE((isp_grab_width)&0xFFFC);
SET_VSUB_DST_SIZE((isp_grab_height)&0xFFFE);
g_usbvideo_camera_data.source_width=(isp_grab_width)&0xFFFC;
g_usbvideo_camera_data.source_height=(isp_grab_height)&0xFFFE;
}
#endif /* YUV_SENSOR_SUPPORT */
wait_first_frame_flag = KAL_TRUE;
isp_preview_frame = 0;
for(i=0;i<camera_oper_data.capture_delay_frame;i++)
{
DISABLE_VIEW_FINDER_MODE;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
DISABLE_CMOS_SESNOR;
#endif
kal_set_eg_events(camera_isp_event_id,0,KAL_AND);
ENABLE_VIEW_FINDER_MODE;
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
ENABLE_CMOS_SESNOR;
#endif
kal_retrieve_eg_events(camera_isp_event_id,CAMERA_ISP_IDLE_EVENT,KAL_OR_CONSUME,
&event_group,KAL_SUSPEND);
}
// Enable AE Count before Start Preview
#if (defined(MT6226)||defined(MT6226M)||defined(MT6227)||defined(MT6228)||defined(MT6229)||defined(MT6230))
ENABLE_AE_COUNT;
#endif
DISABLE_VIEW_FINDER_MODE;
DISABLE_CAMERA_IDLE_INT;
#if (defined(MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
init_working_mem();
jpeg_encode_config_data.image_width=g_usbvideo_camera_data.target_width;
jpeg_encode_config_data.image_height=g_usbvideo_camera_data.target_height;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -