| /* | 
 |  * QEMU EDID test tool. | 
 |  * | 
 |  * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
 |  * See the COPYING file in the top-level directory. | 
 |  */ | 
 | #include "qemu/osdep.h" | 
 | #include "qemu/bswap.h" | 
 | #include "qemu/cutils.h" | 
 | #include "hw/display/edid.h" | 
 |  | 
 | static qemu_edid_info info = { | 
 |     .prefx = 1280, | 
 |     .prefy = 800, | 
 | }; | 
 |  | 
 | static void usage(FILE *out) | 
 | { | 
 |     fprintf(out, | 
 |             "\n" | 
 |             "This is a test tool for the qemu edid generator.\n" | 
 |             "\n" | 
 |             "Typically you'll pipe the output into edid-decode\n" | 
 |             "to check if the generator works correctly.\n" | 
 |             "\n" | 
 |             "usage: qemu-edid <options>\n" | 
 |             "options:\n" | 
 |             "    -h             print this text\n" | 
 |             "    -o <file>      set output file (stdout by default)\n" | 
 |             "    -v <vendor>    set monitor vendor (three letters)\n" | 
 |             "    -n <name>      set monitor name\n" | 
 |             "    -s <serial>    set monitor serial\n" | 
 |             "    -d <dpi>       set display resolution\n" | 
 |             "    -x <prefx>     set preferred width\n" | 
 |             "    -y <prefy>     set preferred height\n" | 
 |             "    -X <maxx>      set maximum width\n" | 
 |             "    -Y <maxy>      set maximum height\n" | 
 |             "\n"); | 
 | } | 
 |  | 
 | int main(int argc, char *argv[]) | 
 | { | 
 |     FILE *outfile = NULL; | 
 |     uint8_t blob[512]; | 
 |     size_t size; | 
 |     uint32_t dpi = 100; | 
 |     int rc; | 
 |  | 
 |     for (;;) { | 
 |         rc = getopt(argc, argv, "ho:x:y:X:Y:d:v:n:s:"); | 
 |         if (rc == -1) { | 
 |             break; | 
 |         } | 
 |         switch (rc) { | 
 |         case 'o': | 
 |             if (outfile) { | 
 |                 fprintf(stderr, "outfile specified twice\n"); | 
 |                 exit(1); | 
 |             } | 
 |             outfile = fopen(optarg, "w"); | 
 |             if (outfile == NULL) { | 
 |                 fprintf(stderr, "open %s: %s\n", optarg, strerror(errno)); | 
 |                 exit(1); | 
 |             } | 
 |             break; | 
 |         case 'x': | 
 |             if (qemu_strtoui(optarg, NULL, 10, &info.prefx) < 0) { | 
 |                 fprintf(stderr, "not a number: %s\n", optarg); | 
 |                 exit(1); | 
 |             } | 
 |             break; | 
 |         case 'y': | 
 |             if (qemu_strtoui(optarg, NULL, 10, &info.prefy) < 0) { | 
 |                 fprintf(stderr, "not a number: %s\n", optarg); | 
 |                 exit(1); | 
 |             } | 
 |             break; | 
 |         case 'X': | 
 |             if (qemu_strtoui(optarg, NULL, 10, &info.maxx) < 0) { | 
 |                 fprintf(stderr, "not a number: %s\n", optarg); | 
 |                 exit(1); | 
 |             } | 
 |             break; | 
 |         case 'Y': | 
 |             if (qemu_strtoui(optarg, NULL, 10, &info.maxy) < 0) { | 
 |                 fprintf(stderr, "not a number: %s\n", optarg); | 
 |                 exit(1); | 
 |             } | 
 |             break; | 
 |         case 'd': | 
 |             if (qemu_strtoui(optarg, NULL, 10, &dpi) < 0) { | 
 |                 fprintf(stderr, "not a number: %s\n", optarg); | 
 |                 exit(1); | 
 |             } | 
 |             if (dpi == 0) { | 
 |                 fprintf(stderr, "cannot be zero: %s\n", optarg); | 
 |                 exit(1); | 
 |             } | 
 |             break; | 
 |         case 'v': | 
 |             info.vendor = optarg; | 
 |             break; | 
 |         case 'n': | 
 |             info.name = optarg; | 
 |             break; | 
 |         case 's': | 
 |             info.serial = optarg; | 
 |             break; | 
 |         case 'h': | 
 |             usage(stdout); | 
 |             exit(0); | 
 |         default: | 
 |             usage(stderr); | 
 |             exit(1); | 
 |         } | 
 |     } | 
 |  | 
 |     if (outfile == NULL) { | 
 |         outfile = stdout; | 
 |     } | 
 |  | 
 |     info.width_mm = qemu_edid_dpi_to_mm(dpi, info.prefx); | 
 |     info.height_mm = qemu_edid_dpi_to_mm(dpi, info.prefy); | 
 |  | 
 |     memset(blob, 0, sizeof(blob)); | 
 |     qemu_edid_generate(blob, sizeof(blob), &info); | 
 |     size = qemu_edid_size(blob); | 
 |     fwrite(blob, size, 1, outfile); | 
 |     fflush(outfile); | 
 |  | 
 |     exit(0); | 
 | } |