summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2017-08-31 13:41:06 +0200
committerAdam Jackson <ajax@redhat.com>2017-09-07 12:13:31 -0400
commit0cdf932cef9f9d2a4b38895939bc85d0fcddbf28 (patch)
treeff084b5a596deab96188c1710bd18757b6530157
parent5e7fc7ba19d74bb66d26b232068952bad10fea15 (diff)
edid-decode: add horizontal freq and pixelclock
Add the horizontal frequency and pixelclock information to the established timings and VIC codes. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
-rw-r--r--edid-decode.c381
1 files changed, 201 insertions, 180 deletions
diff --git a/edid-decode.c b/edid-decode.c
index 25b8ed8..a7875a6 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -301,58 +301,59 @@ extract_string(unsigned char *x, int *valid_termination, int len)
}
static const struct {
- int x, y, refresh, ratio_w, ratio_h, rb;
+ int x, y, refresh, ratio_w, ratio_h;
+ int hor_freq_hz, pixclk_khz, rb;
} established_timings3[] = {
/* 0x06 bit 7 - 0 */
- {640, 350, 85, 64, 35},
- {640, 400, 85, 16, 10},
- {720, 400, 85, 9, 5},
- {640, 480, 85, 4, 3},
- {848, 480, 60, 53, 30},
- {800, 600, 85, 4, 3},
- {1024, 768, 85, 4, 3},
- {1152, 864, 75, 4, 3},
+ {640, 350, 85, 64, 35, 37900, 31500},
+ {640, 400, 85, 16, 10, 37900, 31500},
+ {720, 400, 85, 9, 5, 37900, 35500},
+ {640, 480, 85, 4, 3, 43300, 36000},
+ {848, 480, 60, 53, 30, 31000, 33750},
+ {800, 600, 85, 4, 3, 53700, 56250},
+ {1024, 768, 85, 4, 3, 68700, 94500},
+ {1152, 864, 75, 4, 3, 67500, 108000},
/* 0x07 bit 7 - 0 */
- {1280, 768, 60, 5, 3, 1},
- {1280, 768, 60, 5, 3},
- {1280, 768, 75, 5, 3},
- {1280, 768, 85, 5, 3},
- {1280, 960, 60, 4, 3},
- {1280, 960, 85, 4, 3},
- {1280, 1024, 60, 5, 4},
- {1280, 1024, 85, 5, 4},
+ {1280, 768, 60, 5, 3, 47400, 68250, 1},
+ {1280, 768, 60, 5, 3, 47800, 79500},
+ {1280, 768, 75, 5, 3, 60300, 102250},
+ {1280, 768, 85, 5, 3, 68600, 117500},
+ {1280, 960, 60, 4, 3, 60000, 108000},
+ {1280, 960, 85, 4, 3, 85900, 148500},
+ {1280, 1024, 60, 5, 4, 64000, 108000},
+ {1280, 1024, 85, 5, 4, 91100, 157500},
/* 0x08 bit 7 - 0 */
- {1360, 768, 60, 85, 48},
- {1440, 900, 60, 16, 10, 1},
- {1440, 900, 60, 16, 10},
- {1440, 900, 75, 16, 10},
- {1440, 900, 85, 16, 10},
- {1400, 1050, 60, 4, 3, 1},
- {1400, 1050, 60, 4, 3},
- {1400, 1050, 75, 4, 3},
+ {1360, 768, 60, 85, 48, 47700, 85500},
+ {1440, 900, 60, 16, 10, 55500, 88750, 1},
+ {1440, 900, 60, 16, 10, 65300, 121750},
+ {1440, 900, 75, 16, 10, 82300, 156000},
+ {1440, 900, 85, 16, 10, 93900, 179500},
+ {1400, 1050, 60, 4, 3, 64700, 101000, 1},
+ {1400, 1050, 60, 4, 3, 65300, 121750},
+ {1400, 1050, 75, 4, 3, 82300, 156000},
/* 0x09 bit 7 - 0 */
- {1400, 1050, 85, 4, 3},
- {1680, 1050, 60, 16, 10, 1},
- {1680, 1050, 60, 16, 10},
- {1680, 1050, 75, 16, 10},
- {1680, 1050, 85, 16, 10},
- {1600, 1200, 60, 4, 3},
- {1600, 1200, 65, 4, 3},
- {1600, 1200, 70, 4, 3},
+ {1400, 1050, 85, 4, 3, 93900, 179500},
+ {1680, 1050, 60, 16, 10, 64700, 119000, 1},
+ {1680, 1050, 60, 16, 10, 65300, 146250},
+ {1680, 1050, 75, 16, 10, 82300, 187000},
+ {1680, 1050, 85, 16, 10, 93900, 214750},
+ {1600, 1200, 60, 4, 3, 75000, 162000},
+ {1600, 1200, 65, 4, 3, 81300, 175500},
+ {1600, 1200, 70, 4, 3, 87500, 189000},
/* 0x0a bit 7 - 0 */
- {1600, 1200, 75, 4, 3},
- {1600, 1200, 85, 4, 3},
- {1792, 1344, 60, 4, 3},
- {1792, 1344, 75, 4, 3},
- {1856, 1392, 60, 4, 3},
- {1856, 1392, 75, 4, 3},
- {1920, 1200, 60, 16, 10, 1},
- {1920, 1200, 60, 16, 10},
+ {1600, 1200, 75, 4, 3, 93800, 202500},
+ {1600, 1200, 85, 4, 3, 106300, 229500},
+ {1792, 1344, 60, 4, 3, 83600, 204750},
+ {1792, 1344, 75, 4, 3, 106300, 261000},
+ {1856, 1392, 60, 4, 3, 86300, 218250},
+ {1856, 1392, 75, 4, 3, 112500, 288000},
+ {1920, 1200, 60, 16, 10, 74000, 154000, 1},
+ {1920, 1200, 60, 16, 10, 74600, 193250},
/* 0x0b bit 7 - 4 */
- {1920, 1200, 75, 16, 10},
- {1920, 1200, 85, 16, 10},
- {1920, 1440, 60, 4, 3},
- {1920, 1440, 75, 4, 3},
+ {1920, 1200, 75, 16, 10, 94000, 245250},
+ {1920, 1200, 85, 16, 10, 107200, 281250},
+ {1920, 1440, 60, 4, 3, 90000, 234000},
+ {1920, 1440, 75, 4, 3, 112500, 297000},
};
/* 1 means valid data */
@@ -804,114 +805,128 @@ cea_audio_block(unsigned char *x)
}
}
-static const char *edid_cea_modes[] = {
- "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 struct {
+ const char *name;
+ int hor_freq_hz, pixclk_khz;
+} edid_cea_modes[] = {
+ /* VIC 1 */
+ {"640x480@60Hz 4:3", 31469, 25175},
+ {"720x480@60Hz 4:3", 31469, 27000},
+ {"720x480@60Hz 16:9", 31469, 27000},
+ {"1280x720@60Hz 16:9", 45000, 74250},
+ {"1920x1080i@60Hz 16:9", 33750, 74250},
+ {"1440x480i@60Hz 4:3", 15734, 27000},
+ {"1440x480i@60Hz 16:9", 15734, 27000},
+ {"1440x240@60Hz 4:3", 15734, 27000},
+ {"1440x240@60Hz 16:9", 15734, 27000},
+ {"2880x480i@60Hz 4:3", 15734, 54000},
+ /* VIC 11 */
+ {"2880x480i@60Hz 16:9", 15734, 54000},
+ {"2880x240@60Hz 4:3", 15734, 54000},
+ {"2880x240@60Hz 16:9", 15734, 54000},
+ {"1440x480@60Hz 4:3", 31469, 54000},
+ {"1440x480@60Hz 16:9", 31469, 54000},
+ {"1920x1080@60Hz 16:9", 67500, 148500},
+ {"720x576@50Hz 4:3", 31250, 27000},
+ {"720x576@50Hz 16:9", 31250, 27000},
+ {"1280x720@50Hz 16:9", 37500, 74250},
+ {"1920x1080i@50Hz 16:9", 28125, 74250},
+ /* VIC 21 */
+ {"1440x576i@50Hz 4:3", 15625, 27000},
+ {"1440x576i@50Hz 16:9", 15625, 27000},
+ {"1440x288@50Hz 4:3", 15625, 27000},
+ {"1440x288@50Hz 16:9", 15625, 27000},
+ {"2880x576i@50Hz 4:3", 15625, 54000},
+ {"2880x576i@50Hz 16:9", 15625, 54000},
+ {"2880x288@50Hz 4:3", 15625, 54000},
+ {"2880x288@50Hz 16:9", 15625, 54000},
+ {"1440x576@50Hz 4:3", 31250, 54000},
+ {"1440x576@50Hz 16:9", 31250, 54000},
+ /* VIC 31 */
+ {"1920x1080@50Hz 16:9", 56250, 148500},
+ {"1920x1080@24Hz 16:9", 27000, 74250},
+ {"1920x1080@25Hz 16:9", 28125, 74250},
+ {"1920x1080@30Hz 16:9", 33750, 74250},
+ {"2880x480@60Hz 4:3", 31469, 108000},
+ {"2880x480@60Hz 16:9", 31469, 108000},
+ {"2880x576@50Hz 4:3", 31250, 108000},
+ {"2880x576@50Hz 16:9", 31250, 108000},
+ {"1920x1080i@50Hz 16:9", 31250, 72000},
+ {"1920x1080i@100Hz 16:9", 56250, 148500},
+ /* VIC 41 */
+ {"1280x720@100Hz 16:9", 75000, 148500},
+ {"720x576@100Hz 4:3", 62500, 54000},
+ {"720x576@100Hz 16:9", 62500, 54000},
+ {"1440x576@100Hz 4:3", 31250, 54000},
+ {"1440x576@100Hz 16:9", 31250, 54000},
+ {"1920x1080i@120Hz 16:9", 67500, 148500},
+ {"1280x720@120Hz 16:9", 90000, 148500},
+ {"720x480@120Hz 4:3", 62937, 54000},
+ {"720x480@120Hz 16:9", 62937, 54000},
+ {"1440x480i@120Hz 4:3", 31469, 54000},
+ /* VIC 51 */
+ {"1440x480i@120Hz 16:9", 31469, 54000},
+ {"720x576@200Hz 4:3", 125000, 108000},
+ {"720x576@200Hz 16:9", 125000, 108000},
+ {"1440x576i@200Hz 4:3", 62500, 108000},
+ {"1440x576i@200Hz 16:9", 62500, 108000},
+ {"720x480@240Hz 4:3", 125874, 108000},
+ {"720x480@240Hz 16:9", 125874, 108000},
+ {"1440x480i@240Hz 4:3", 62937, 108000},
+ {"1440x480i@240Hz 16:9", 62937, 108000},
+ {"1280x720@24Hz 16:9", 18000, 59400},
+ /* VIC 61 */
+ {"1280x720@25Hz 16:9", 18750, 74250},
+ {"1280x720@30Hz 16:9", 22500, 74250},
+ {"1920x1080@120Hz 16:9", 135000, 297000},
+ {"1920x1080@100Hz 16:9", 112500, 297000},
+ {"1280x720@24Hz 64:27", 18000, 59400},
+ {"1280x720@25Hz 64:27", 18750, 74250},
+ {"1280x720@30Hz 64:27", 22500, 74250},
+ {"1280x720@50Hz 64:27", 37500, 74250},
+ {"1280x720@60Hz 64:27", 45000, 74250},
+ {"1280x720@100Hz 64:27", 75000, 148500},
+ /* VIC 71 */
+ {"1280x720@120Hz 64:27", 91000, 148500},
+ {"1920x1080@24Hz 64:27", 27000, 74250},
+ {"1920x1080@25Hz 64:27", 28125, 74250},
+ {"1920x1080@30Hz 64:27", 33750, 74250},
+ {"1920x1080@50Hz 64:27", 56250, 148500},
+ {"1920x1080@60Hz 64:27", 67500, 148500},
+ {"1920x1080@100Hz 64:27", 112500, 297000},
+ {"1920x1080@120Hz 64:27", 135000, 297000},
+ {"1680x720@24Hz 64:27", 18000, 59400},
+ {"1680x720@25Hz 64:27", 18750, 59400},
+ /* VIC 81 */
+ {"1680x720@30Hz 64:27", 22500, 59400},
+ {"1680x720@50Hz 64:27", 37500, 82500},
+ {"1680x720@60Hz 64:27", 45000, 99000},
+ {"1680x720@100Hz 64:27", 82500, 165000},
+ {"1680x720@120Hz 64:27", 99000, 198000},
+ {"2560x1080@24Hz 64:27", 26400, 99000},
+ {"2560x1080@25Hz 64:27", 28125, 90000},
+ {"2560x1080@30Hz 64:27", 33750, 118800},
+ {"2560x1080@50Hz 64:27", 56250, 185625},
+ {"2560x1080@60Hz 64:27", 66000, 198000},
+ /* VIC 91 */
+ {"2560x1080@100Hz 64:27", 125000, 371250},
+ {"2560x1080@120Hz 64:27", 150000, 495000},
+ {"3840x2160@24Hz 16:9", 54000, 297000},
+ {"3840x2160@25Hz 16:9", 56250, 297000},
+ {"3840x2160@30Hz 16:9", 67500, 297000},
+ {"3840x2160@50Hz 16:9", 112500, 594000},
+ {"3840x2160@60Hz 16:9", 135000, 594000},
+ {"4096x2160@24Hz 256:135", 54000, 297000},
+ {"4096x2160@25Hz 256:135", 56250, 297000},
+ {"4096x2160@30Hz 256:135", 67500, 297000},
+ /* VIC 101 */
+ {"4096x2160@50Hz 256:135", 112500, 594000},
+ {"4096x2160@60Hz 256:135", 135000, 594000},
+ {"3840x2160@24Hz 64:27", 54000, 297000},
+ {"3840x2160@25Hz 64:27", 56250, 297000},
+ {"3840x2160@30Hz 64:27", 67500, 297000},
+ {"3840x2160@50Hz 64:27", 112500, 594000},
+ {"3840x2160@60Hz 64:27", 135000, 594000},
};
static void
@@ -937,7 +952,7 @@ cea_svd(unsigned char *x, int n)
}
if (vic > 0 && vic <= ARRAY_SIZE(edid_cea_modes))
- mode = edid_cea_modes[vic - 1];
+ mode = edid_cea_modes[vic - 1].name;
else
mode = "Unknown mode";
@@ -981,7 +996,7 @@ cea_vfpdb(unsigned char *x)
index = vic - 1;
if (index < ARRAY_SIZE(edid_cea_modes))
- mode = edid_cea_modes[vic];
+ mode = edid_cea_modes[vic].name;
else
mode = "Unknown mode";
@@ -993,11 +1008,14 @@ cea_vfpdb(unsigned char *x)
}
}
-static const char *edid_cea_hdmi_modes[] = {
- "3840x2160@30Hz 16:9",
- "3840x2160@25Hz 16:9",
- "3840x2160@24Hz 16:9",
- "4096x2160@24Hz 256:135",
+static struct {
+ const char *name;
+ int hor_freq_hz, pixclk_khz;
+} edid_cea_hdmi_modes[] = {
+ {"3840x2160@30Hz 16:9", 67500, 297000},
+ {"3840x2160@25Hz 16:9", 56250, 297000},
+ {"3840x2160@24Hz 16:9", 54000, 297000},
+ {"4096x2160@24Hz 256:135", 54000, 297000},
};
static void
@@ -1084,7 +1102,7 @@ cea_hdmi_block(unsigned char *x)
vic--;
if (vic < ARRAY_SIZE(edid_cea_hdmi_modes))
- mode = edid_cea_hdmi_modes[vic];
+ mode = edid_cea_hdmi_modes[vic].name;
else
mode = "Unknown mode";
@@ -1917,27 +1935,28 @@ extract_edid(int fd)
static const struct {
int x, y, refresh, ratio_w, ratio_h;
+ int hor_freq_hz, pixclk_khz, interlaced;
} established_timings[] = {
/* 0x23 bit 7 - 0 */
- {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},
+ {720, 400, 70, 9, 5, 31469, 28320},
+ {720, 400, 88, 9, 5, 39500, 35500},
+ {640, 480, 60, 4, 3, 31469, 25175},
+ {640, 480, 67, 4, 3, 35000, 30240},
+ {640, 480, 72, 4, 3, 37900, 31500},
+ {640, 480, 75, 4, 3, 37500, 31500},
+ {800, 600, 56, 4, 3, 35200, 36000},
+ {800, 600, 60, 4, 3, 37900, 40000},
/* 0x24 bit 7 - 0 */
- {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},
+ {800, 600, 72, 4, 3, 48100, 50000},
+ {800, 600, 75, 4, 3, 46900, 49500},
+ {832, 624, 75, 4, 3, 49726, 57284},
+ {1280, 768, 87, 5, 3, 35522, 44900, 1},
+ {1024, 768, 60, 4, 3, 48400, 65000},
+ {1024, 768, 70, 4, 3, 56500, 75000},
+ {1024, 768, 75, 4, 3, 60000, 78750},
+ {1280, 1024, 75, 5, 4, 80000, 135000},
/* 0x25 bit 7*/
- {1152, 870, 75, 192, 145},
+ {1152, 870, 75, 192, 145, 67500, 108000},
};
static void print_subsection(char *name, unsigned char *edid, int start,
@@ -2228,8 +2247,10 @@ 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 %u:%u\n", established_timings[i].x,
- established_timings[i].y, established_timings[i].refresh,
+ printf(" %dx%d%s@%dHz %u:%u\n",
+ established_timings[i].x, established_timings[i].y,
+ established_timings[i].interlaced ? "i" : "",
+ established_timings[i].refresh,
established_timings[i].ratio_w, established_timings[i].ratio_h);
}
}