diff options
Diffstat (limited to 'edid.c')
-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: |