int api_phy_enable(phy_state is_enable) //1 is enable { int force = 0; videoParams_t params; dtd_t dtd; switch(is_enable){ case PHY_ENABLE: printk("hdmi-phy-enable\n"); dtd_Fill(&dtd, 4, 60000); videoParams_Reset(¶ms); videoParams_SetHdmi(¶ms, TRUE); videoParams_SetDtd(¶ms, &dtd); /* params->mDtd = dtd; */ pixelClock = videoParams_GetPixelClock(¶ms); /* dtd_GetPixelClock(&(params->mDtd)); ---> 27MHz */ if (phy_Initialize(api_mBaseAddress, api_mDataEnablePolarity) != TRUE){ return FALSE; } if (phy_Configure (api_mBaseAddress, pixelClock, 8, 0) != TRUE){ return FALSE; } phy_EnableHpdSense(api_mBaseAddress); /* enable HPD sending on phy */ phy_InterruptEnable(api_mBaseAddress, ~0x02); if (force){ printk("hdmi init force\n"); api_mCurrentState = API_HPD; }else{ printk("Waiting for hot plug detection...\n"); } break; case PHY_ENABLE_HPD: printk("hdmi phy disable,enable hpd\n"); phy_EnableHpdSense(api_mBaseAddress); phy_InterruptEnable(api_mBaseAddress, ~0x02); halSourcePhy_Gen2PDDQ(api_mBaseAddress + PHY_BASE_ADDR, 1); halSourcePhy_Gen2TxPowerOn(api_mBaseAddress + PHY_BASE_ADDR, 0); halMainController_PhyReset(api_mBaseAddress + MC_BASE_ADDR, 0); /* reset PHY */ break; case PHY_DISABLE_ALL: printk("hdmi phy disable complete\n"); phy_DisableHpdSense(api_mBaseAddress); halSourcePhy_Gen2PDDQ(api_mBaseAddress + PHY_BASE_ADDR, 1); halSourcePhy_Gen2TxPowerOn(api_mBaseAddress + PHY_BASE_ADDR, 0); halMainController_PhyReset(api_mBaseAddress + MC_BASE_ADDR, 0); /* reset PHY */ break; default: printk("====hdmi phy param is err\n"); return FALSE; } printk("====phy conf0=%x reset=%x\n",*(unsigned int *)0xb018c000,*(unsigned int *)0xb0190014); return TRUE; }
static u8 cliEdid_GetDtdCode(const dtd_t *dtd) { u8 cea_mode = dtd_GetCode(dtd); dtd_t tmp_dtd; if (cea_mode == (u8)(-1)) { for (cea_mode = 1; cea_mode < 60; cea_mode++) { dtd_Fill(&tmp_dtd, cea_mode, 0); if (dtd_IsEqual(dtd, &tmp_dtd)) { break; } } if (cea_mode >= 60) { return -1; } } return cea_mode; }
int api_Initialize(u16 address, u8 dataEnablePolarity, u16 sfrClock, u8 force) //cmd:auto argument: 0, 1, 2500, 0 { dtd_t dtd; videoParams_t params; dataEnablePolarity = 1; api_mDataEnablePolarity = dataEnablePolarity; api_mHpd = FALSE; api_mSendGamutOk = FALSE; //????????????????? api_mSfrClock = sfrClock; // sfrClock,that are required for setting the low time of the SCL clock in each speed mode LOG_NOTICE("dwc_hdmi_tx_software_api_2.12"); LOG_NOTICE(__DATE__); LOG_TRACE1(dataEnablePolarity); /* reset error */ error_Set(NO_ERROR); api_mBaseAddress = address; if (!api_mutex_inited) { mutex_Initialize(&api_mMutex); api_mutex_inited = 1; } control_InterruptMute(api_mBaseAddress, ~0); /* disable all interrupts */ if ((api_mCurrentState < API_HPD) || (api_mCurrentState > API_EDID_READ)) { /* if EDID read do not re-read, if HPDetected, keep in same state * otherwise, NOT INIT */ api_mCurrentState = API_NOT_INIT; } /* VGA must be supported by all sinks * so use it as default configuration */ dtd_Fill(&dtd, 4, 60000); videoParams_Reset(¶ms); videoParams_SetHdmi(¶ms, TRUE); videoParams_SetDtd(¶ms, &dtd); /* params->mDtd = dtd; */ pixelClock = videoParams_GetPixelClock(¶ms); /* dtd_GetPixelClock(&(params->mDtd)); */ /* reset HAPS51 DEMO BOARD, by default mask all interrupts */ if (board_Initialize(api_mBaseAddress, pixelClock, 8) != TRUE) { return FALSE; } /* get Product Identification Register 0 */ LOG_NOTICE2("Product Line", control_ProductLine(api_mBaseAddress)); /* get Product Identification Register 1*/ LOG_NOTICE2("Product Type", control_ProductType(api_mBaseAddress)); /* if ((ProductLine == 0xA0) && ((ProductType == 0x01 || ProductType == 0xC1))) */ if (control_SupportsCore(api_mBaseAddress) != TRUE) { error_Set(ERR_HW_NOT_SUPPORTED); LOG_ERROR("Unknown device: aborting..."); return FALSE; } /* get Design Identification Register */ LOG_NOTICE2("HDMI TX Controller Design", control_Design(api_mBaseAddress)); /* get Revision Identification Register */ LOG_NOTICE2("HDMI TX Controller Revision", control_Revision(api_mBaseAddress)); /* if(ProductLine == 0xA0 && ProductType == 0xC1)*/ if (control_SupportsHdcp(api_mBaseAddress) == TRUE) { LOG_NOTICE("HDMI TX controller supports HDCP"); } /* print api_mDataEnablePolarity value ,always return TRUE */ if (video_Initialize(api_mBaseAddress, ¶ms, api_mDataEnablePolarity) != TRUE) { return FALSE; } if (audio_Initialize(api_mBaseAddress) != TRUE) { return FALSE; } if (packets_Initialize(api_mBaseAddress) != TRUE) { return FALSE; } if (hdcp_Initialize(api_mBaseAddress, api_mDataEnablePolarity) != TRUE) { return FALSE; } /* clock gate == 1 => turn off all modules */ if (control_Initialize(api_mBaseAddress, api_mDataEnablePolarity, pixelClock) != TRUE) { return FALSE; } #ifdef CONFIG_HMDI_JZ4780_DEBUG printk("jz4780 hdmi %s %d phy init\n",__func__,__LINE__); #endif control_InterruptClearAll(api_mBaseAddress); if (board_PixelClock(api_mBaseAddress, pixelClock, videoParams_GetColorResolution(¶ms))!= TRUE) { return FALSE; } #ifdef CONFIG_HMDI_JZ4780_DEBUG printk("jz4780 hdmi %s %d video configured\n",__func__,__LINE_); #endif if (video_Configure(api_mBaseAddress, ¶ms, api_mDataEnablePolarity, FALSE) != TRUE) { return FALSE; } if ((api_mCurrentState < API_HPD) || (api_mCurrentState > API_EDID_READ)) { /* if EDID read do not re-read, if HPDetected, keep in same state * otherwise, set to INIT */ api_mCurrentState = API_INIT; } /* * By default no pixel repetition and color resolution is 8 */ #ifdef CONFIG_HMDI_JZ4780_DEBUG printk("jz4780 hdmi %s %d control configured\n",__func__,__LINE_); #endif if (control_Configure(api_mBaseAddress, pixelClock, 0, 8, 0, 0, 0, 0) != TRUE) { return FALSE; } /* send AVMUTE SET (optional) */ #ifdef CONFIG_HMDI_JZ4780_DEBUG printk("jz4780 hdmi %s %d phy configured\n",__func__,__LINE_); #endif #if 0 /* enable interrupts */ access_CoreWriteByte(0x0, 0x10D2); access_CoreWriteByte(0x0, 0x10D6); access_CoreWriteByte(0x0, 0x10DA); access_CoreWriteByte(0x0, 0x0180); #endif #if 0 access_CoreWriteByte(~0x4, 0x10D2); //audio packets access_CoreWriteByte(0x0, 0x0180); //intc mute #endif api_phy_enable(PHY_ENABLE_HPD); control_InterruptMute(api_mBaseAddress, 0); if (system_InterruptHandlerRegister(TX_INT, api_EventHandler, NULL) == TRUE) { printk("=====>enable TX_INT in %s:%d\n", __func__, __LINE__); //return system_InterruptEnable(TX_INT); return TRUE; } return FALSE; }
/** * Check Video parameters against allowed values and read EDID structure * to ensure compatibility with sink. * @param video video parameters */ static int api_CheckParamsVideo(videoParams_t * video) { u8 errorCode = TRUE; hdmivsdb_t vsdb; dtd_t dtd; unsigned i = 0; shortVideoDesc_t svd; videoCapabilityDataBlock_t capability; int valid = FALSE; colorimetryDataBlock_t colorimetry; LOG_TRACE(); colorimetryDataBlock_Reset(&colorimetry); shortVideoDesc_Reset(&svd); dtd_Fill(&dtd, 1, 60000); videoCapabilityDataBlock_Reset(&capability); if (videoParams_GetHdmi(video)) { /* HDMI mode */ if (api_EdidHdmivsdb(&vsdb) == TRUE) { if (videoParams_GetColorResolution(video) == 10 && !hdmivsdb_GetDeepColor30(&vsdb)) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_30BIT_DC); printk("Sink does NOT support 30bits/pixel deep colour mode"); errorCode = FALSE; } else if (videoParams_GetColorResolution(video) == 12 && !hdmivsdb_GetDeepColor36(&vsdb)) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_36BIT_DC); printk("Sink does NOT support 36bits/pixel deep colour mode"); errorCode = FALSE; } else if (videoParams_GetColorResolution(video) == 16 && !hdmivsdb_GetDeepColor48(&vsdb)) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_48BIT_DC); printk("Sink does NOT support 48bits/pixel deep colour mode"); errorCode = FALSE; } if (videoParams_GetEncodingOut(video) == YCC444 && !hdmivsdb_GetDeepColorY444(&vsdb)) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_YCC444_DC); printk("Sink does NOT support YCC444 in deep colour mode"); errorCode = FALSE; } if (videoParams_GetTmdsClock(video) > 16500) { /* * Sink must specify MaxTMDSClk when supports frequencies over 165MHz * GetMaxTMDSClk() is TMDS clock / 5MHz and GetTmdsClock() returns [0.01MHz] * so GetMaxTMDSClk() value must be multiplied by 500 in order to be compared */ if (videoParams_GetTmdsClock(video) > (hdmivsdb_GetMaxTmdsClk( &vsdb) * 500)) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_TMDS_CLOCK); LOG_WARNING2("Sink does not support TMDS clock", videoParams_GetTmdsClock(video)); LOG_WARNING2("Maximum TMDS clock supported is", hdmivsdb_GetMaxTmdsClk(&vsdb) * 500); errorCode = FALSE; } } } else { error_Set(ERR_SINK_DOES_NOT_SUPPORT_HDMI); printk("Sink does not support HDMI"); errorCode = FALSE; } /* video out encoding (YCC/RGB) */ if (videoParams_GetEncodingOut(video) == YCC444 && !api_EdidSupportsYcc444()) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_YCC444_ENCODING); printk("Sink does NOT support YCC444 encoding"); errorCode = FALSE; } else if (videoParams_GetEncodingOut(video) == YCC422 && !api_EdidSupportsYcc422()) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_YCC422_ENCODING); printk("Sink does NOT support YCC422 encoding"); errorCode = FALSE; } /* check extended colorimetry data and if supported by sink */ if (videoParams_GetColorimetry(video) == EXTENDED_COLORIMETRY) { if (api_EdidColorimetryDataBlock(&colorimetry) == TRUE) { if (!colorimetryDataBlock_SupportsXvYcc601(&colorimetry) && videoParams_GetExtColorimetry(video) == 0) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_XVYCC601_COLORIMETRY); printk("Sink does NOT support xvYcc601 extended colorimetry"); errorCode = FALSE; } else if (!colorimetryDataBlock_SupportsXvYcc709(&colorimetry) && videoParams_GetExtColorimetry(video) == 1) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_XVYCC709_COLORIMETRY); printk("Sink does NOT support xvYcc709 extended colorimetry"); errorCode = FALSE; } else { error_Set(ERR_EXTENDED_COLORIMETRY_PARAMS_INVALID); printk("Invalid extended colorimetry parameters"); errorCode = FALSE; } } else { error_Set(ERR_SINK_DOES_NOT_SUPPORT_EXTENDED_COLORIMETRY); errorCode = FALSE; } } } else { /* DVI mode */ if (videoParams_GetColorResolution(video) > 8) { error_Set(ERR_COLOR_DEPTH_NOT_SUPPORTED); printk("DVI - deep color not supported"); errorCode = FALSE; } if (videoParams_GetEncodingOut(video) != RGB) { error_Set(ERR_DVI_MODE_WITH_YCC_ENCODING); printk("DVI mode does not support video encoding other than RGB"); errorCode = FALSE; } if (videoParams_IsPixelRepetition(video)) { error_Set(ERR_DVI_MODE_WITH_PIXEL_REPETITION); printk("DVI mode does not support pixel repetition"); errorCode = FALSE; } if (videoParams_GetTmdsClock(video) > 16500) { printk("Sink must support DVI dual-link"); } /* check colorimetry data */ if ((videoParams_GetColorimetry(video) == EXTENDED_COLORIMETRY)) { error_Set(ERR_DVI_MODE_WITH_EXTENDED_COLORIMETRY); printk("DVI does not support extended colorimetry"); errorCode = FALSE; } } /* * DTD check * always checking VALID to minimise code execution (following probability) * this video code is to be supported by all dtv's */ valid = (dtd_GetCode(videoParams_GetDtd(video)) == 1) ? TRUE : FALSE; if (!valid) { for (i = 0; i < api_EdidDtdCount(); i++) { api_EdidDtd(i, &dtd); if (dtd_GetCode(videoParams_GetDtd(video)) != (u8) (-1)) { if (dtd_GetCode(videoParams_GetDtd(video)) == dtd_GetCode(&dtd)) { valid = TRUE; break; } } else if (dtd_IsEqual(videoParams_GetDtd(video), &dtd)) { valid = TRUE; break; } } } if (!valid) { if (dtd_GetCode(videoParams_GetDtd(video)) != (u8) (-1)) { for (i = 0; i < api_EdidSvdCount(); i++) { api_EdidSvd(i, &svd); if ((unsigned) (dtd_GetCode(videoParams_GetDtd(video))) == shortVideoDesc_GetCode(&svd)) { valid = TRUE; break; } } } } if (!valid) { error_Set(ERR_SINK_DOES_NOT_SUPPORT_SELECTED_DTD); printk("Sink does NOT indicate support for selected DTD"); errorCode = FALSE; } /* check quantization range */ if (api_EdidVideoCapabilityDataBlock(&capability) == TRUE) { if (!videoCapabilityDataBlock_GetQuantizationRangeSelectable( &capability) && videoParams_GetRgbQuantizationRange(video) > 1) { printk("Sink does NOT indicate support for selected quantization range"); } } return errorCode; }
static int hdmi_config(struct jzhdmi *jzhdmi) { u8 currentMode = 0; hdmivsdb_t vsdb; shortVideoDesc_t tmp_svd; dtd_t tmp_dtd; u8 ceaCode = 0; u8 errorCode = NO_ERROR; u8 svdNo=0; /* needed to make sure it doesn't change while in this function*/ struct device *dev = jzhdmi->dev; videoParams_t *pVideo = jzhdmi->hdmi_params.pVideo; audioParams_t *pAudio = jzhdmi->hdmi_params.pAudio; hdcpParams_t *pHdcp = jzhdmi->hdmi_params.pHdcp; productParams_t *pProduct = jzhdmi->hdmi_params.pProduct; svdNo = api_EdidSvdCount(); if ((api_EdidHdmivsdb(&vsdb) == TRUE) && (jzhdmi->edid_faild == 0)) { dev_info(dev, "==========>HDMI mode\n"); videoParams_SetHdmi(pVideo, TRUE); /* TODO: if (hdmivsdb_GetDeepColor48(&vsdb)) { videoParams_SetColorResolution(pVideo, 16); } else if (hdmivsdb_GetDeepColor36(&vsdb)) { videoParams_SetColorResolution(pVideo, 12); } else if (hdmivsdb_GetDeepColor30(&vsdb)) { videoParams_SetColorResolution(pVideo, 10); } else { videoParams_SetColorResolution(pVideo, 0); } */ videoParams_SetColorResolution(pVideo, 0); if (currentMode >= svdNo) { currentMode = 0; } #ifdef HDMI_JZ4780_DEBUG dev_info(jzhdmi->dev, "=====> cur==%d svno=%d\n",currentMode,svdNo); #endif for (; currentMode < svdNo; currentMode++) { if (api_EdidSvd(currentMode, &tmp_svd)) { ceaCode = shortVideoDesc_GetCode(&tmp_svd); if (ceaCode != jzhdmi->hdmi_info.out_type) continue; if (board_SupportedRefreshRate(ceaCode) != -1) { dtd_Fill(&tmp_dtd, ceaCode, board_SupportedRefreshRate(ceaCode)); videoParams_SetDtd(pVideo, &tmp_dtd); } else { dev_err(dev, "CEA mode not supported\n"); continue; } } if (api_Configure(pVideo, pAudio, pProduct, pHdcp)) { dev_info(dev, "----api_Configure ok\n"); break; } dev_err(dev, "error: VM = %d\n", ceaCode); errorCode = error_Get(); if (errorCode == ERR_HDCP_FAIL) { system_SleepMs(1000); currentMode--; } } if (currentMode >= svdNo) { /* spanned all SVDs and non works, sending VGA */ dev_err(dev, "error spanned all SVDs and non works\n"); dtd_Fill(&tmp_dtd, 1, board_SupportedRefreshRate(1)); videoParams_SetDtd(pVideo, &tmp_dtd); api_Configure(pVideo, pAudio, pProduct, pHdcp); } /* lltang add test overflow */ if(0){ /* ====>tmds reset */ access_CoreWrite(1, 0x4002, 1, 1); /* ====>video_Configure again */ if (video_Configure(0, pVideo, 1, FALSE) != TRUE) { return FALSE; } access_CoreWriteByte(0x0, 0x10DA); } } else { dev_info(dev, "Force into hdmi mode!\n"); #ifndef DVIMODE videoParams_SetHdmi(pVideo, TRUE); videoParams_SetColorResolution(pVideo, 0); if (currentMode >= svdNo) { currentMode = 0; } #ifdef HDMI_JZ4780_DEBUG dev_info(jzhdmi->dev, "=====>out_type=%d\n",jzhdmi->hdmi_info.out_type); #endif ceaCode = jzhdmi->hdmi_info.out_type; if (board_SupportedRefreshRate(ceaCode) != -1) { dtd_Fill(&tmp_dtd, ceaCode, board_SupportedRefreshRate(ceaCode)); videoParams_SetDtd(pVideo, &tmp_dtd); } else { dev_err(dev, "CEA mode not supported\n"); } if (api_Configure(pVideo, pAudio, pProduct, pHdcp)) { dev_info(dev, "api_Configure ok\n"); } } #else dev_info(dev, "====DVI mode!\n"); videoParams_SetHdmi(pVideo, FALSE); videoParams_SetColorResolution(pVideo, 0); if (currentMode >= api_EdidDtdCount()) { currentMode = 0; } for (; currentMode < api_EdidDtdCount(); currentMode++) { continue; if (api_EdidDtd(currentMode, &tmp_dtd)) { ceaCode = cliEdid_GetDtdCode(&tmp_dtd); dev_info(dev, "check ceaCode = %d\n", ceaCode); if (ceaCode != 3) continue; dev_info(dev, "find ceaCode = %d\n", ceaCode); dtd_Fill(&tmp_dtd, ceaCode, board_SupportedRefreshRate(ceaCode)); videoParams_SetDtd(pVideo, &tmp_dtd); } if (api_Configure(pVideo, pAudio, pProduct, pHdcp)) { break; } errorCode = error_Get(); dev_err(dev, "API configure fail\n"); if (errorCode == ERR_HDCP_FAIL) { system_SleepMs(1000); currentMode--; } } if (currentMode >= api_EdidDtdCount()) { dev_err(dev, "spanned all dtds and non works, sending VGA\n"); dtd_Fill(&tmp_dtd, 1, board_SupportedRefreshRate(1)); videoParams_SetDtd(pVideo, &tmp_dtd); api_Configure(pVideo, pAudio, pProduct, pHdcp); } }