xref: /openbmc/qemu/qemu-edid.c (revision 4921d0a7)
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     .prefx = 1280,
14     .prefy = 800,
15 };
16 
17 static void usage(FILE *out)
18 {
19     fprintf(out,
20             "\n"
21             "This is a test tool for the qemu edid generator.\n"
22             "\n"
23             "Typically you'll pipe the output into edid-decode\n"
24             "to check if the generator works correctly.\n"
25             "\n"
26             "usage: qemu-edid <options>\n"
27             "options:\n"
28             "    -h             print this text\n"
29             "    -o <file>      set output file (stdout by default)\n"
30             "    -v <vendor>    set monitor vendor (three letters)\n"
31             "    -n <name>      set monitor name\n"
32             "    -s <serial>    set monitor serial\n"
33             "    -d <dpi>       set display resolution\n"
34             "    -x <prefx>     set preferred width\n"
35             "    -y <prefy>     set preferred height\n"
36             "    -X <maxx>      set maximum width\n"
37             "    -Y <maxy>      set maximum height\n"
38             "\n");
39 }
40 
41 int main(int argc, char *argv[])
42 {
43     FILE *outfile = NULL;
44     uint8_t blob[512];
45     size_t size;
46     uint32_t dpi = 100;
47     int rc;
48 
49     for (;;) {
50         rc = getopt(argc, argv, "ho:x:y:X:Y:d:v:n:s:");
51         if (rc == -1) {
52             break;
53         }
54         switch (rc) {
55         case 'o':
56             if (outfile) {
57                 fprintf(stderr, "outfile specified twice\n");
58                 exit(1);
59             }
60             outfile = fopen(optarg, "w");
61             if (outfile == NULL) {
62                 fprintf(stderr, "open %s: %s\n", optarg, strerror(errno));
63                 exit(1);
64             }
65             break;
66         case 'x':
67             if (qemu_strtoui(optarg, NULL, 10, &info.prefx) < 0) {
68                 fprintf(stderr, "not a number: %s\n", optarg);
69                 exit(1);
70             }
71             break;
72         case 'y':
73             if (qemu_strtoui(optarg, NULL, 10, &info.prefy) < 0) {
74                 fprintf(stderr, "not a number: %s\n", optarg);
75                 exit(1);
76             }
77             break;
78         case 'X':
79             if (qemu_strtoui(optarg, NULL, 10, &info.maxx) < 0) {
80                 fprintf(stderr, "not a number: %s\n", optarg);
81                 exit(1);
82             }
83             break;
84         case 'Y':
85             if (qemu_strtoui(optarg, NULL, 10, &info.maxy) < 0) {
86                 fprintf(stderr, "not a number: %s\n", optarg);
87                 exit(1);
88             }
89             break;
90         case 'd':
91             if (qemu_strtoui(optarg, NULL, 10, &dpi) < 0) {
92                 fprintf(stderr, "not a number: %s\n", optarg);
93                 exit(1);
94             }
95             if (dpi == 0) {
96                 fprintf(stderr, "cannot be zero: %s\n", optarg);
97                 exit(1);
98             }
99             break;
100         case 'v':
101             info.vendor = optarg;
102             break;
103         case 'n':
104             info.name = optarg;
105             break;
106         case 's':
107             info.serial = optarg;
108             break;
109         case 'h':
110             usage(stdout);
111             exit(0);
112         default:
113             usage(stderr);
114             exit(1);
115         }
116     }
117 
118     if (outfile == NULL) {
119         outfile = stdout;
120     }
121 
122     info.width_mm = qemu_edid_dpi_to_mm(dpi, info.prefx);
123     info.height_mm = qemu_edid_dpi_to_mm(dpi, info.prefy);
124 
125     memset(blob, 0, sizeof(blob));
126     qemu_edid_generate(blob, sizeof(blob), &info);
127     size = qemu_edid_size(blob);
128     fwrite(blob, size, 1, outfile);
129     fflush(outfile);
130 
131     exit(0);
132 }
133