示例#1
0
文件: awin_tve.c 项目: ryo/netbsd-src
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);
	}
}
示例#2
0
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);
	}
}
示例#3
0
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);
}