Mon Nov 17 00:46:04 2014 UTC ()
Parse the extension block count field, and make it available in struct edid_info


(jmcneill)
diff -r1.12 -r1.13 src/sys/dev/videomode/edid.c
diff -r1.3 -r1.4 src/sys/dev/videomode/edidreg.h
diff -r1.2 -r1.3 src/sys/dev/videomode/edidvar.h

cvs diff -r1.12 -r1.13 src/sys/dev/videomode/edid.c (expand / switch to unified diff)

--- src/sys/dev/videomode/edid.c 2013/02/08 16:35:10 1.12
+++ src/sys/dev/videomode/edid.c 2014/11/17 00:46:04 1.13
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: edid.c,v 1.12 2013/02/08 16:35:10 skrll Exp $ */ 1/* $NetBSD: edid.c,v 1.13 2014/11/17 00:46:04 jmcneill Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2006 Itronix Inc. 4 * Copyright (c) 2006 Itronix Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Written by Garrett D'Amore for Itronix Inc. 7 * Written by Garrett D'Amore for Itronix Inc.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * 2. Redistributions in binary form must reproduce the above copyright
@@ -22,27 +22,27 @@ @@ -22,27 +22,27 @@
22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 24 * ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */  32 */
33 33
34#include <sys/cdefs.h> 34#include <sys/cdefs.h>
35__KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.12 2013/02/08 16:35:10 skrll Exp $"); 35__KERNEL_RCSID(0, "$NetBSD: edid.c,v 1.13 2014/11/17 00:46:04 jmcneill Exp $");
36 36
37#include <sys/param.h> 37#include <sys/param.h>
38#include <sys/systm.h> 38#include <sys/systm.h>
39#include <sys/device.h> 39#include <sys/device.h>
40#include <sys/kernel.h> 40#include <sys/kernel.h>
41#include <sys/malloc.h> 41#include <sys/malloc.h>
42#include <dev/videomode/videomode.h> 42#include <dev/videomode/videomode.h>
43#include <dev/videomode/ediddevs.h> 43#include <dev/videomode/ediddevs.h>
44#include <dev/videomode/edidreg.h> 44#include <dev/videomode/edidreg.h>
45#include <dev/videomode/edidvar.h> 45#include <dev/videomode/edidvar.h>
46#include <dev/videomode/vesagtf.h> 46#include <dev/videomode/vesagtf.h>
47 47
48#define EDIDVERBOSE 1 48#define EDIDVERBOSE 1
@@ -276,26 +276,28 @@ edid_print(struct edid_info *edid) @@ -276,26 +276,28 @@ edid_print(struct edid_info *edid)
276 printf(" %s%sH %s%sV)\n", 276 printf(" %s%sH %s%sV)\n",
277 edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "", 277 edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "",
278 edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "", 278 edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "",
279 edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "", 279 edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "",
280 edid->edid_modes[i].flags & VID_NVSYNC ? "-" : ""); 280 edid->edid_modes[i].flags & VID_NVSYNC ? "-" : "");
281 } 281 }
282 if (edid->edid_preferred_mode) 282 if (edid->edid_preferred_mode)
283 printf("Preferred mode: %dx%d @ %dHz\n", 283 printf("Preferred mode: %dx%d @ %dHz\n",
284 edid->edid_preferred_mode->hdisplay, 284 edid->edid_preferred_mode->hdisplay,
285 edid->edid_preferred_mode->vdisplay, 285 edid->edid_preferred_mode->vdisplay,
286 DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000, 286 DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000,
287 edid->edid_preferred_mode->htotal), 287 edid->edid_preferred_mode->htotal),
288 edid->edid_preferred_mode->vtotal)); 288 edid->edid_preferred_mode->vtotal));
 289
 290 printf("Number of extension blocks: %d\n", edid->edid_ext_block_count);
289} 291}
290 292
291static const struct videomode * 293static const struct videomode *
292edid_mode_lookup_list(const char *name) 294edid_mode_lookup_list(const char *name)
293{ 295{
294 int i; 296 int i;
295 297
296 for (i = 0; i < videomode_count; i++) 298 for (i = 0; i < videomode_count; i++)
297 if (strcmp(name, videomode_list[i].name) == 0) 299 if (strcmp(name, videomode_list[i].name) == 0)
298 return &videomode_list[i]; 300 return &videomode_list[i];
299 return NULL; 301 return NULL;
300} 302}
301 303
@@ -559,26 +561,28 @@ edid_parse(uint8_t *data, struct edid_in @@ -559,26 +561,28 @@ edid_parse(uint8_t *data, struct edid_in
559 561
560 edid->edid_gamma = EDID_GAMMA(data); 562 edid->edid_gamma = EDID_GAMMA(data);
561 edid->edid_features = EDID_FEATURES(data); 563 edid->edid_features = EDID_FEATURES(data);
562 564
563 edid->edid_chroma.ec_redx = EDID_CHROMA_REDX(data); 565 edid->edid_chroma.ec_redx = EDID_CHROMA_REDX(data);
564 edid->edid_chroma.ec_redy = EDID_CHROMA_REDX(data); 566 edid->edid_chroma.ec_redy = EDID_CHROMA_REDX(data);
565 edid->edid_chroma.ec_greenx = EDID_CHROMA_GREENX(data); 567 edid->edid_chroma.ec_greenx = EDID_CHROMA_GREENX(data);
566 edid->edid_chroma.ec_greeny = EDID_CHROMA_GREENY(data); 568 edid->edid_chroma.ec_greeny = EDID_CHROMA_GREENY(data);
567 edid->edid_chroma.ec_bluex = EDID_CHROMA_BLUEX(data); 569 edid->edid_chroma.ec_bluex = EDID_CHROMA_BLUEX(data);
568 edid->edid_chroma.ec_bluey = EDID_CHROMA_BLUEY(data); 570 edid->edid_chroma.ec_bluey = EDID_CHROMA_BLUEY(data);
569 edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data); 571 edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data);
570 edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data); 572 edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data);
571 573
 574 edid->edid_ext_block_count = EDID_EXT_BLOCK_COUNT(data);
 575
