Merge remote-tracking branch 'remotes/armbru/tags/pull-monitor-2020-02-15-v2' into...
[qemu.git] / qemu-edid.c
1 /*
2 * QEMU EDID test tool.
3 *
4 * This work is licensed under the terms of the GNU GPL, version 2 or later.
5 * See the COPYING file in the top-level directory.
6 */
7 #include "qemu/osdep.h"
8 #include "qemu/bswap.h"
9 #include "qemu/cutils.h"
10 #include "hw/display/edid.h"
11
12 static qemu_edid_info info;
13
14 static void usage(FILE *out)
15 {
16 fprintf(out,
17 "\n"
18 "This is a test tool for the qemu edid generator.\n"
19 "\n"
20 "Typically you'll pipe the output into edid-decode\n"
21 "to check if the generator works correctly.\n"
22 "\n"
23 "usage: qemu-edid <options>\n"
24 "options:\n"
25 " -h print this text\n"
26 " -o <file> set output file (stdout by default)\n"
27 " -v <vendor> set monitor vendor (three letters)\n"
28 " -n <name> set monitor name\n"
29 " -s <serial> set monitor serial\n"
30 " -d <dpi> set display resolution\n"
31 " -x <prefx> set preferred width\n"
32 " -y <prefy> set preferred height\n"
33 " -X <maxx> set maximum width\n"
34 " -Y <maxy> set maximum height\n"
35 "\n");
36 }
37
38 int main(int argc, char *argv[])
39 {
40 FILE *outfile = NULL;
41 uint8_t blob[256];
42 int rc;
43
44 for (;;) {
45 rc = getopt(argc, argv, "ho:x:y:X:Y:d:v:n:s:");
46 if (rc == -1) {
47 break;
48 }
49 switch (rc) {
50 case 'o':
51 if (outfile) {
52 fprintf(stderr, "outfile specified twice\n");
53 exit(1);
54 }
55 outfile = fopen(optarg, "w");
56 if (outfile == NULL) {
57 fprintf(stderr, "open %s: %s\n", optarg, strerror(errno));
58 exit(1);
59 }
60 break;
61 case 'x':
62 if (qemu_strtoui(optarg, NULL, 10, &info.prefx) < 0) {
63 fprintf(stderr, "not a number: %s\n", optarg);
64 exit(1);
65 }
66 break;
67 case 'y':
68 if (qemu_strtoui(optarg, NULL, 10, &info.prefy) < 0) {
69 fprintf(stderr, "not a number: %s\n", optarg);
70 exit(1);
71 }
72 break;
73 case 'X':
74 if (qemu_strtoui(optarg, NULL, 10, &info.maxx) < 0) {
75 fprintf(stderr, "not a number: %s\n", optarg);
76 exit(1);
77 }
78 break;
79 case 'Y':
80 if (qemu_strtoui(optarg, NULL, 10, &info.maxy) < 0) {
81 fprintf(stderr, "not a number: %s\n", optarg);
82 exit(1);
83 }
84 break;
85 case 'd':
86 if (qemu_strtoui(optarg, NULL, 10, &info.dpi) < 0) {
87 fprintf(stderr, "not a number: %s\n", optarg);
88 exit(1);
89 }
90 break;
91 case 'v':
92 info.vendor = optarg;
93 break;
94 case 'n':
95 info.name = optarg;
96 break;
97 case 's':
98 info.serial = optarg;
99 break;
100 case 'h':
101 usage(stdout);
102 exit(0);
103 default:
104 usage(stderr);
105 exit(1);
106 }
107 }
108
109 if (outfile == NULL) {
110 outfile = stdout;
111 }
112
113 memset(blob, 0, sizeof(blob));
114 qemu_edid_generate(blob, sizeof(blob), &info);
115 fwrite(blob, sizeof(blob), 1, outfile);
116 fflush(outfile);
117
118 exit(0);
119 }