diff options
author | Adam Jackson <ajax@redhat.com> | 2009-10-02 15:12:07 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2009-10-02 15:12:07 -0400 |
commit | a14b5eeecedd1a33ab2c5753c813345d1b3251e6 (patch) | |
tree | 52e8b3383050e31fd3dcca57680748b50e198068 | |
parent | ee187bfbb73e2badaaab1a12857670f78585c971 (diff) |
EDID ESTIII parse
-rw-r--r-- | edid.c | 81 |
1 files changed, 81 insertions, 0 deletions
@@ -210,6 +210,86 @@ edid_standard_modes(struct mt_monitor *mon, struct mt_mode *list) return list; } +/* XXX should be indexes into DMT list */ +static const struct { + short w; + short h; + short r; + short rb; +} est3[] = { + /* byte 6 */ + { 640, 350, 85, 0 }, + { 640, 400, 85, 0 }, + { 720, 400, 85, 0 }, + { 640, 480, 85, 0 }, + { 848, 480, 60, 0 }, + { 800, 600, 85, 0 }, + { 1024, 768, 85, 0 }, + { 1152, 864, 75, 0 }, + /* byte 7 */ + { 1280, 768, 60, 1 }, + { 1280, 768, 60, 0 }, + { 1280, 768, 75, 0 }, + { 1280, 768, 85, 0 }, + { 1280, 960, 60, 0 }, + { 1280, 960, 85, 0 }, + { 1280, 1024, 60, 0 }, + { 1280, 1024, 85, 0 }, + /* byte 8 */ + { 1360, 768, 60, 0 }, + { 1440, 900, 60, 1 }, + { 1440, 900, 60, 0 }, + { 1440, 900, 75, 0 }, + { 1440, 900, 85, 0 }, + { 1400, 1050, 60, 1 }, + { 1400, 1050, 60, 0 }, + { 1400, 1050, 75, 0 }, + /* byte 9 */ + { 1400, 1050, 85, 0 }, + { 1680, 1050, 60, 1 }, + { 1680, 1050, 60, 0 }, + { 1680, 1050, 75, 0 }, + { 1680, 1050, 85, 0 }, + { 1600, 1200, 60, 0 }, + { 1600, 1200, 65, 0 }, + { 1600, 1200, 70, 0 }, + /* byte 10 */ + { 1600, 1200, 75, 0 }, + { 1600, 1200, 85, 0 }, + { 1792, 1344, 60, 0 }, + { 1792, 1344, 85, 0 }, + { 1856, 1392, 60, 0 }, + { 1856, 1392, 75, 0 }, + { 1920, 1200, 60, 1 }, + { 1920, 1200, 60, 0 }, + /* byte 11 */ + { 1920, 1200, 75, 0 }, + { 1920, 1200, 85, 0 }, + { 1920, 1440, 60, 0 }, + { 1920, 1440, 75, 0 }, +}; + +static struct mt_mode * +edid_estiii_modes(uint8_t *x) +{ + struct mt_mode *ret = NULL; + int i, j, m; + + for (i = 0; i < 6; i++) { + for (j = 7; j > 0; j--) { + if (x[i] & (1 << j)) { + m = (i * 8) + (7 - j); + ret = mt_modes_add(ret, find_dmt_mode(est3[m].w, + est3[m].h, + est3[m].r, + est3[m].rb)); + } + } + } + + return ret; +} + static struct mt_mode * edid_do_detailed_mode(uint8_t *x) { @@ -263,6 +343,7 @@ edid_do_detailed_block(uint8_t *x) if (x[0] == 0 && x[1] == 0) { switch (x[3]) { case 0xF7: /* EST III */ + return edid_estiii_modes(x); case 0xF8: /* CVT */ case 0xFA: /* standard */ default: |