summary refs log tree commit diff stats
path: root/qemu-edid.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-10-01 11:33:16 +0100
committerPeter Maydell <peter.maydell@linaro.org>2018-10-01 11:33:16 +0100
commitcc28dce2eccdcfc2660b8bf680eaa340ef2067d5 (patch)
tree53b756fec754323b97115bca4401d57dfca23bcb /qemu-edid.c
parente7f5f0b6e6f2fb592ab66145b8bc35a0e4a4e198 (diff)
parent36ffc122dcd69ab66db4afab3a13cfca46bfc323 (diff)
downloadfocaccia-qemu-cc28dce2eccdcfc2660b8bf680eaa340ef2067d5.tar.gz
focaccia-qemu-cc28dce2eccdcfc2660b8bf680eaa340ef2067d5.zip
Merge remote-tracking branch 'remotes/kraxel/tags/vga-20180927-pull-request' into staging
vga: add edid support, qxl bugfixes.

# gpg: Signature made Thu 27 Sep 2018 08:12:32 BST
# gpg:                using RSA key 4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
# Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138

* remotes/kraxel/tags/vga-20180927-pull-request:
  qxl: support mono cursors with inverted colors
  qxl: use guest_monitor_config for local renderer.
  display/stdvga: add edid support.
  display/edid: add DEFINE_EDID_PROPERTIES
  display/edid: add region helper.
  display/edid: add qemu_edid_size()
  display/edid: add edid generator to qemu.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'qemu-edid.c')
-rw-r--r--qemu-edid.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/qemu-edid.c b/qemu-edid.c
new file mode 100644
index 0000000000..ae8b8a6d9b
--- /dev/null
+++ b/qemu-edid.c
@@ -0,0 +1,120 @@
+/*
+ * QEMU EDID test tool.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "qemu/bswap.h"
+#include "qemu/cutils.h"
+#include "hw/display/edid.h"
+
+static qemu_edid_info info;
+
+static void usage(FILE *out)
+{
+    fprintf(out,
+            "\n"
+            "This is a test tool for the qemu edid generator.\n"
+            "\n"
+            "Typically you'll pipe the output into edid-decode\n"
+            "to check if the generator works correctly.\n"
+            "\n"
+            "usage: qemu-edid <options>\n"
+            "options:\n"
+            "    -h             print this text\n"
+            "    -o <file>      set output file (stdout by default)\n"
+            "    -v <vendor>    set monitor vendor (three letters)\n"
+            "    -n <name>      set monitor name\n"
+            "    -s <serial>    set monitor serial\n"
+            "    -d <dpi>       set display resolution\n"
+            "    -x <prefx>     set preferred width\n"
+            "    -y <prefy>     set preferred height\n"
+            "    -X <maxx>      set maximum width\n"
+            "    -Y <maxy>      set maximum height\n"
+            "\n");
+}
+
+int main(int argc, char *argv[])
+{
+    FILE *outfile = NULL;
+    uint8_t blob[256];
+    int rc;
+
+    for (;;) {
+        rc = getopt(argc, argv, "ho:x:y:X:Y:d:v:n:s:");
+        if (rc == -1) {
+            break;
+        }
+        switch (rc) {
+        case 'o':
+            if (outfile) {
+                fprintf(stderr, "outfile specified twice\n");
+                exit(1);
+            }
+            outfile = fopen(optarg, "w");
+            if (outfile == NULL) {
+                fprintf(stderr, "open %s: %s\n", optarg, strerror(errno));
+                exit(1);
+            }
+            break;
+        case 'x':
+            if (qemu_strtoui(optarg, NULL, 10, &info.prefx) < 0) {
+                fprintf(stderr, "not a number: %s\n", optarg);
+                exit(1);
+            }
+            break;
+        case 'y':
+            if (qemu_strtoui(optarg, NULL, 10, &info.prefy) < 0) {
+                fprintf(stderr, "not a number: %s\n", optarg);
+                exit(1);
+            }
+            break;
+        case 'X':
+            if (qemu_strtoui(optarg, NULL, 10, &info.maxx) < 0) {
+                fprintf(stderr, "not a number: %s\n", optarg);
+                exit(1);
+            }
+            break;
+        case 'Y':
+            if (qemu_strtoui(optarg, NULL, 10, &info.maxy) < 0) {
+                fprintf(stderr, "not a number: %s\n", optarg);
+                exit(1);
+            }
+            break;
+        case 'd':
+            if (qemu_strtoui(optarg, NULL, 10, &info.dpi) < 0) {
+                fprintf(stderr, "not a number: %s\n", optarg);
+                exit(1);
+            }
+            break;
+        case 'v':
+            info.vendor = optarg;
+            break;
+        case 'n':
+            info.name = optarg;
+            break;
+        case 's':
+            info.serial = optarg;
+            break;
+        case 'h':
+            usage(stdout);
+            exit(0);
+        default:
+            usage(stderr);
+            exit(1);
+        }
+    }
+
+    if (outfile == NULL) {
+        outfile = stdout;
+    }
+
+    memset(blob, 0, sizeof(blob));
+    qemu_edid_generate(blob, sizeof(blob), &info);
+    fwrite(blob, sizeof(blob), 1, outfile);
+    fflush(outfile);
+
+    exit(0);
+}