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