aboutsummaryrefslogtreecommitdiffstats
path: root/qemu-edid.c
diff options
context:
space:
mode:
authorTimos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>2023-10-10 11:40:56 +0000
committerTimos Ampelikiotis <t.ampelikiotis@virtualopensystems.com>2023-10-10 11:40:56 +0000
commite02cda008591317b1625707ff8e115a4841aa889 (patch)
treeaee302e3cf8b59ec2d32ec481be3d1afddfc8968 /qemu-edid.c
parentcc668e6b7e0ffd8c9d130513d12053cf5eda1d3b (diff)
Introduce Virtio-loopback epsilon release:
Epsilon release introduces a new compatibility layer which make virtio-loopback design to work with QEMU and rust-vmm vhost-user backend without require any changes. Signed-off-by: Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> Change-Id: I52e57563e08a7d0bdc002f8e928ee61ba0c53dd9
Diffstat (limited to 'qemu-edid.c')
-rw-r--r--qemu-edid.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/qemu-edid.c b/qemu-edid.c
new file mode 100644
index 000000000..c3a9fba10
--- /dev/null
+++ b/qemu-edid.c
@@ -0,0 +1,128 @@
+/*
+ * 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/bswap.h"
+#include "qemu/cutils.h"
+#include "hw/display/edid.h"
+
+static qemu_edid_info info = {
+ .prefx = 1024,
+ .prefy = 768,
+};
+
+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[512];
+ size_t size;
+ uint32_t dpi = 100;
+ 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, &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;
+ }
+
+ info.width_mm = qemu_edid_dpi_to_mm(dpi, info.prefx);
+ info.height_mm = qemu_edid_dpi_to_mm(dpi, info.prefy);
+
+ memset(blob, 0, sizeof(blob));
+ qemu_edid_generate(blob, sizeof(blob), &info);
+ size = qemu_edid_size(blob);
+ fwrite(blob, size, 1, outfile);
+ fflush(outfile);
+
+ exit(0);
+}