static void awin_tve_read_edid(struct awin_tve_softc *sc) { const struct videomode *mode = NULL; char edid[128]; struct edid_info ei; int retry = 4; memset(edid, 0, sizeof(edid)); memset(&ei, 0, sizeof(ei)); while (--retry > 0) { if (!awin_tve_read_edid_block(sc, edid, 0)) break; } if (retry == 0) { device_printf(sc->sc_dev, "failed to read EDID\n"); } else { if (edid_parse(edid, &ei) != 0) { device_printf(sc->sc_dev, "failed to parse EDID\n"); } #ifdef AWIN_TVE_DEBUG else { edid_print(&ei); } #endif } strlcpy(sc->sc_display_vendor, ei.edid_vendorname, sizeof(sc->sc_display_vendor)); strlcpy(sc->sc_display_product, ei.edid_productname, sizeof(sc->sc_display_product)); device_printf(sc->sc_dev, "VGA monitor found: [%s]\n", sc->sc_display_product); mode = ei.edid_preferred_mode; if (mode == NULL) mode = pick_mode_by_ref(1024, 768, 60); if (mode != NULL) { awin_tve_video_enable(sc, false); awin_tcon1_enable(sc->sc_tcon_unit, false); delay(20000); awin_tcon1_set_videomode(sc->sc_tcon_unit, mode); awin_tcon1_enable(sc->sc_tcon_unit, true); delay(20000); awin_tve_video_enable(sc, true); } }
static void awin_hdmi_read_edid(struct awin_hdmi_softc *sc) { const struct videomode *mode; char edid[128]; struct edid_info ei; int retry = 4; u_int display_mode; memset(edid, 0, sizeof(edid)); memset(&ei, 0, sizeof(ei)); while (--retry > 0) { if (!awin_hdmi_read_edid_block(sc, edid, 0)) break; } if (retry == 0) { device_printf(sc->sc_dev, "failed to read EDID\n"); } else { if (edid_parse(edid, &ei) != 0) { device_printf(sc->sc_dev, "failed to parse EDID\n"); } #ifdef AWIN_HDMI_DEBUG else { edid_print(&ei); } #endif } if (sc->sc_display_mode == DISPLAY_MODE_AUTO) display_mode = awin_hdmi_get_display_mode(sc, &ei); else display_mode = sc->sc_display_mode; const char *forced = sc->sc_display_mode == DISPLAY_MODE_AUTO ? "auto-detected" : "forced"; device_printf(sc->sc_dev, "%s mode (%s)\n", display_mode == DISPLAY_MODE_HDMI ? "HDMI" : "DVI", forced); strlcpy(sc->sc_display_vendor, ei.edid_vendorname, sizeof(sc->sc_display_vendor)); strlcpy(sc->sc_display_product, ei.edid_productname, sizeof(sc->sc_display_product)); sc->sc_current_display_mode = display_mode; mode = ei.edid_preferred_mode; if (mode == NULL) mode = pick_mode_by_ref(640, 480, 60); if (mode != NULL) { awin_hdmi_video_enable(sc, false); awin_tcon_enable(false); delay(20000); awin_debe_set_videomode(mode); awin_tcon_set_videomode(mode); awin_hdmi_set_videomode(sc, mode, display_mode); awin_hdmi_set_audiomode(sc, mode, display_mode); awin_debe_enable(true); delay(20000); awin_tcon_enable(true); delay(20000); awin_hdmi_video_enable(sc, true); } }
static void jzlcd_hdmi_event(void *arg, device_t hdmi_dev) { const struct videomode *mode; struct videomode hdmi_mode; struct jzlcd_softc *sc; struct edid_info ei; uint8_t *edid; uint32_t edid_len; int error; sc = arg; edid = NULL; edid_len = 0; mode = NULL; error = HDMI_GET_EDID(hdmi_dev, &edid, &edid_len); if (error != 0) { device_printf(sc->dev, "failed to get EDID: %d\n", error); } else { error = edid_parse(edid, &ei); if (error != 0) { device_printf(sc->dev, "failed to parse EDID: %d\n", error); } else { if (bootverbose) edid_print(&ei); mode = jzlcd_find_mode(&ei); } } /* If a suitable mode could not be found, try the default */ if (mode == NULL) mode = pick_mode_by_ref(FB_DEFAULT_W, FB_DEFAULT_H, FB_DEFAULT_REF); if (mode == NULL) { device_printf(sc->dev, "failed to find usable video mode\n"); return; } if (bootverbose) device_printf(sc->dev, "using %dx%d\n", mode->hdisplay, mode->vdisplay); /* Stop the controller */ jzlcd_stop(sc); /* Configure LCD controller */ error = jzlcd_configure(sc, mode); if (error != 0) { device_printf(sc->dev, "failed to configure FB: %d\n", error); return; } /* Enable HDMI TX */ hdmi_mode = *mode; HDMI_SET_VIDEOMODE(hdmi_dev, &hdmi_mode); /* Start the controller! */ jzlcd_start(sc); }