From db1a8defe543983fccbc7f867b1db8487da813bc Mon Sep 17 00:00:00 2001 From: Andrei-Liviu Simion Date: Mon, 15 Dec 2014 22:02:36 -0800 Subject: [PATCH] video_common: Added preferred timing mode (PTM) print to EDID example. Signed-off-by: Andrei-Liviu Simion --- .../examples/xedid_print_example.c | 253 ++++++++++++------ .../examples/xedid_print_example.h | 3 +- 2 files changed, 178 insertions(+), 78 deletions(-) diff --git a/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.c b/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.c index b72c1b65..ba9087e7 100644 --- a/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.c +++ b/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.c @@ -21,54 +21,9 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw); static void Edid_Print_ColorChar(u8 *EdidRaw); static void Edid_Print_EstTimings(u8 *EdidRaw); static void Edid_Print_StdTimings(u8 *EdidRaw); +static void Edid_Print_Ptm(u8 *EdidRaw); static u8 Edid_CalculateChecksum(u8 *Data, u8 Size); -u32 Edid_PrintDecodeAll(XDptx *InstancePtr, u8 Lct, u8 *Rad) -{ - u32 Status; - u8 EdidBase[128]; - u8 Index; - u8 NumExt; - - xil_printf("*** EDID for: LCT = %d", Lct); - if ((Lct - 1) > 0) { - xil_printf("; Rad = "); - } - for (Index = 0; Index < (Lct - 1); Index++) { - xil_printf("%d ", Rad[Index]); - } - xil_printf("***\n"); - - Status = XDptx_GetRemoteEdidBlock(InstancePtr, EdidBase, 0, Lct, Rad); - if (Status != XST_SUCCESS) { - return Status; - } - //DpTools_PrintData(EdidBase, 128); - //Edid_PrintDecodeBase(EdidBase); - - NumExt = XEDID_GET_EXT_BLK_COUNT(EdidBase); - - /* - u8 EdidExtBlocks[NumExt * 128]; - - DpTools_GetEdidAllExtBlocks(InstancePtr, NumExt, EdidExtBlocks, Lct, Rad); - - xil_printf("\nExtension blocks ::::::::::::::::::::::\n"); - for (Index = 0; Index < NumExt; Index++) { - //DpTools_PrintData(EdidExtBlocks + (Index * 128), 128); - Status = dptools_edid_parse_dispid(EdidExtBlocks + (Index * 128)); - if (Status != XST_SUCCESS) { - xil_printf("\tNot a DispID extension block (tag: 0x%02lx)\n", EdidExtBlocks[Index * 128]); - } - xil_printf("\n"); - } - */ - - xil_printf("\n::::::::::::::::::::::::::::::::::::::::::::::::\n"); - - return Status; -} - u32 Edid_PrintDecodeBase(u8 *EdidRaw) { /* Check valid header. */ @@ -89,19 +44,39 @@ u32 Edid_PrintDecodeBase(u8 *EdidRaw) Edid_Print_StdTimings(EdidRaw); xil_printf("Descriptors:\n"); - xil_printf("\tFirst tag: 0x%02lx 0x%02lx\n", EdidRaw[0x36], EdidRaw[0x38]); - xil_printf("\tSecond tag: 0x%02lx 0x%02lx\n", EdidRaw[0x48], EdidRaw[0x4A]); - xil_printf("\tThird tag: 0x%02lx 0x%02lx\n", EdidRaw[0x5A], EdidRaw[0x5C]); - xil_printf("\tFourth tag: 0x%02lx 0x%02lx\n", EdidRaw[0x6C], EdidRaw[0x6E]); + xil_printf("\tFirst tag: 0x%02lx 0x%02lx\n", EdidRaw[0x36], + EdidRaw[0x38]); + xil_printf("\tSecond tag: 0x%02lx 0x%02lx\n", EdidRaw[0x48], + EdidRaw[0x4A]); + xil_printf("\tThird tag: 0x%02lx 0x%02lx\n", EdidRaw[0x5A], + EdidRaw[0x5C]); + xil_printf("\tFourth tag: 0x%02lx 0x%02lx\n", EdidRaw[0x6C], + EdidRaw[0x6E]); - xil_printf("Number of extensions:\t%d\n", XEDID_GET_EXT_BLK_COUNT(EdidRaw)); - xil_printf("Checksum:\t\t0x%02lx -> Calculated sum = 0x%02lx (== 0x00)\n", + Edid_Print_Ptm(EdidRaw); + + xil_printf("Number of extensions:\t%d\n", + XEDID_GET_EXT_BLK_COUNT(EdidRaw)); + xil_printf("Checksum:\t\t0x%02lx -> Calculated sum = 0x%02lx\n", XEDID_GET_CHECKSUM(EdidRaw), Edid_CalculateChecksum(EdidRaw, 128)); return XST_SUCCESS; } +void Edid_Print_Supported_VideoModeTable(u8 *EdidRaw) +{ + u8 Index; + + xil_printf("Supported resolutions from video mode table:\n"); + for (Index = 0; Index < XVID_VM_NUM_SUPPORT; Index++) { + if (XEdid_IsVideoTimingSupported(EdidRaw, + &XVid_VideoTimingModes[Index]) == XST_SUCCESS) { + xil_printf("\t%s\n", XVid_VideoTimingModes[Index].Name); + } + } +} + static void Edid_Print_BaseVPId(u8 *EdidRaw) { char ManName[4]; @@ -110,23 +85,30 @@ static void Edid_Print_BaseVPId(u8 *EdidRaw) /* Vendor and product identification. */ xil_printf("Vendor and product identification:\n"); xil_printf("\tID manufacturer name:\t%s\n", ManName); - xil_printf("\tID product code:\t0x%04lx\n", XEDID_GET_VPI_ID_PROD_CODE(EdidRaw)); - xil_printf("\tID serial number:\t0x%08lx\n", XEDID_GET_VPI_SN(EdidRaw)); + xil_printf("\tID product code:\t0x%04lx\n", + XEDID_GET_VPI_ID_PROD_CODE(EdidRaw)); + xil_printf("\tID serial number:\t0x%08lx\n", + XEDID_GET_VPI_SN(EdidRaw)); if (XEDID_IS_VPI_YEAR_MODEL(EdidRaw)) { - xil_printf("\tModel year:\t\t%d\n", XEDID_GET_VPI_YEAR(EdidRaw)); + xil_printf("\tModel year:\t\t%d\n", + XEDID_GET_VPI_YEAR(EdidRaw)); } else if (XEDID_GET_VPI_WEEK_MAN(EdidRaw) == 0x00) { - xil_printf("\tManufactured:\t\tYear = %d ; Week not specified.\n", XEDID_GET_VPI_YEAR(EdidRaw)); + xil_printf("\tManufactured:\t\tYear = %d ; Week N/A\n", + XEDID_GET_VPI_YEAR(EdidRaw)); } else { - xil_printf("\tManufactured:\t\tYear = %d ; Week = %d\n", XEDID_GET_VPI_YEAR(EdidRaw), XEDID_GET_VPI_WEEK_MAN(EdidRaw)); + xil_printf("\tManufactured:\t\tYear = %d ; Week = %d\n", + XEDID_GET_VPI_YEAR(EdidRaw), + XEDID_GET_VPI_WEEK_MAN(EdidRaw)); } } static void Edid_Print_BaseVerRev(u8 *EdidRaw) { /* EDID structure version and revision. */ - xil_printf("EDID structure version and revision: %d.%d\n", XEDID_GET_STRUCT_VER(EdidRaw), XEDID_GET_STRUCT_REV(EdidRaw)); + xil_printf("EDID structure version and revision: %d.%d\n", + XEDID_GET_STRUCT_VER(EdidRaw), XEDID_GET_STRUCT_REV(EdidRaw)); } static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) @@ -137,8 +119,10 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) /* Input is a digital video signal interface. */ xil_printf("\tVideo signal interface is digital.\n"); - if (XEDID_GET_BDISP_VID_DIG_BPC(EdidRaw) != XEDID_BDISP_VID_DIG_BPC_UNDEF) { - xil_printf("\tColor bit depth:\t%d\n", XEDID_GET_BDISP_VID_DIG_BPC(EdidRaw)); + if (XEDID_GET_BDISP_VID_DIG_BPC(EdidRaw) != + XEDID_BDISP_VID_DIG_BPC_UNDEF) { + xil_printf("\tColor bit depth:\t%d\n", + XEDID_GET_BDISP_VID_DIG_BPC(EdidRaw)); } else { xil_printf("\tColor bit depth is undefined.\n"); @@ -161,7 +145,7 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) xil_printf("\tDisplayPort is supported.\n"); break; default: - xil_printf("\tDigital interface is not defined.\n"); + xil_printf("\tDigital interface undefined.\n"); break; } } @@ -229,7 +213,9 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) } if (XEDID_IS_BDISP_SSAR_SS(EdidRaw)) { - xil_printf("\tScreen size (HxV):\t%dx%d(cm)\n", XEDID_GET_BDISP_SSAR_H(EdidRaw), XEDID_GET_BDISP_SSAR_V(EdidRaw)); + xil_printf("\tScreen size (HxV):\t%dx%d(cm)\n", + XEDID_GET_BDISP_SSAR_H(EdidRaw), + XEDID_GET_BDISP_SSAR_V(EdidRaw)); } else if (XEDID_IS_BDISP_SSAR_AR_L(EdidRaw)) { xil_printf("\tAspect ratio (H:V):\t"); @@ -248,8 +234,10 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) break; default: xil_printf("%d.%03d:1 ", - (u32)XEDID_GET_BDISP_SSAR_AR_L(EdidRaw), - FLOAT_FRAC_TO_U32(XEDID_GET_BDISP_SSAR_AR_L(EdidRaw), 1000)); + (u32)XEDID_GET_BDISP_SSAR_AR_L(EdidRaw), + FLOAT_FRAC_TO_U32( + XEDID_GET_BDISP_SSAR_AR_L(EdidRaw), + 1000)); break; } xil_printf("(landscape)\n"); @@ -270,8 +258,11 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) xil_printf("4:5 "); break; default: - xil_printf("%d.%03d:1 ", (u32)XEDID_GET_BDISP_SSAR_AR_P(EdidRaw), - FLOAT_FRAC_TO_U32(XEDID_GET_BDISP_SSAR_AR_P(EdidRaw), 1000)); + xil_printf("%d.%03d:1 ", + (u32)XEDID_GET_BDISP_SSAR_AR_P(EdidRaw), + FLOAT_FRAC_TO_U32( + XEDID_GET_BDISP_SSAR_AR_P(EdidRaw), + 1000)); break; } xil_printf("(portrait)\n"); @@ -284,7 +275,9 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) xil_printf("\tGamma is defined in an extension block.\n"); } else { - xil_printf("\tGamma:\t\t\t%d.%02d\n", (u32)XEDID_GET_BDISP_GAMMA(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_BDISP_GAMMA(EdidRaw), 100)); + xil_printf("\tGamma:\t\t\t%d.%02d\n", + (u32)XEDID_GET_BDISP_GAMMA(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_BDISP_GAMMA(EdidRaw), 100)); } xil_printf("\tDisplay power management:\n"); @@ -359,7 +352,7 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) else { xil_printf("does not include "); } - xil_printf("the native pixel format and preferred refresh rate of the display device.\n"); + xil_printf("the native pixel format and preferred refresh rate.\n"); /* Continuous frequency. */ xil_printf("\t\tDisplay "); if (XEDID_IS_BDISP_FEATURE_CONTFREQ(EdidRaw)) { @@ -374,14 +367,30 @@ static void Edid_Print_BaseBasicDisp(u8 *EdidRaw) static void Edid_Print_ColorChar(u8 *EdidRaw) { xil_printf("Color characterisitics:\n"); - xil_printf("\tRed_x:\t\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_REDX(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_REDX(EdidRaw), 1000000000)); - xil_printf("\tRed_y:\t\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_REDY(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_REDY(EdidRaw), 1000000000)); - xil_printf("\tGreen_x:\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_GREENX(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_GREENX(EdidRaw), 1000000000)); - xil_printf("\tGreen_y:\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_GREENY(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_GREENY(EdidRaw), 1000000000)); - xil_printf("\tBlue_x:\t\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_BLUEX(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_BLUEX(EdidRaw), 1000000000)); - xil_printf("\tBlue_y:\t\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_BLUEY(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_BLUEY(EdidRaw), 1000000000)); - xil_printf("\tWhite_x:\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_WHITEX(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_WHITEX(EdidRaw), 1000000000)); - xil_printf("\tWhite_y:\t\t%d.%09d +- 0.0005\n", (u32)XEDID_GET_CC_WHITEY(EdidRaw), FLOAT_FRAC_TO_U32(XEDID_GET_CC_WHITEY(EdidRaw), 1000000000)); + xil_printf("\tRed_x:\t\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_REDX(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_REDX(EdidRaw), 1000000000)); + xil_printf("\tRed_y:\t\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_REDY(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_REDY(EdidRaw), 1000000000)); + xil_printf("\tGreen_x:\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_GREENX(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_GREENX(EdidRaw), 1000000000)); + xil_printf("\tGreen_y:\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_GREENY(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_GREENY(EdidRaw), 1000000000)); + xil_printf("\tBlue_x:\t\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_BLUEX(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_BLUEX(EdidRaw), 1000000000)); + xil_printf("\tBlue_y:\t\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_BLUEY(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_BLUEY(EdidRaw), 1000000000)); + xil_printf("\tWhite_x:\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_WHITEX(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_WHITEX(EdidRaw), 1000000000)); + xil_printf("\tWhite_y:\t\t%d.%09d +- 0.0005\n", + (u32)XEDID_GET_CC_WHITEY(EdidRaw), + FLOAT_FRAC_TO_U32(XEDID_GET_CC_WHITEY(EdidRaw), 1000000000)); } static void Edid_Print_EstTimings(u8 *EdidRaw) @@ -438,7 +447,8 @@ static void Edid_Print_EstTimings(u8 *EdidRaw) if (XEDID_SUPP_EST_TIMINGS_1152x870_75(EdidRaw)) { xil_printf("\t1152x870 @ 75Hz supported.\n"); } - xil_printf("\tManufacturer specified timings field: 0x%02lx.\n", XEDID_GET_TIMINGS_MAN(EdidRaw)); + xil_printf("\tManufacturer specified timings field: 0x%02lx.\n", + XEDID_GET_TIMINGS_MAN(EdidRaw)); } static void Edid_Print_StdTimings(u8 *EdidRaw) @@ -460,6 +470,95 @@ static void Edid_Print_StdTimings(u8 *EdidRaw) } } +static void Edid_Print_Ptm(u8 *EdidRaw) +{ + u8 *Ptm; + + Ptm = &EdidRaw[XEDID_PTM]; + + u16 HBlank = ((Ptm[XEDID_DTD_PTM_HRES_HBLANK_U4] & + XEDID_DTD_PTM_XRES_XBLANK_U4_XBLANK_MASK) << 8) | + Ptm[XEDID_DTD_PTM_HBLANK_LSB]; + + u16 VBlank = ((Ptm[XEDID_DTD_PTM_VRES_VBLANK_U4] & + XEDID_DTD_PTM_XRES_XBLANK_U4_XBLANK_MASK) << 8) | + Ptm[XEDID_DTD_PTM_VBLANK_LSB]; + + u32 HActive = + (((Ptm[XEDID_DTD_PTM_HRES_HBLANK_U4] & + XEDID_DTD_PTM_XRES_XBLANK_U4_XRES_MASK) >> + XEDID_DTD_PTM_XRES_XBLANK_U4_XRES_SHIFT) << 8) | + Ptm[XEDID_DTD_PTM_HRES_LSB]; + + u32 VActive = + (((Ptm[XEDID_DTD_PTM_VRES_VBLANK_U4] & + XEDID_DTD_PTM_XRES_XBLANK_U4_XRES_MASK) >> + XEDID_DTD_PTM_XRES_XBLANK_U4_XRES_SHIFT) << 8) | + Ptm[XEDID_DTD_PTM_VRES_LSB]; + + u32 PixelClkKhz = ((Ptm[XEDID_DTD_PTM_PIXEL_CLK_KHZ_MSB] << + 8) | Ptm[XEDID_DTD_PTM_PIXEL_CLK_KHZ_LSB]) * 10; + + u32 HFrontPorch = + (((Ptm[XEDID_DTD_PTM_XFPORCH_XSPW_U2] & + XEDID_DTD_PTM_XFPORCH_XSPW_U2_HFPORCH_MASK) >> + XEDID_DTD_PTM_XFPORCH_XSPW_U2_HFPORCH_SHIFT) << 8) | + Ptm[XEDID_DTD_PTM_HFPORCH_LSB]; + + u32 HSyncWidth = + (((Ptm[XEDID_DTD_PTM_XFPORCH_XSPW_U2] & + XEDID_DTD_PTM_XFPORCH_XSPW_U2_HSPW_MASK) >> + XEDID_DTD_PTM_XFPORCH_XSPW_U2_HSPW_SHIFT) << 8) | + Ptm[XEDID_DTD_PTM_HSPW_LSB]; + + u32 VFrontPorch = + (((Ptm[XEDID_DTD_PTM_XFPORCH_XSPW_U2] & + XEDID_DTD_PTM_XFPORCH_XSPW_U2_VFPORCH_MASK) >> + XEDID_DTD_PTM_XFPORCH_XSPW_U2_VFPORCH_SHIFT) << 8) | + ((Ptm[XEDID_DTD_PTM_VFPORCH_VSPW_L4] & + XEDID_DTD_PTM_VFPORCH_VSPW_L4_VFPORCH_MASK) >> + XEDID_DTD_PTM_VFPORCH_VSPW_L4_VFPORCH_SHIFT); + + u32 VSyncWidth = + ((Ptm[XEDID_DTD_PTM_XFPORCH_XSPW_U2] & + XEDID_DTD_PTM_XFPORCH_XSPW_U2_VSPW_MASK) << 8) | + (Ptm[XEDID_DTD_PTM_VFPORCH_VSPW_L4] & + XEDID_DTD_PTM_VFPORCH_VSPW_L4_VSPW_MASK); + + u32 HBackPorch = HBlank - (HFrontPorch + HSyncWidth); + + u32 VBackPorch = VBlank - (VFrontPorch + VSyncWidth); + + u8 HPolarity = (Ptm[XEDID_DTD_PTM_SIGNAL] & + XEDID_DTD_PTM_SIGNAL_HPOLARITY_MASK) >> + XEDID_DTD_PTM_SIGNAL_HPOLARITY_SHIFT; + u8 VPolarity = (Ptm[XEDID_DTD_PTM_SIGNAL] & + XEDID_DTD_PTM_SIGNAL_VPOLARITY_MASK) >> + XEDID_DTD_PTM_SIGNAL_VPOLARITY_SHIFT; + + xil_printf("Preferred timing mode:\n"); + xil_printf("\tHorizontal resolution:\t%d px\n" + "\tVertical resolution:\t%d lines\n" + "\tPixel clock:\t\t%d KHz\n" + "\tHorizontal front porch:\t%d px\n" + "\tHorizontal sync width:\t%d px\n" + "\tHorizontal back porch:\t%d px\n" + "\tHorizontal blanking:\t%d px\n" + "\tHorizontal polarity:\t%d\n" + "\tVertical front porch:\t%d px\n" + "\tVertical sync width:\t%d px\n" + "\tVertical back porch:\t%d px\n" + "\tVertical blanking:\t%d px\n" + "\tVertical polarity:\t%d\n" + , HActive, VActive, PixelClkKhz, + HFrontPorch, HSyncWidth, HBackPorch, HBlank, HPolarity, + VFrontPorch, VSyncWidth, VBackPorch, VBlank, VPolarity); + + xil_printf("\tInterlaced:\t\t%s\n", + XEDID_IS_DTD_PTM_INTERLACED(EdidRaw) ? + "Yes." : "No (progressive)."); +} + static u8 Edid_CalculateChecksum(u8 *Data, u8 Size) { u8 Index; diff --git a/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.h b/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.h index 75be4a23..949193d4 100644 --- a/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.h +++ b/XilinxProcessorIPLib/drivers/video_common/examples/xedid_print_example.h @@ -9,8 +9,9 @@ #define XEDID_PRINT_H_ #include "xdptx.h" +#include "xedid.h" u32 Edid_PrintDecodeBase(u8 *EdidRaw); -u32 Edid_PrintDecodeAll(XDptx *InstancePtr, u8 Lct, u8 *Rad); +void Edid_Print_Supported_VideoModeTable(u8 *EdidRaw); #endif /* XEDID_PRINT_H_ */