572 /* lookup established modes */ 576 /* lookup established modes */
573 edid->edid_nmodes = 0; 577 edid->edid_nmodes = 0;
574 edid->edid_preferred_mode = NULL; 578 edid->edid_preferred_mode = NULL;
575 estmodes = EDID_EST_TIMING(data); 579 estmodes = EDID_EST_TIMING(data);
576 /* Iterate in esztablished timing order */ 580 /* Iterate in esztablished timing order */
577 for (i = 15; i >= 0; i--) { 581 for (i = 15; i >= 0; i--) {
578 if (estmodes & (1 << i)) { 582 if (estmodes & (1 << i)) {
579 vmp = edid_mode_lookup_list(_edid_modes[i]); 583 vmp = edid_mode_lookup_list(_edid_modes[i]);
580 if (vmp != NULL) { 584 if (vmp != NULL) {
581 edid->edid_modes[edid->edid_nmodes] = *vmp; 585 edid->edid_modes[edid->edid_nmodes] = *vmp;
582 edid->edid_nmodes++; 586 edid->edid_nmodes++;
583 } 587 }
584#ifdef DIAGNOSTIC 588#ifdef DIAGNOSTIC

cvs diff -r1.3 -r1.4 src/sys/dev/videomode/edidreg.h (expand / switch to unified diff)

--- src/sys/dev/videomode/edidreg.h 2011/03/30 18:49:56 1.3
+++ src/sys/dev/videomode/edidreg.h 2014/11/17 00:46:04 1.4
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: edidreg.h,v 1.3 2011/03/30 18:49:56 jdc Exp $ */ 1/* $NetBSD: edidreg.h,v 1.4 2014/11/17 00:46:04 jmcneill Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2006 Itronix Inc. 4 * Copyright (c) 2006 Itronix Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Written by Garrett D'Amore for Itronix Inc. 7 * Written by Garrett D'Amore for Itronix Inc.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * 2. Redistributions in binary form must reproduce the above copyright
@@ -240,14 +240,16 @@ @@ -240,14 +240,16 @@
240#define EDID_DESC_COLOR_WHITEX(ptr) 240#define EDID_DESC_COLOR_WHITEX(ptr)
241#define EDID_DESC_COLOR_WHITE_INDEX_1(ptr) ((ptr)[5]) 241#define EDID_DESC_COLOR_WHITE_INDEX_1(ptr) ((ptr)[5])
242#define EDID_DESC_COLOR_WHITEX_1(ptr) _CHROMA(ptr, 6, 2, 7) 242#define EDID_DESC_COLOR_WHITEX_1(ptr) _CHROMA(ptr, 6, 2, 7)
243#define EDID_DESC_COLOR_WHITEY_1(ptr) _CHROMA(ptr, 6, 0, 8) 243#define EDID_DESC_COLOR_WHITEY_1(ptr) _CHROMA(ptr, 6, 0, 8)
244#define EDID_DESC_COLOR_GAMMA_1(ptr) _GAMMA(ptr[9]) 244#define EDID_DESC_COLOR_GAMMA_1(ptr) _GAMMA(ptr[9])
245#define EDID_DESC_COLOR_WHITE_INDEX_2(ptr) ((ptr)[10]) 245#define EDID_DESC_COLOR_WHITE_INDEX_2(ptr) ((ptr)[10])
246#define EDID_DESC_COLOR_WHITEX_2(ptr) _CHROMA(ptr, 11, 2, 12) 246#define EDID_DESC_COLOR_WHITEX_2(ptr) _CHROMA(ptr, 11, 2, 12)
247#define EDID_DESC_COLOR_WHITEY_2(ptr) _CHROMA(ptr, 11, 0, 13) 247#define EDID_DESC_COLOR_WHITEY_2(ptr) _CHROMA(ptr, 11, 0, 13)
248#define EDID_DESC_COLOR_GAMMA_2(ptr) _GAMMA(ptr[14]) 248#define EDID_DESC_COLOR_GAMMA_2(ptr) _GAMMA(ptr[14])
249 249
250#define EDID_DESC_STD_TIMING_START 5 250#define EDID_DESC_STD_TIMING_START 5
251#define EDID_DESC_STD_TIMING_COUNT 6 251#define EDID_DESC_STD_TIMING_COUNT 6
252 252
 253#define EDID_EXT_BLOCK_COUNT(ptr) ((ptr)[126])
 254
253#endif /* _DEV_VIDEOMODE_EDIDREG_H */ 255#endif /* _DEV_VIDEOMODE_EDIDREG_H */

cvs diff -r1.2 -r1.3 src/sys/dev/videomode/edidvar.h (expand / switch to unified diff)

--- src/sys/dev/videomode/edidvar.h 2006/05/11 19:05:41 1.2
+++ src/sys/dev/videomode/edidvar.h 2014/11/17 00:46:04 1.3
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: edidvar.h,v 1.2 2006/05/11 19:05:41 gdamore Exp $ */ 1/* $NetBSD: edidvar.h,v 1.3 2014/11/17 00:46:04 jmcneill Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2006 Itronix Inc. 4 * Copyright (c) 2006 Itronix Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Written by Garrett D'Amore for Itronix Inc. 7 * Written by Garrett D'Amore for Itronix Inc.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions 10 * modification, are permitted provided that the following conditions
11 * are met: 11 * are met:
12 * 1. Redistributions of source code must retain the above copyright 12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer. 13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * 2. Redistributions in binary form must reproduce the above copyright
@@ -65,26 +65,27 @@ struct edid_info { @@ -65,26 +65,27 @@ struct edid_info {
65 char edid_productname[16]; 65 char edid_productname[16];
66 char edid_comment[16]; 66 char edid_comment[16];
67 char edid_serial[16]; 67 char edid_serial[16];
68 uint16_t edid_product; 68 uint16_t edid_product;
69 uint8_t edid_version; 69 uint8_t edid_version;
70 uint8_t edid_revision; 70 uint8_t edid_revision;
71 int edid_year; 71 int edid_year;
72 int edid_week; 72 int edid_week;
73 uint8_t edid_video_input; /* see edidregs.h */ 73 uint8_t edid_video_input; /* see edidregs.h */
74 uint8_t edid_max_hsize; /* in cm */ 74 uint8_t edid_max_hsize; /* in cm */
75 uint8_t edid_max_vsize; /* in cm */ 75 uint8_t edid_max_vsize; /* in cm */
76 uint8_t edid_gamma; 76 uint8_t edid_gamma;
77 uint8_t edid_features; 77 uint8_t edid_features;
 78 uint8_t edid_ext_block_count;
78 79
79 int edid_have_range; 80 int edid_have_range;
80 struct edid_range edid_range; 81 struct edid_range edid_range;
81 82
82 struct edid_chroma edid_chroma; 83 struct edid_chroma edid_chroma;
83 84
84 /* parsed modes */ 85 /* parsed modes */
85 struct videomode *edid_preferred_mode; 86 struct videomode *edid_preferred_mode;
86 int edid_nmodes; 87 int edid_nmodes;
87 struct videomode edid_modes[64]; 88 struct videomode edid_modes[64];
88}; 89};
89 90
90int edid_is_valid(uint8_t *); 91int edid_is_valid(uint8_t *);