summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2009-10-02 15:12:07 -0400
committerAdam Jackson <ajax@redhat.com>2009-10-02 15:12:07 -0400
commita14b5eeecedd1a33ab2c5753c813345d1b3251e6 (patch)
tree52e8b3383050e31fd3dcca57680748b50e198068
parentee187bfbb73e2badaaab1a12857670f78585c971 (diff)
EDID ESTIII parse
-rw-r--r--edid.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/edid.c b/edid.c
index 1ac50a0..3913c3a 100644
--- a/edid.c
+++ b/edid.c
@@ -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: