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

Reply via email to