Lines Matching defs:edid
1 /* $OpenBSD: edid.c,v 1.8 2024/11/06 09:34:10 miod Exp $ */
2 /* $NetBSD: edid.c,v 1.15 2020/01/25 15:59:11 maxv Exp $ */
158 edid_print(struct edid_info *edid)
162 if (edid == NULL)
164 printf("Vendor: [%s] %s\n", edid->edid_vendor, edid->edid_vendorname);
165 printf("Product: [%04X] %s\n", edid->edid_product,
166 edid->edid_productname);
167 printf("Serial number: %s\n", edid->edid_serial);
169 edid->edid_year, edid->edid_week);
170 printf("EDID Version %d.%d\n", edid->edid_version,
171 edid->edid_revision);
172 printf("EDID Comment: %s\n", edid->edid_comment);
174 printf("Video Input: %x\n", edid->edid_video_input);
175 if (edid->edid_video_input & EDID_VIDEO_INPUT_DIGITAL) {
177 if (edid->edid_video_input & EDID_VIDEO_INPUT_DFP1_COMPAT)
182 switch (EDID_VIDEO_INPUT_LEVEL(edid->edid_video_input)) {
196 if (edid->edid_video_input & EDID_VIDEO_INPUT_BLANK_TO_BLACK)
198 if (edid->edid_video_input & EDID_VIDEO_INPUT_SEPARATE_SYNCS)
200 if (edid->edid_video_input & EDID_VIDEO_INPUT_COMPOSITE_SYNC)
202 if (edid->edid_video_input & EDID_VIDEO_INPUT_SYNC_ON_GRN)
204 if (edid->edid_video_input & EDID_VIDEO_INPUT_SERRATION)
209 edid->edid_gamma / 100, edid->edid_gamma % 100);
212 edid->edid_max_hsize, edid->edid_max_vsize);
214 printf("Features: %x\n", edid->edid_features);
215 if (edid->edid_features & EDID_FEATURES_STANDBY)
217 if (edid->edid_features & EDID_FEATURES_SUSPEND)
219 if (edid->edid_features & EDID_FEATURES_ACTIVE_OFF)
221 switch (EDID_FEATURES_DISP_TYPE(edid->edid_features)) {
235 if (edid->edid_features & EDID_FEATURES_STD_COLOR)
237 if (edid->edid_features & EDID_FEATURES_PREFERRED_TIMING)
239 if (edid->edid_features & EDID_FEATURES_DEFAULT_GTF)
243 printf("\tRed X: 0.%03d\n", edid->edid_chroma.ec_redx);
244 printf("\tRed Y: 0.%03d\n", edid->edid_chroma.ec_redy);
245 printf("\tGrn X: 0.%03d\n", edid->edid_chroma.ec_greenx);
246 printf("\tGrn Y: 0.%03d\n", edid->edid_chroma.ec_greeny);
247 printf("\tBlu X: 0.%03d\n", edid->edid_chroma.ec_bluex);
248 printf("\tBlu Y: 0.%03d\n", edid->edid_chroma.ec_bluey);
249 printf("\tWht X: 0.%03d\n", edid->edid_chroma.ec_whitex);
250 printf("\tWht Y: 0.%03d\n", edid->edid_chroma.ec_whitey);
252 if (edid->edid_have_range) {
255 edid->edid_range.er_min_hfreq,
256 edid->edid_range.er_max_hfreq);
258 edid->edid_range.er_min_vfreq,
259 edid->edid_range.er_max_vfreq);
261 edid->edid_range.er_max_clock);
262 if (edid->edid_range.er_have_gtf2) {
264 edid->edid_range.er_gtf2_hfreq);
265 printf("\tGTF2 C: %d\n", edid->edid_range.er_gtf2_c);
266 printf("\tGTF2 M: %d\n", edid->edid_range.er_gtf2_m);
267 printf("\tGTF2 J: %d\n", edid->edid_range.er_gtf2_j);
268 printf("\tGTF2 K: %d\n", edid->edid_range.er_gtf2_k);
272 for (i = 0; i < edid->edid_nmodes; i++) {
274 edid->edid_modes[i].hdisplay,
275 edid->edid_modes[i].vdisplay,
276 DIVIDE(DIVIDE(edid->edid_modes[i].dot_clock * 1000,
277 edid->edid_modes[i].htotal),
278 edid->edid_modes[i].vtotal));
280 edid->edid_modes[i].dot_clock,
281 edid->edid_modes[i].hsync_start,
282 edid->edid_modes[i].hsync_end,
283 edid->edid_modes[i].htotal,
284 edid->edid_modes[i].vsync_start,
285 edid->edid_modes[i].vsync_end,
286 edid->edid_modes[i].vtotal);
288 edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "",
289 edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "",
290 edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "",
291 edid->edid_modes[i].flags & VID_NVSYNC ? "-" : "");
293 if (edid->edid_preferred_mode)
295 edid->edid_preferred_mode->hdisplay,
296 edid->edid_preferred_mode->vdisplay,
297 DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000,
298 edid->edid_preferred_mode->htotal),
299 edid->edid_preferred_mode->vtotal));
301 printf("Number of extension blocks: %d\n", edid->edid_ext_block_count);
317 edid_search_mode(struct edid_info *edid, const struct videomode *mode)
323 for (i = 0; i < edid->edid_nmodes; i++) {
324 if (mode->hdisplay == edid->edid_modes[i].hdisplay &&
325 mode->vdisplay == edid->edid_modes[i].vdisplay &&
327 edid->edid_modes[i].dot_clock * 1000,
328 edid->edid_modes[i].htotal),
329 edid->edid_modes[i].vtotal)) {
330 return &edid->edid_modes[i];
436 void bump_preferred_mode(struct edid_info *edid, struct videomode *m)
444 if (edid->edid_preferred_mode == NULL) {
445 edid->edid_preferred_mode = m;
446 } else if ((strncmp(edid->edid_vendor, "IVM", 3) == 0) &&
447 (edid->edid_product == 0x4800) &&
448 (edid->edid_preferred_mode->dot_clock < m->dot_clock))
449 edid->edid_preferred_mode = m;
453 edid_block(struct edid_info *edid, uint8_t *data)
462 exist_mode = edid_search_mode(edid, &mode);
465 bump_preferred_mode(edid, exist_mode);
467 edid->edid_modes[edid->edid_nmodes] = mode;
468 bump_preferred_mode(edid,
469 &edid->edid_modes[edid->edid_nmodes]);
470 edid->edid_nmodes++;
477 memcpy(edid->edid_serial, data + EDID_DESC_ASCII_DATA_OFFSET,
479 edid->edid_serial[EDID_DESC_ASCII_DATA_LEN] = 0;
483 memcpy(edid->edid_comment, data + EDID_DESC_ASCII_DATA_OFFSET,
485 edid->edid_comment[EDID_DESC_ASCII_DATA_LEN] = 0;
489 edid->edid_have_range = 1;
490 edid->edid_range.er_min_vfreq = EDID_DESC_RANGE_MIN_VFREQ(data);
491 edid->edid_range.er_max_vfreq = EDID_DESC_RANGE_MAX_VFREQ(data);
492 edid->edid_range.er_min_hfreq = EDID_DESC_RANGE_MIN_HFREQ(data);
493 edid->edid_range.er_max_hfreq = EDID_DESC_RANGE_MAX_HFREQ(data);
494 edid->edid_range.er_max_clock = EDID_DESC_RANGE_MAX_CLOCK(data);
497 edid->edid_range.er_have_gtf2 = 1;
498 edid->edid_range.er_gtf2_hfreq =
500 edid->edid_range.er_gtf2_c = EDID_DESC_RANGE_GTF2_C(data);
501 edid->edid_range.er_gtf2_m = EDID_DESC_RANGE_GTF2_M(data);
502 edid->edid_range.er_gtf2_j = EDID_DESC_RANGE_GTF2_J(data);
503 edid->edid_range.er_gtf2_k = EDID_DESC_RANGE_GTF2_K(data);
508 memcpy(edid->edid_productname,
511 edid->edid_productname[EDID_DESC_ASCII_DATA_LEN] = '\0';
519 exist_mode = edid_search_mode(edid, &mode);
521 edid->edid_modes[edid->edid_nmodes] =
523 edid->edid_nmodes++;
540 edid_parse(const char *devname, uint8_t *data, struct edid_info *edid)
554 edid->edid_vendor[0] = EDID_MANFID_0(manfid);
555 edid->edid_vendor[1] = EDID_MANFID_1(manfid);
556 edid->edid_vendor[2] = EDID_MANFID_2(manfid);
557 edid->edid_vendor[3] = 0; /* null terminate for convenience */
559 edid->edid_product = data[EDID_OFFSET_PRODUCT_ID] +
562 name = edid_findvendor(edid->edid_vendor);
564 strlcpy(edid->edid_vendorname, name,
565 sizeof(edid->edid_vendorname));
567 edid->edid_vendorname[0] = '\0';
569 name = edid_findproduct(edid->edid_vendor, edid->edid_product);
571 strlcpy(edid->edid_productname, name,
572 sizeof(edid->edid_productname));
574 edid->edid_productname[0] = '\0';
576 edid->edid_comment[0] = '\0';
578 snprintf(edid->edid_serial, sizeof(edid->edid_serial), "%08x",
581 edid->edid_week = EDID_WEEK(data);
582 edid->edid_year = EDID_YEAR(data);
584 /* get edid revision */
585 edid->edid_version = EDID_VERSION(data);
586 edid->edid_revision = EDID_REVISION(data);
588 edid->edid_video_input = EDID_VIDEO_INPUT(data);
589 edid->edid_max_hsize = EDID_MAX_HSIZE(data);
590 edid->edid_max_vsize = EDID_MAX_VSIZE(data);
592 edid->edid_gamma = EDID_GAMMA(data);
593 edid->edid_features = EDID_FEATURES(data);
595 edid->edid_chroma.ec_redx = EDID_CHROMA_REDX(data);
596 edid->edid_chroma.ec_redy = EDID_CHROMA_REDX(data);
597 edid->edid_chroma.ec_greenx = EDID_CHROMA_GREENX(data);
598 edid->edid_chroma.ec_greeny = EDID_CHROMA_GREENY(data);
599 edid->edid_chroma.ec_bluex = EDID_CHROMA_BLUEX(data);
600 edid->edid_chroma.ec_bluey = EDID_CHROMA_BLUEY(data);
601 edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data);
602 edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data);
604 edid->edid_ext_block_count = EDID_EXT_BLOCK_COUNT(data);
607 edid->edid_nmodes = 0;
608 edid->edid_preferred_mode = NULL;
615 edid->edid_modes[edid->edid_nmodes] = *vmp;
616 edid->edid_nmodes++;
632 exist_mode = edid_search_mode(edid, &mode);
634 edid->edid_modes[edid->edid_nmodes] = mode;
635 edid->edid_nmodes++;
641 edid_block(edid, data + EDID_OFFSET_DESC_BLOCK +
645 edid_strchomp(edid->edid_vendorname);
646 edid_strchomp(edid->edid_productname);
647 edid_strchomp(edid->edid_serial);
648 edid_strchomp(edid->edid_comment);
658 for (i = 0; i < edid->edid_nmodes; i++)
659 if (edid->edid_modes[i].dot_clock > max_dotclock)
660 max_dotclock = edid->edid_modes[i].dot_clock;
669 if (edid->edid_have_range) {
670 if (mhz > edid->edid_range.er_max_clock)
671 edid->edid_range.er_max_clock = mhz;
673 edid->edid_range.er_max_clock = mhz;