| /* |
| * 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); |
| } |