This is an automatic generated email to let you know that the following patch were queued at the http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:
Subject: v4l2-compliance: test VIDIOC_SUBDEV_ENUM_MBUS_CODE Author: Hans Verkuil <hans.verk...@cisco.com> Date: Fri Feb 2 14:54:10 2018 +0100 Note: this does not yet iterate over all pads, that is not yet implemented. Signed-off-by: Hans Verkuil <hans.verk...@cisco.com> utils/v4l2-compliance/Makefile.am | 2 +- utils/v4l2-compliance/v4l2-compliance.cpp | 84 +++++++++++++++-------------- utils/v4l2-compliance/v4l2-compliance.h | 3 ++ utils/v4l2-compliance/v4l2-test-subdevs.cpp | 73 +++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 40 deletions(-) --- http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=5d829d1c8488b093663fe7a517d4408a97c79e3d diff --git a/utils/v4l2-compliance/Makefile.am b/utils/v4l2-compliance/Makefile.am index 58bad86ccde3..aeb640d9f3c4 100644 --- a/utils/v4l2-compliance/Makefile.am +++ b/utils/v4l2-compliance/Makefile.am @@ -4,7 +4,7 @@ DEFS := v4l2_compliance_SOURCES = v4l2-compliance.cpp v4l2-test-debug.cpp v4l2-test-input-output.cpp \ v4l2-test-controls.cpp v4l2-test-io-config.cpp v4l2-test-formats.cpp v4l2-test-buffers.cpp \ - v4l2-test-codecs.cpp v4l2-test-colors.cpp v4l2-compliance.h + v4l2-test-codecs.cpp v4l2-test-subdevs.cpp v4l2-test-colors.cpp v4l2-compliance.h v4l2_compliance_CPPFLAGS = -I$(top_srcdir)/utils/common if WITH_V4L2_COMPLIANCE_LIBV4L diff --git a/utils/v4l2-compliance/v4l2-compliance.cpp b/utils/v4l2-compliance/v4l2-compliance.cpp index ce7ac660a8ce..d19c5f0f121b 100644 --- a/utils/v4l2-compliance/v4l2-compliance.cpp +++ b/utils/v4l2-compliance/v4l2-compliance.cpp @@ -1449,9 +1449,20 @@ int main(int argc, char **argv) printf("\ttest VIDIOC_G/S_EDID: %s\n", ok(testEdid(&node))); printf("\n"); + /* Sub-device ioctls */ + + if (node.is_subdev()) { + printf("Sub-Device ioctls:\n"); + printf("\ttest VIDIOC_ENUM_MBUS_CODE: %s\n", + ok(testSubDevEnum(&node, 0))); + printf("\n"); + } + unsigned max_io = node.inputs > node.outputs ? node.inputs : node.outputs; for (unsigned io = 0; io < (max_io ? max_io : 1); io++) { + const char *prefix = ""; + node.std_controls = node.priv_controls = 0; node.std_compound_controls = node.priv_compound_controls = 0; node.controls.clear(); @@ -1464,6 +1475,7 @@ int main(int argc, char **argv) if (max_io) { printf("Test %s %d:\n\n", node.can_capture ? "input" : "output", io); + prefix = "\t"; if (node.can_capture) { struct v4l2_input descr; @@ -1483,45 +1495,45 @@ int main(int argc, char **argv) /* Control ioctls */ - printf("\tControl ioctls:\n"); - printf("\t\ttest VIDIOC_QUERY_EXT_CTRL/QUERYMENU: %s\n", ok(testQueryExtControls(&node))); - printf("\t\ttest VIDIOC_QUERYCTRL: %s\n", ok(testQueryControls(&node))); - printf("\t\ttest VIDIOC_G/S_CTRL: %s\n", ok(testSimpleControls(&node))); - printf("\t\ttest VIDIOC_G/S/TRY_EXT_CTRLS: %s\n", ok(testExtendedControls(&node))); - printf("\t\ttest VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: %s\n", ok(testEvents(&node))); - printf("\t\ttest VIDIOC_G/S_JPEGCOMP: %s\n", ok(testJpegComp(&node))); - printf("\t\tStandard Controls: %d Private Controls: %d\n", + printf("%sControl ioctls:\n", prefix); + printf("%s\ttest VIDIOC_QUERY_EXT_CTRL/QUERYMENU: %s\n", prefix, ok(testQueryExtControls(&node))); + printf("%s\ttest VIDIOC_QUERYCTRL: %s\n", prefix, ok(testQueryControls(&node))); + printf("%s\ttest VIDIOC_G/S_CTRL: %s\n", prefix, ok(testSimpleControls(&node))); + printf("%s\ttest VIDIOC_G/S/TRY_EXT_CTRLS: %s\n", prefix, ok(testExtendedControls(&node))); + printf("%s\ttest VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: %s\n", prefix, ok(testEvents(&node))); + printf("%s\ttest VIDIOC_G/S_JPEGCOMP: %s\n", prefix, ok(testJpegComp(&node))); + printf("%s\tStandard Controls: %d Private Controls: %d\n", prefix, node.std_controls, node.priv_controls); printf("\n"); /* Format ioctls */ - printf("\tFormat ioctls:\n"); - printf("\t\ttest VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: %s\n", ok(testEnumFormats(&node))); - printf("\t\ttest VIDIOC_G/S_PARM: %s\n", ok(testParm(&node))); - printf("\t\ttest VIDIOC_G_FBUF: %s\n", ok(testFBuf(&node))); - printf("\t\ttest VIDIOC_G_FMT: %s\n", ok(testGetFormats(&node))); - printf("\t\ttest VIDIOC_TRY_FMT: %s\n", ok(testTryFormats(&node))); - printf("\t\ttest VIDIOC_S_FMT: %s\n", ok(testSetFormats(&node))); - printf("\t\ttest VIDIOC_G_SLICED_VBI_CAP: %s\n", ok(testSlicedVBICap(&node))); - printf("\t\ttest Cropping: %s\n", ok(testCropping(&node))); - printf("\t\ttest Composing: %s\n", ok(testComposing(&node))); - printf("\t\ttest Scaling: %s\n", ok(testScaling(&node))); + printf("%sFormat ioctls:\n", prefix); + printf("%s\ttest VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: %s\n", prefix, ok(testEnumFormats(&node))); + printf("%s\ttest VIDIOC_G/S_PARM: %s\n", prefix, ok(testParm(&node))); + printf("%s\ttest VIDIOC_G_FBUF: %s\n", prefix, ok(testFBuf(&node))); + printf("%s\ttest VIDIOC_G_FMT: %s\n", prefix, ok(testGetFormats(&node))); + printf("%s\ttest VIDIOC_TRY_FMT: %s\n", prefix, ok(testTryFormats(&node))); + printf("%s\ttest VIDIOC_S_FMT: %s\n", prefix, ok(testSetFormats(&node))); + printf("%s\ttest VIDIOC_G_SLICED_VBI_CAP: %s\n", prefix, ok(testSlicedVBICap(&node))); + printf("%s\ttest Cropping: %s\n", prefix, ok(testCropping(&node))); + printf("%s\ttest Composing: %s\n", prefix, ok(testComposing(&node))); + printf("%s\ttest Scaling: %s\n", prefix, ok(testScaling(&node))); printf("\n"); /* Codec ioctls */ - printf("\tCodec ioctls:\n"); - printf("\t\ttest VIDIOC_(TRY_)ENCODER_CMD: %s\n", ok(testEncoder(&node))); - printf("\t\ttest VIDIOC_G_ENC_INDEX: %s\n", ok(testEncIndex(&node))); - printf("\t\ttest VIDIOC_(TRY_)DECODER_CMD: %s\n", ok(testDecoder(&node))); + printf("%sCodec ioctls:\n", prefix); + printf("%s\ttest VIDIOC_(TRY_)ENCODER_CMD: %s\n", prefix, ok(testEncoder(&node))); + printf("%s\ttest VIDIOC_G_ENC_INDEX: %s\n", prefix, ok(testEncIndex(&node))); + printf("%s\ttest VIDIOC_(TRY_)DECODER_CMD: %s\n", prefix, ok(testDecoder(&node))); printf("\n"); /* Buffer ioctls */ - printf("\tBuffer ioctls:\n"); - printf("\t\ttest VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: %s\n", ok(testReqBufs(&node))); - printf("\t\ttest VIDIOC_EXPBUF: %s\n", ok(testExpBuf(&node))); + printf("%sBuffer ioctls:\n", prefix); + printf("%s\ttest VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: %s\n", prefix, ok(testReqBufs(&node))); + printf("%s\ttest VIDIOC_EXPBUF: %s\n", prefix, ok(testExpBuf(&node))); printf("\n"); } @@ -1536,8 +1548,14 @@ int main(int argc, char **argv) for (unsigned io = min_io; io < (max_io ? max_io : 1); io++) { restoreState(); - printf("Test %s %d:\n\n", + if (node.is_subdev()) + break; + + if (options[OptStreaming] || (node.is_video && options[OptStreamAllFormats]) || + (node.is_video && node.can_capture && options[OptStreamAllColorTest])) + printf("Test %s %d:\n\n", node.can_capture ? "input" : "output", io); + if (node.can_capture) doioctl(&node, VIDIOC_S_INPUT, &io); else @@ -1588,18 +1606,6 @@ int main(int argc, char **argv) } } } - if (touch_device) { - touch_node2 = node; - printf("\ttest second touch open: %s\n", - ok(touch_node2.open(touch_device, false) >= 0 ? 0 : errno)); - if (touch_node2.g_fd() >= 0) { - printf("\ttest VIDIOC_QUERYCAP: %s\n", ok(testCap(&touch_node2))); - printf("\ttest VIDIOC_G/S_PRIORITY: %s\n", - ok(testPrio(&node, &touch_node2))); - node.node2 = &touch_node2; - } - } - printf("\n"); /* * TODO: VIDIOC_S_FBUF/OVERLAY diff --git a/utils/v4l2-compliance/v4l2-compliance.h b/utils/v4l2-compliance/v4l2-compliance.h index 3dd831428fab..2c5ee768ac71 100644 --- a/utils/v4l2-compliance/v4l2-compliance.h +++ b/utils/v4l2-compliance/v4l2-compliance.h @@ -226,6 +226,9 @@ int testEncoder(struct node *node); int testEncIndex(struct node *node); int testDecoder(struct node *node); +// SubDev ioctl tests +int testSubDevEnum(struct node *node, unsigned pad); + // Buffer ioctl tests int testReqBufs(struct node *node); int testReadWrite(struct node *node); diff --git a/utils/v4l2-compliance/v4l2-test-subdevs.cpp b/utils/v4l2-compliance/v4l2-test-subdevs.cpp new file mode 100644 index 000000000000..c4ef06b5f3e4 --- /dev/null +++ b/utils/v4l2-compliance/v4l2-test-subdevs.cpp @@ -0,0 +1,73 @@ +/* + V4L2 API subdev ioctl tests. + + Copyright (C) 2018 Hans Verkuil <hans.verk...@cisco.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + */ + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <ctype.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <assert.h> +#include <linux/v4l2-subdev.h> +#include "v4l2-compliance.h" + +int testSubDevEnum(struct node *node, unsigned pad) +{ + struct v4l2_subdev_mbus_code_enum mbus_core_enum; + int ret; + + memset(&mbus_core_enum, 0, sizeof(mbus_core_enum)); + ret = doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum); + if (ret == ENOTTY) + return ret; + mbus_core_enum.which = ~0; + fail_on_test(doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum) != EINVAL); + mbus_core_enum.which = V4L2_SUBDEV_FORMAT_TRY; + mbus_core_enum.index = ~0; + fail_on_test(doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum) != EINVAL); + mbus_core_enum.pad = ~0; + mbus_core_enum.index = 0; + fail_on_test(doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum) != EINVAL); + memset(&mbus_core_enum, 0xff, sizeof(mbus_core_enum)); + mbus_core_enum.pad = pad; + mbus_core_enum.index = 0; + mbus_core_enum.which = V4L2_SUBDEV_FORMAT_TRY; + fail_on_test(doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum)); + fail_on_test(check_0(mbus_core_enum.reserved, sizeof(mbus_core_enum.reserved))); + fail_on_test(mbus_core_enum.code == ~0U); + fail_on_test(mbus_core_enum.pad != pad); + fail_on_test(mbus_core_enum.index); + fail_on_test(mbus_core_enum.which != V4L2_SUBDEV_FORMAT_TRY); + mbus_core_enum.which = V4L2_SUBDEV_FORMAT_ACTIVE; + fail_on_test(doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum)); + fail_on_test(mbus_core_enum.which != V4L2_SUBDEV_FORMAT_ACTIVE); + do { + mbus_core_enum.index++; + ret = doioctl(node, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbus_core_enum); + } while (!ret); + fail_on_test(ret != EINVAL); + + return 0; +} _______________________________________________ linuxtv-commits mailing list linuxtv-commits@linuxtv.org https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits