Hi Marcio,
Firstly, please direct all V4L related questions to the linux-media list
(added to CC), secondly, your problem will have much better chances to
attract attention if you use a current kernel, thirdly, please, specify
which camera host driver / which ARM platform you're dealing with.
Thanks
Guennadi
On Thu, 8 May 2014, Marcio Campos de Lima wrote:
> Hi
>
> Can anybody tell me why the set control function is not working in Linux
> 3.6.9? Thanks.
>
> —— APPLICATION CALL ——
> struct v4l2_control controle;
> controle.id = VIDIOC_AVANCA_ZOOM;
> controle.value = time;
> if (-1 == xioctl(fd_camera, VIDIOC_S_CTRL,&controle))
> {
> printf ("%s erro\n",__FUNCTION__);
> perror ("erro iotcl");
> }
>
> The ioctl call returns with invalid argument. It is amazing because the first
> time the ioctl is called it is executed ok. Then no more call is allowed and
> return the invalid
>
> below is the device driver code I think may be relevant.
>
> v4l2_ctrl_handler_init(&priv->ctrls, ARRAY_SIZE(ov5642_ctrls));
> printk ("handler_init\n");
> v4l2_ctrl_new_std(&priv->ctrls, &ov5642_ctrl_ops,V4L2_CID_ZOOM_RELATIVE,
> -1000, 1000, 1, 500);
> v4l2_ctrl_new_std(&priv->ctrls, &ov5642_ctrl_ops,V4L2_CID_FLASH_STROBE,
> -100, 100, 1, 5);
>
>
> priv->subdev.ctrl_handler=&priv->ctrls;
> v4l2_i2c_subdev_init(&priv->subdev, client, &ov5642_subdev_ops);
> return ov5642_video_probe(client);
>
> static int ov5642_s_ctrl(struct v4l2_ctrl *ctrl)
> {
> struct ov5642 *ov5642 =
> container_of(ctrl->handler, struct ov5642, ctrls);
> struct i2c_client *client = v4l2_get_subdevdata(&ov5642->subdev);
> u16 data;
> int ret;
> printk ("%s: id=%08x val=%d\n",__FUNCTION__, ctrl->id, ctrl->val);
> switch (ctrl->id) {
> case V4L2_CID_DO_WHITE_BALANCE:
> ov5640_set_wb_oem(client, ctrl->val);
> break;
> case V4L2_CID_EXPOSURE:
>
> break;
> case V4L2_CID_GAIN:
> /* Gain is controlled by 2 analog stages and a digital stage.
> * Valid values for the 3 stages are
> *
> * Stage Min Max Step
> * ------------------------------------------
> * First analog stage x1 x2 1
> * Second analog stage x1 x4 0.125
> * Digital stage x1 x16 0.125
> *
> * To minimize noise, the gain stages should be used in the
> * second analog stage, first analog stage, digital stage order.
> * Gain from a previous stage should be pushed to its maximum
> * value before the next stage is used.
> */
> if (ctrl->val <= 32) {
> data = ctrl->val;
> } else if (ctrl->val <= 64) {
> ctrl->val &= ~1;
> data = (1 << 6) | (ctrl->val >> 1);
> } else {
> ctrl->val &= ~7;
> data = ((ctrl->val - 64) << 5) | (1 << 6) | 32;
> }
> break;
> case V4L2_CID_ZOOM_RELATIVE:
> if (ctrl->val>0)
> avanca_zoom(sysPriv.v4l2_int_device, ctrl->val);
> else
> recua_zoom(sysPriv.v4l2_int_device, ctrl->val);
>
> break;
> case V4L2_CID_BRIGHTNESS:
> ov5640_set_brightness(client, ctrl->val);
> break;
> case V4L2_CID_CONTRAST:
> ov5640_set_contrast(client, ctrl->val);
> break;
> case V4L2_CID_FLASH_STROBE:
> ativa_flash (sysPriv.v4l2_int_device, ctrl->val);
> break;
> case V4L2_CID_VFLIP:
>
> case V4L2_CID_TEST_PATTERN:
>
>
>
> case V4L2_CID_BLC_AUTO:
>
> case V4L2_CID_BLC_TARGET_LEVEL:
>
> case V4L2_CID_BLC_ANALOG_OFFSET:
>
> case V4L2_CID_BLC_DIGITAL_OFFSET:
> return 1;
> }
>
> return 0;
> }
>
> static struct v4l2_ctrl_ops ov5642_ctrl_ops = {
> .s_ctrl = ov5642_s_ctrl,
> };
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html