From: Hans Verkuil <hans.verk...@cisco.com> Signed-off-by: Hans Verkuil <hans.verk...@cisco.com> --- edid-decode.c | 296 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 157 insertions(+), 139 deletions(-)
diff --git a/edid-decode.c b/edid-decode.c index 4deceba4..31aca8aa 100644 --- a/edid-decode.c +++ b/edid-decode.c @@ -158,6 +158,7 @@ static int detailed_cvt_descriptor(unsigned char *x, int first) { const unsigned char empty[3] = { 0, 0, 0 }; + const char *ratio; char *names[] = { "50", "60", "75", "85" }; int width, height; int valid = 1; @@ -173,13 +174,21 @@ detailed_cvt_descriptor(unsigned char *x, int first) switch (x[1] & 0x0c) { case 0x00: - width = (height * 4) / 3; break; + width = (height * 4) / 3; + ratio = "4:3"; + break; case 0x04: - width = (height * 16) / 9; break; + width = (height * 16) / 9; + ratio = "16:9"; + break; case 0x08: - width = (height * 16) / 10; break; + width = (height * 16) / 10; + ratio = "16:10"; + break; case 0x0c: - width = (height * 15) / 9; break; + width = (height * 15) / 9; + ratio = "15:9"; + break; } if (x[1] & 0x03) @@ -198,12 +207,13 @@ detailed_cvt_descriptor(unsigned char *x, int first) if (!valid) { printf(" (broken)\n"); } else { - printf(" %dx%d @ ( %s%s%s%s%s) Hz (%s%s preferred)\n", width, height, + printf(" %dx%d @ ( %s%s%s%s%s) Hz %s (%s%s preferred)\n", width, height, fifty ? "50 " : "", sixty ? "60 " : "", seventyfive ? "75 " : "", eightyfive ? "85 " : "", reduced ? "60RB " : "", + ratio, names[(x[2] & 0x60) >> 5], (((x[2] & 0x60) == 0x20) && reduced) ? "RB" : ""); } @@ -652,113 +662,113 @@ cea_audio_block(unsigned char *x) } static const char *edid_cea_modes[] = { - "640x480@60Hz", - "720x480@60Hz", - "720x480@60Hz", - "1280x720@60Hz", - "1920x1080i@60Hz", - "1440x480i@60Hz", - "1440x480i@60Hz", - "1440x240@60Hz", - "1440x240@60Hz", - "2880x480i@60Hz", - "2880x480i@60Hz", - "2880x240@60Hz", - "2880x240@60Hz", - "1440x480@60Hz", - "1440x480@60Hz", - "1920x1080@60Hz", - "720x576@50Hz", - "720x576@50Hz", - "1280x720@50Hz", - "1920x1080i@50Hz", - "1440x576i@50Hz", - "1440x576i@50Hz", - "1440x288@50Hz", - "1440x288@50Hz", - "2880x576i@50Hz", - "2880x576i@50Hz", - "2880x288@50Hz", - "2880x288@50Hz", - "1440x576@50Hz", - "1440x576@50Hz", - "1920x1080@50Hz", - "1920x1080@24Hz", - "1920x1080@25Hz", - "1920x1080@30Hz", - "2880x480@60Hz", - "2880x480@60Hz", - "2880x576@50Hz", - "2880x576@50Hz", - "1920x1080i@50Hz", - "1920x1080i@100Hz", - "1280x720@100Hz", - "720x576@100Hz", - "720x576@100Hz", - "1440x576@100Hz", - "1440x576@100Hz", - "1920x1080i@120Hz", - "1280x720@120Hz", - "720x480@120Hz", - "720x480@120Hz", - "1440x480i@120Hz", - "1440x480i@120Hz", - "720x576@200Hz", - "720x576@200Hz", - "1440x576i@200Hz", - "1440x576i@200Hz", - "720x480@240Hz", - "720x480@240Hz", - "1440x480i@240Hz", - "1440x480i@240Hz", - "1280x720@24Hz", - "1280x720@25Hz", - "1280x720@30Hz", - "1920x1080@120Hz", - "1920x1080@100Hz", - "1280x720@24Hz", - "1280x720@25Hz", - "1280x720@30Hz", - "1280x720@50Hz", - "1280x720@60Hz", - "1280x720@100Hz", - "1280x720@120Hz", - "1920x1080@24Hz", - "1920x1080@25Hz", - "1920x1080@30Hz", - "1920x1080@50Hz", - "1920x1080@60Hz", - "1920x1080@100Hz", - "1920x1080@120Hz", - "1680x720@24Hz", - "1680x720@25Hz", - "1680x720@30Hz", - "1680x720@50Hz", - "1680x720@60Hz", - "1680x720@100Hz", - "1680x720@120Hz", - "2560x1080@24Hz", - "2560x1080@25Hz", - "2560x1080@30Hz", - "2560x1080@50Hz", - "2560x1080@60Hz", - "2560x1080@100Hz", - "2560x1080@120Hz", - "3840x2160@24Hz", - "3840x2160@25Hz", - "3840x2160@30Hz", - "3840x2160@50Hz", - "3840x2160@60Hz", - "4096x2160@24Hz", - "4096x2160@25Hz", - "4096x2160@30Hz", - "4096x2160@50Hz", - "4096x2160@60Hz", - "3840x2160@24Hz", - "3840x2160@25Hz", - "3840x2160@30Hz", - "3840x2160@50Hz", - "3840x2160@60Hz", + "640x480@60Hz 4:3", + "720x480@60Hz 4:3", + "720x480@60Hz 16:9", + "1280x720@60Hz 16:9", + "1920x1080i@60Hz 16:9", + "1440x480i@60Hz 4:3", + "1440x480i@60Hz 16:9", + "1440x240@60Hz 4:3", + "1440x240@60Hz 16:9", + "2880x480i@60Hz 4:3", + "2880x480i@60Hz 16:9", + "2880x240@60Hz 4:3", + "2880x240@60Hz 16:9", + "1440x480@60Hz 4:3", + "1440x480@60Hz 16:9", + "1920x1080@60Hz 16:9", + "720x576@50Hz 4:3", + "720x576@50Hz 16:9", + "1280x720@50Hz 16:9", + "1920x1080i@50Hz 16:9", + "1440x576i@50Hz 4:3", + "1440x576i@50Hz 16:9", + "1440x288@50Hz 4:3", + "1440x288@50Hz 16:9", + "2880x576i@50Hz 4:3", + "2880x576i@50Hz 16:9", + "2880x288@50Hz 4:3", + "2880x288@50Hz 16:9", + "1440x576@50Hz 4:3", + "1440x576@50Hz 16:9", + "1920x1080@50Hz 16:9", + "1920x1080@24Hz 16:9", + "1920x1080@25Hz 16:9", + "1920x1080@30Hz 16:9", + "2880x480@60Hz 4:3", + "2880x480@60Hz 16:9", + "2880x576@50Hz 4:3", + "2880x576@50Hz 16:9", + "1920x1080i@50Hz 16:9", + "1920x1080i@100Hz 16:9", + "1280x720@100Hz 16:9", + "720x576@100Hz 4:3", + "720x576@100Hz 16:9", + "1440x576@100Hz 4:3", + "1440x576@100Hz 16:9", + "1920x1080i@120Hz 16:9", + "1280x720@120Hz 16:9", + "720x480@120Hz 4:3", + "720x480@120Hz 16:9", + "1440x480i@120Hz 4:3", + "1440x480i@120Hz 16:9", + "720x576@200Hz 4:3", + "720x576@200Hz 16:9", + "1440x576i@200Hz 4:3", + "1440x576i@200Hz 16:9", + "720x480@240Hz 4:3", + "720x480@240Hz 16:9", + "1440x480i@240Hz 4:3", + "1440x480i@240Hz 16:9", + "1280x720@24Hz 16:9", + "1280x720@25Hz 16:9", + "1280x720@30Hz 16:9", + "1920x1080@120Hz 16:9", + "1920x1080@100Hz 16:9", + "1280x720@24Hz 64:27", + "1280x720@25Hz 64:27", + "1280x720@30Hz 64:27", + "1280x720@50Hz 64:27", + "1280x720@60Hz 64:27", + "1280x720@100Hz 64:27", + "1280x720@120Hz 64:27", + "1920x1080@24Hz 64:27", + "1920x1080@25Hz 64:27", + "1920x1080@30Hz 64:27", + "1920x1080@50Hz 64:27", + "1920x1080@60Hz 64:27", + "1920x1080@100Hz 64:27", + "1920x1080@120Hz 64:27", + "1680x720@24Hz 64:27", + "1680x720@25Hz 64:27", + "1680x720@30Hz 64:27", + "1680x720@50Hz 64:27", + "1680x720@60Hz 64:27", + "1680x720@100Hz 64:27", + "1680x720@120Hz 64:27", + "2560x1080@24Hz 64:27", + "2560x1080@25Hz 64:27", + "2560x1080@30Hz 64:27", + "2560x1080@50Hz 64:27", + "2560x1080@60Hz 64:27", + "2560x1080@100Hz 64:27", + "2560x1080@120Hz 64:27", + "3840x2160@24Hz 16:9", + "3840x2160@25Hz 16:9", + "3840x2160@30Hz 16:9", + "3840x2160@50Hz 16:9", + "3840x2160@60Hz 16:9", + "4096x2160@24Hz 256:135", + "4096x2160@25Hz 256:135", + "4096x2160@30Hz 256:135", + "4096x2160@50Hz 256:135", + "4096x2160@60Hz 256:135", + "3840x2160@24Hz 64:27", + "3840x2160@25Hz 64:27", + "3840x2160@30Hz 64:27", + "3840x2160@50Hz 64:27", + "3840x2160@60Hz 64:27", }; static void @@ -839,10 +849,10 @@ cea_vfpdb(unsigned char *x) } static const char *edid_cea_hdmi_modes[] = { - "3840x2160@30Hz", - "3840x2160@25Hz", - "3840x2160@24Hz", - "4096x2160@24Hz", + "3840x2160@30Hz 16:9", + "3840x2160@25Hz 16:9", + "3840x2160@24Hz 16:9", + "4096x2160@24Hz 256:135", }; static void @@ -1759,28 +1769,28 @@ extract_edid(int fd) } static const struct { - int x, y, refresh; + int x, y, refresh, ratio_w, ratio_h; } established_timings[] = { /* 0x23 bit 7 - 0 */ - {720, 400, 70}, - {720, 400, 88}, - {640, 480, 60}, - {640, 480, 67}, - {640, 480, 72}, - {640, 480, 75}, - {800, 600, 56}, - {800, 600, 60}, + {720, 400, 70, 9, 5}, + {720, 400, 88, 9, 5}, + {640, 480, 60, 4, 3}, + {640, 480, 67, 4, 3}, + {640, 480, 72, 4, 3}, + {640, 480, 75, 4, 3}, + {800, 600, 56, 4, 3}, + {800, 600, 60, 4, 3}, /* 0x24 bit 7 - 0 */ - {800, 600, 72}, - {800, 600, 75}, - {832, 624, 75}, - {1280, 768, 87}, - {1024, 768, 60}, - {1024, 768, 70}, - {1024, 768, 75}, - {1280, 1024, 75}, + {800, 600, 72, 4, 3}, + {800, 600, 75, 4, 3}, + {832, 624, 75, 4, 3}, + {1280, 768, 87, 5, 3}, + {1024, 768, 60, 4, 3}, + {1024, 768, 70, 4, 3}, + {1024, 768, 75, 4, 3}, + {1280, 1024, 75, 5, 4}, /* 0x25 bit 7*/ - {1152, 870, 75}, + {1152, 870, 75, 192, 145}, }; static void print_subsection(char *name, unsigned char *edid, int start, @@ -2066,13 +2076,15 @@ int main(int argc, char **argv) printf("Established timings supported:\n"); for (i = 0; i < 17; i++) { if (edid[0x23 + i / 8] & (1 << (7 - i % 8))) { - printf(" %dx%d@%dHz\n", established_timings[i].x, - established_timings[i].y, established_timings[i].refresh); + printf(" %dx%d@%dHz %u:%u\n", established_timings[i].x, + established_timings[i].y, established_timings[i].refresh, + established_timings[i].ratio_w, established_timings[i].ratio_h); } } printf("Standard timings supported:\n"); for (i = 0; i < 8; i++) { + const char *ratio; uint8_t b1 = edid[0x26 + i * 2], b2 = edid[0x26 + i * 2 + 1]; unsigned int x, y, refresh; @@ -2086,24 +2098,30 @@ int main(int argc, char **argv) x = (b1 + 31) * 8; switch ((b2 >> 6) & 0x3) { case 0x00: - if (claims_one_point_three) + if (claims_one_point_three) { y = x * 10 / 16; - else + ratio = "16:10"; + } else { y = x; + ratio = "1:1"; + } break; case 0x01: y = x * 3 / 4; + ratio = "4:3"; break; case 0x02: y = x * 4 / 5; + ratio = "5:4"; break; case 0x03: y = x * 9 / 16; + ratio = "16:9"; break; } refresh = 60 + (b2 & 0x3f); - printf(" %dx%d@%dHz\n", x, y, refresh); + printf(" %dx%d@%dHz %s\n", x, y, refresh, ratio); } /* detailed timings */ -- 2.14.1 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel