static int fthd_s_ctrl(struct v4l2_ctrl *ctrl) { struct fthd_private *dev_priv = container_of(ctrl->handler, struct fthd_private, v4l2_ctrl_handler); int ret = -EINVAL; pr_info("id = %x, val = %d\n", ctrl->id, ctrl->val); switch(ctrl->id) { case V4L2_CID_CONTRAST: ret = fthd_isp_cmd_channel_contrast_set(dev_priv, 0, ctrl->val); break; case V4L2_CID_BRIGHTNESS: ret = fthd_isp_cmd_channel_brightness_set(dev_priv, 0, ctrl->val); break; case V4L2_CID_SATURATION: ret = fthd_isp_cmd_channel_saturation_set(dev_priv, 0, ctrl->val); break; case V4L2_CID_HUE: ret = fthd_isp_cmd_channel_hue_set(dev_priv, 0, ctrl->val); break; case V4L2_CID_AUTO_WHITE_BALANCE: ret = fthd_isp_cmd_channel_awb(dev_priv, 0, ctrl->val); default: break; } pr_debug("ret = %d\n", ret); return ret; }
int fthd_start_channel(struct fthd_private *dev_priv, int channel) { int ret, x1 = 0, x2 = 0, pixelformat; ret = fthd_isp_cmd_channel_camera_config(dev_priv); if (ret) return ret; ret = fthd_isp_cmd_channel_camera_config_select(dev_priv, 0, 0); if (ret) return ret; if (dev_priv->fmt.fmt.width < 1280 || dev_priv->fmt.fmt.height < 720) { x1 = 160; x2 = 960; } else { x1 = 0; x2 = 1280; } ret = fthd_isp_cmd_channel_crop_set(dev_priv, 0, x1, 0, x2, 720); if (ret) return ret; switch(dev_priv->fmt.fmt.pixelformat) { case V4L2_PIX_FMT_YUYV: pixelformat = 1; break; case V4L2_PIX_FMT_YVYU: pixelformat = 2; break; case V4L2_PIX_FMT_NV16: pixelformat = 0; break; default: pixelformat = 1; WARN_ON(1); } ret = fthd_isp_cmd_channel_output_config_set(dev_priv, 0, dev_priv->fmt.fmt.width, dev_priv->fmt.fmt.height, pixelformat); if (ret) return ret; ret = fthd_isp_cmd_channel_recycle_mode(dev_priv, 0, 1); if (ret) return ret; ret = fthd_isp_cmd_channel_recycle_start(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_ae_metering_mode_set(dev_priv, 0, 3); if (ret) return ret; ret = fthd_isp_cmd_channel_drc_start(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_tone_curve_adaptation_start(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_ae_speed_set(dev_priv, 0, 60); if (ret) return ret; ret = fthd_isp_cmd_channel_ae_stability_set(dev_priv, 0, 75); if (ret) return ret; ret = fthd_isp_cmd_channel_ae_stability_to_stable_set(dev_priv, 0, 8); if (ret) return ret; ret = fthd_isp_cmd_channel_sif_pixel_format(dev_priv, 0, 1, 1); if (ret) return ret; ret = fthd_isp_cmd_channel_error_handling_config(dev_priv, 0, 2, 1); if (ret) return ret; ret = fthd_isp_cmd_channel_face_detection_enable(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_face_detection_start(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_frame_rate_max(dev_priv, 0, dev_priv->frametime * 256); if (ret) return ret; ret = fthd_isp_cmd_channel_frame_rate_min(dev_priv, 0, dev_priv->frametime * 256); if (ret) return ret; ret = fthd_isp_cmd_channel_temporal_filter_start(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_motion_history_start(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_temporal_filter_enable(dev_priv, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_streaming_mode(dev_priv, 0, 0); if (ret) return ret; ret = fthd_isp_cmd_channel_brightness_set(dev_priv, 0, 0x80); if (ret) return ret; ret = fthd_isp_cmd_channel_contrast_set(dev_priv, 0, 0x80); if (ret) return ret; ret = fthd_isp_cmd_channel_start(dev_priv); if (ret) return ret; mdelay(1000); /* Needed to settle AE */ return 0; }