diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | get-edid.h | 1 | ||||
-rw-r--r-- | monitor-get-edid.c | 7 | ||||
-rw-r--r-- | vbe.c | 102 |
4 files changed, 38 insertions, 74 deletions
@@ -27,7 +27,7 @@ HAS_OPEN_FIRMWARE = y TARGETS = monitor-get-edid -CFLAGS = -O -Wall # -g -DDEBUG +CFLAGS = -O -Wall # -g OBJS = monitor-get-edid.c ifeq (y,$(HAS_VBE)) @@ -1 +1,2 @@ +int verbose; int get_edid(char *edid); diff --git a/monitor-get-edid.c b/monitor-get-edid.c index ed5b480..781684c 100644 --- a/monitor-get-edid.c +++ b/monitor-get-edid.c @@ -9,9 +9,14 @@ #include <stdarg.h> #include "get-edid.h" -int main(void) +int verbose = 0; + +int main(int argc, char **argv) { char edid[256]; + + if (argc > 1 && strcmp(argv[1], "-v") == 0) verbose = 1; + int size = get_edid(edid); if (size) write(1, edid, size); @@ -23,29 +23,17 @@ #include <stdarg.h> -/* used by libint10 */ +/* also used by libint10 */ void log_err(char *format, ...) { - va_list args; - va_start(args, format); - vfprintf(stderr, format, args); - va_end(args); + if (verbose) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + } } -#ifdef DEBUG -/* Record returned by int 0x10, function 0x4f, subfunction 0x00. */ -struct vbe_info { - unsigned int version; - unsigned int oem_version; - unsigned int memory_size; - char *oem_name; - char *vendor_name; - char *product_name; - char *product_revision; - unsigned int modes; - unsigned int mode_list[0x100]; -}; - /* * Create a 'canonical' version, i.e. no spaces at start and end. * @@ -54,22 +42,16 @@ struct vbe_info { */ static char *canon_str(char *s, int len) { - char *m2, *m1, *m0 = malloc(len + 1); - int i; + char *start, *end; - for(m1 = m0, i = 0; i < len; i++) { - if(m1 == m0 && s[i] <= ' ') continue; - *m1++ = s[i]; - } - *m1 = 0; - while(m1 > m0 && m1[-1] <= ' ') { - *--m1 = 0; - } + for (start = s; start < s + len; start++) if (start[0] > ' ') break; - m2 = strdup(m0); - free(m0); + for (end = &s[len - 1]; end >= start; end--) { + if (end[0] > ' ') break; + end[0] = 0; + } - return m2; + return start; } static unsigned segofs2addr(unsigned char *segofs) @@ -101,7 +83,12 @@ static unsigned get_data(unsigned char *buf, unsigned buf_size, unsigned addr) return len; } -#endif + +static char *get_str(unsigned char *buf, unsigned buf_size, char *v) +{ + int len = get_data(buf, buf_size, segofs2addr(v)); + return canon_str(buf, len); +} #define GET_WORD(ADDR, OFS) ((ADDR)[OFS] + ((ADDR)[(OFS) + 1] << 8)) @@ -121,53 +108,26 @@ int vbe_check_vbe_info(void) /* Get VBE block */ i = CallInt10(&ax, &bx, &cx, v, sizeof(v), cpuemu) & 0xffff; if (i != 0x4f) { -#ifdef DEBUG log_err("VBE: Error (0x4f00): 0x%04x\n", i); -#endif return 0; } -#ifdef DEBUG { - int l, u; unsigned char tmp[1024]; - struct vbe_info vbe; /* Parse VBE block */ - vbe.version = GET_WORD(v, 0x04); - vbe.oem_version = GET_WORD(v, 0x14); - vbe.memory_size = GET_WORD(v, 0x12) << 16; + int version = GET_WORD(v, 0x04); + int oem_version = GET_WORD(v, 0x14); + int memory_size = GET_WORD(v, 0x12) << 16; log_err("version = %u.%u, oem version = %u.%u\n", - vbe.version >> 8, vbe.version & 0xff, vbe.oem_version >> 8, vbe.oem_version & 0xff); - log_err("memory = %uk\n", vbe.memory_size >> 10); - - l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x06)); - vbe.oem_name = canon_str(tmp, l); - log_err("oem name [0x%05x] = \"%s\"\n", u, vbe.oem_name); - - l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x16)); - vbe.vendor_name = canon_str(tmp, l); - log_err("vendor name [0x%05x] = \"%s\"\n", u, vbe.vendor_name); - - l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x1a)); - vbe.product_name = canon_str(tmp, l); - log_err("product name [0x%05x] = \"%s\"\n", u, vbe.product_name); - - l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x1e)); - vbe.product_revision = canon_str(tmp, l); - log_err("product revision [0x%05x] = \"%s\"\n", u, vbe.product_revision); - - l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x0e)) >> 1; - for(i = vbe.modes = 0; i < l && i < sizeof vbe.mode_list / sizeof *vbe.mode_list; i++) { - u = GET_WORD(tmp, 2 * i); - if(u != 0xffff) - vbe.mode_list[vbe.modes++] = u; - else - break; - } - log_err("%u video modes\n", vbe.modes); + version >> 8, version & 0xff, oem_version >> 8, oem_version & 0xff); + log_err("memory = %uk\n", memory_size >> 10); + + log_err("oem name = %s\n", get_str(tmp, sizeof tmp, v + 0x06)); + log_err("vendor name = %s\n", get_str(tmp, sizeof tmp, v + 0x16)); + log_err("product name = %s\n", get_str(tmp, sizeof tmp, v + 0x1a)); + log_err("product revision = %s\n", get_str(tmp, sizeof tmp, v + 0x1e)); } -#endif return 1; } @@ -185,9 +145,7 @@ int vbe_get_edid_info(char *edid) /* Get EDID block */ i = CallInt10(&ax, &bx, &cx, edid, 256, cpuemu) & 0xffff; if (i != 0x4f) { -#ifdef DEBUG log_err("EDID: Error (0x4f15): 0x%04x\n", i); -#endif return 0; } |