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
usage(FILE * out)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
main(int argc,char * argv[])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