xref: /qemu/qemu-edid.c (revision abff1abf)
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 }
120