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