qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

qemu-edid.c (3813B)


      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 
     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 
     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 }