diff options
author | Burt P <pburt0@gmail.com> | 2019-08-23 22:11:18 -0500 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-08-28 13:15:48 +0200 |
commit | e297217fad830e2c2b353ce594dbd80d3bf60c90 (patch) | |
tree | b007820f01db7ec55248229398558ad7ade67e12 /deps | |
parent | 348d6d919c7d128cd6300e9a7f02483850edd079 (diff) |
monitors: edid fixes
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'deps')
-rw-r--r-- | deps/sysobj_early/include/util_edid.h | 3 | ||||
-rw-r--r-- | deps/sysobj_early/src/util_edid.c | 37 |
2 files changed, 34 insertions, 6 deletions
diff --git a/deps/sysobj_early/include/util_edid.h b/deps/sysobj_early/include/util_edid.h index 319900e2..b7204568 100644 --- a/deps/sysobj_early/include/util_edid.h +++ b/deps/sysobj_early/include/util_edid.h @@ -61,7 +61,8 @@ typedef struct { /* order by rising priority */ enum { - OUTSRC_EDID, + OUTSRC_INVALID = -1, + OUTSRC_EDID = 0, OUTSRC_ETB, OUTSRC_STD, OUTSRC_DTD, diff --git a/deps/sysobj_early/src/util_edid.c b/deps/sysobj_early/src/util_edid.c index 9c48a397..6af3282e 100644 --- a/deps/sysobj_early/src/util_edid.c +++ b/deps/sysobj_early/src/util_edid.c @@ -64,7 +64,7 @@ static inline char *rstr(edid *e, uint32_t offset, uint32_t len) { if (!bounds_check(e, offset+len)) return NULL; char *raw = malloc(len+1), *ret = NULL; - strncpy(raw, &e->u8[offset], len); + strncpy(raw, (char*)&e->u8[offset], len); raw[len] = 0; ret = g_utf8_make_valid(raw, len); g_free(raw); @@ -75,7 +75,7 @@ static inline char *rstr_strip(edid *e, uint32_t offset, uint32_t len) { if (!bounds_check(e, offset+len)) return NULL; char *raw = malloc(len+1), *ret = NULL; - strncpy(raw, &e->u8[offset], len); + strncpy(raw, (char*)&e->u8[offset], len); raw[len] = 0; ret = g_strstrip(g_utf8_make_valid(raw, len)); g_free(raw); @@ -300,6 +300,12 @@ static void did_block_decode(DisplayIDBlock *blk) { /* UNTESTED */ if (rpnpcpy(&ven, e, a) ) e->ven = ven; + if (u8[12] || u8[13]) { + e->dom.week = u8[12]; + e->dom.year = u8[13] + 2000; + e->dom.is_model_year = (e->dom.week == 255); + e->dom.std = STD_DISPLAYID; + } e->did_strings[e->did_string_count].is_product_name = 1; e->did_strings[e->did_string_count].len = blk->len; e->did_strings[e->did_string_count].str = rstr_strip(e, a+12, u8[b+11]); @@ -310,6 +316,12 @@ static void did_block_decode(DisplayIDBlock *blk) { /* UNTESTED */ if (rouicpy(&ven, e, a) ) e->ven = ven; + if (u8[12] || u8[13]) { + e->dom.week = u8[12]; + e->dom.year = u8[13] + 2000; + e->dom.is_model_year = (e->dom.week == 255); + e->dom.std = STD_DISPLAYID20; + } e->did_strings[e->did_string_count].is_product_name = 1; e->did_strings[e->did_string_count].len = blk->len; e->did_strings[e->did_string_count].str = rstr_strip(e, a+12, u8[b+11]); @@ -407,7 +419,7 @@ static edid_output edid_output_from_svd(uint8_t index) { return out; } } - return (edid_output){}; + return (edid_output){.src = OUTSRC_INVALID}; } edid *edid_new(const char *data, unsigned int len) { @@ -446,7 +458,7 @@ edid *edid_new(const char *data, unsigned int len) { e->n_serial = r32le(e, 12, NOMASK); /* bytes 12-15 */ e->dom.week = e->u8[16]; /* byte 16 */ e->dom.year = e->u8[17] + 1990; /* byte 17 */ - e->dom.is_model_year = (e->dom.week > 52); + e->dom.is_model_year = (e->dom.week == 255); e->dom.std = STD_EDID; e->a_or_d = (e->u8[20] & 0x80) ? 1 : 0; @@ -504,6 +516,9 @@ edid *edid_new(const char *data, unsigned int len) { /* 0101 is unused */ if (e->u8[i] == 0x01 && e->u8[i+1] == 0x01) continue; + /* 00.. is invalid/"reserved" */ + if (e->u8[i] == 0x00) + continue; double xres = (e->u8[i] + 31) * 8; double yres = 0; int iar = (e->u8[i+1] >> 6) & 0x3; @@ -739,6 +754,9 @@ edid *edid_new(const char *data, unsigned int len) { /* svds */ for(i = 0; i < e->svd_count; i++) { e->svds[i].out = edid_output_from_svd(e->svds[i].v); + if (e->svds[i].out.src == OUTSRC_INVALID) + continue; + if (e->svds[i].v >= 128 && e->svds[i].v <= 192) { e->svds[i].is_native = 1; @@ -757,6 +775,15 @@ edid *edid_new(const char *data, unsigned int len) { OUTPUT_CPY_SIZE(e->img_svd, e->img_max); } } + /* remove invalid SVDs */ + int d = 0; + for(i = 0; i < e->svd_count; i++) { + if (d != i) + e->svds[d].out = e->svds[i].out; + if (e->svds[i].out.src != OUTSRC_INVALID) + d++; + } + e->svd_count -= (i-d); /* didts */ for(i = 0; i < e->didt_count; i++) { @@ -1237,7 +1264,7 @@ char *edid_manf_date_describe(struct edid_manf_date dom) { if (!dom.year) return g_strdup("unspecified"); if (dom.is_model_year) return g_strdup_printf(_("model year %d"), dom.year); - if (dom.week <= 52) + if (dom.week && dom.week <= 53) return g_strdup_printf(_("week %d of %d"), dom.week, dom.year); return g_strdup_printf("%d", dom.year); } |