Use of caps for controlling ov5640 V4L2 driver


#1

Hello,

I’m trying to control the behaviour of ov5640 driver based on V4L2 caps.
Available caps in the driver we are using are the following:
ov5640->saturation = v4l2_ctrl_new_std(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_SATURATION, -4, 4, 1, 0); ov5640->hflip = v4l2_ctrl_new_std(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0); ov5640->vflip = v4l2_ctrl_new_std(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0); ov5640->autogain = v4l2_ctrl_new_std(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_AUTOGAIN, 0, 1, 1, 1); ov5640->autoexposure = v4l2_ctrl_new_std_menu(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, V4L2_EXPOSURE_MANUAL, 0, V4L2_EXPOSURE_AUTO); ov5640->awb = v4l2_ctrl_new_std(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 1); ov5640->pattern = v4l2_ctrl_new_std_menu_items(&ov5640->ctrls, &ov5640_ctrl_ops, V4L2_CID_TEST_PATTERN, ARRAY_SIZE(ov5640_test_pattern_menu) - 1, 0, 0, ov5640_test_pattern_menu);

I tried for example to enable the test pattern (implies changing a single I2C register in the camera config).
I tried with following command line (I also tried many variations), using extra-controls as for v4l2h264enc:
gst-launch-1.0 v4l2src extra-controls="controls,test_pattern=2;" device=/dev/video0 num-buffers=1 ! 'video/xraw,format=UYVY,width=2592,height=1944,framerate=10/1' ! jpegenc ! filesink location=image01_5MP.jpg

Result is an image without the test pattern. So I’m obviously not controlling anything…

Any idea on how to make use of the V4L2_CID_* options?
At the end of the day I would like to be able to change things like AEC, AGC, …

Thanks in advance for your support!


#2

Hi,

v4l2src works on the video device node (e.g. /dev/video0). The controls that the sensor driver exports are available on the subdev node of the camera sensor, e.g. /dev/v4l-subdev?

You can control them with e.g. yavta [1].
To list all controls on a subdev:
yavta --no-query -l /dev/v4l-subdev?

Then to set a control:
yavta --no-query -w '0x009f0903 1' /dev/v4l-subdev?

[1] http://git.ideasonboard.org/yavta.git


#3

Hello Todor,

Thanks for your quick answer.
All right! Yavta is working well indeed.
Using the last subdev node I can indeed list controls and make good use of them.
I can see results while capturing frames afterwards.
I’ll try adding new controls to the driver. This way I will have configuration flexibility I was also looking for.

Do you now if there is a way to get “status”? Like knowing current value of a register of the sensor using a similar mechanism?

Thanks!


#4

You can get or enumerate V4L2 controls.
What comes to sensor register values, you need to initiate a i2c read operation to read the current value. I’m not aware of a mechanism to do that beyond using the sensor driver itself.