On 01/06/2014 03:30 PM, Tom wrote: > Hello, > > I want to add some driver specific ctrls to my ctrl-handler which are not > defined in the "/include/uapi/linux/v4l2-controls.h". > I read that I would need the "V4L2_CID_PRIVATE_BASE" to define the new IDs, > but I don't get how I can add them to my ctrl-handler so that they are > accessible by calling VIDIOC_S_CTRL. Don't use V4L2_CID_PRIVATE_BASE, that doesn't work with the control framework (for good but somewhat obscure reasons). Instead use (V4L2_CID_USER_BASE | 0x1000) as the base for your private controls. If you want to upstream the code, then you should define a range for the private controls of this driver in v4l2-controls.h. Search for e.g. V4L2_CID_USER_S2255_BASE in that header to see how it is done. Regards, Hans > > Can someone give me a hint how I can add my own controls to my ctrl-handler? > > what I tried: > > #define V4L2_SENS_TEST1 (V4L2_CID_PRIVATE_BASE + 1) > #define V4L2_SENS_TEST2 (V4L2_CID_PRIVATE_BASE + 2) > #define V4L2_SENS_TEST3 (V4L2_CID_PRIVATE_BASE + 3) > > static int ov3640_probe(struct i2c_client *client, > const struct i2c_device_id *id) > { > . > . > . > //I can add the standard controls as usual... > > v4l2_ctrl_handler_init(&ov3640->ctrl_handler, 19); > > v4l2_ctrl_new_std(&ov3640->ctrl_handler, &ov3640_ctrl_ops, > V4L2_CID_BRIGHTNESS, -48, 48, 1, 0); > v4l2_ctrl_new_std(&ov3640->ctrl_handler, &ov3640_ctrl_ops, > V4L2_CID_CONTRAST, -12, 12, 1, 0); > v4l2_ctrl_new_std(&ov3640->ctrl_handler, &ov3640_ctrl_ops, > V4L2_CID_SATURATION, -32, 32, 1, 0); > . > . > . > //so far so good... > > v4l2_ctrl_new_std(&ov3640->ctrl_handler, &ov3640_ctrl_ops, > V4L2_SENS_TEST1, 0, 1, 1, 0); > v4l2_ctrl_new_std(&ov3640->ctrl_handler, &ov3640_ctrl_ops, > V4L2_SENS_TEST2, 0, 1, 1, 0); > v4l2_ctrl_new_std(&ov3640->ctrl_handler, &ov3640_ctrl_ops, > V4L2_SENS_TEST3, 0, 1, 1, 0); > > //but I cannot add these three controls like this. > > if (ov3640->ctrl_handler.error) { > dev_err(&client->dev, "control initialization error %d\n", > ov3640->ctrl_handler.error); > ret = ov3640->ctrl_handler.error; > goto done; > } > > //the ctrl-handler will give me an ERROR back when adding these 3 controls > > } > > static int ov3640_ctrl(struct v4l2_ctrl *ctrl, int command) > { > struct ov3640 *ov3640 = container_of(ctrl->handler, struct ov3640, > ctrl_handler); > int ret = 0; > > switch (ctrl->id) { > case V4L2_CID_BRIGHTNESS: > ret = ov3640_set_brightness(ov3640, ctrl->val, command); > break; > case V4L2_CID_CONTRAST: > ret = ov3640_set_contrast(ov3640, ctrl->val, command); > break; > case V4L2_CID_SATURATION: > ret = ov3640_set_saturation(ov3640, ctrl->val, command); > break; > case V4L2_SENS_TEST1://!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > case V4L2_SENS_TEST2://!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > case V4L2_SENS_TEST3://!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > ret = ov3640_test(ov3640, ctrl->val, ctrl->id, command); > break; > } > > return ret; > } > > static int ov3640_set_ctrl(struct v4l2_ctrl *ctrl) > { > int ret; > int command = SET_DATA; > > ret = ov3640_ctrl(ctrl, command); > return ret; > } > > static int ov3640_get_ctrl(struct v4l2_ctrl *ctrl) > { > int ret; > int command = GET_DATA; > > ret = ov3640_ctrl(ctrl, command); > return ret; > } > > static struct v4l2_ctrl_ops ov3640_ctrl_ops = { > .s_ctrl = ov3640_set_ctrl, > .g_volatile_ctrl = ov3640_get_ctrl, > }; > > Best Regards, Tom > > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html