int hdmitx_set_display(hdmitx_dev_t* hdmitx_device, HDMI_Video_Codes_t VideoCode) { Hdmi_tx_video_para_t *param; int i,ret=-1; unsigned char AVI_DB[32]; unsigned char AVI_HB[32]; AVI_HB[0] = TYPE_AVI_INFOFRAMES ; AVI_HB[1] = AVI_INFOFRAMES_VERSION ; AVI_HB[2] = AVI_INFOFRAMES_LENGTH ; for(i=0;i<32;i++){ AVI_DB[i]=0; } param = hdmi_get_video_param(VideoCode); hdmitx_device->cur_video_param = param; if(param){ param->color = param->color_prefer; if(hdmi_output_rgb){ param->color = COLOR_SPACE_RGB444; } else{ //HDMI CT 7-24 Pixel Encoding - YCbCr to YCbCr Sink switch(hdmitx_device->RXCap.native_Mode & 0x30) { case 0x20: //bit5==1, then support YCBCR444 + RGB case 0x30: param->color = COLOR_SPACE_YUV444; break; case 0x10: //bit4==1, then support YCBCR422 + RGB param->color = COLOR_SPACE_YUV422; break; default: param->color = COLOR_SPACE_RGB444; } } if(hdmitx_device->HWOp.SetDispMode(hdmitx_device, param)>=0){ //HDMI CT 7-33 DVI Sink, no HDMI VSDB nor any other VSDB, No GB or DI expected //TMDS_MODE[hdmi_config] //0: DVI Mode 1: HDMI Mode //if(hdmitx_device->hdmi_info.output_state==CABLE_PLUGIN_DVI_OUT) if(is_dvi_device(&hdmitx_device->RXCap)) { hdmi_print(1,"Sink is DVI device\n"); hdmitx_device->HWOp.CntlConfig(hdmitx_device, CONF_HDMI_DVI_MODE, DVI_MODE); //todo ColorFormat } else { hdmi_print(1,"Sink is HDMI device\n"); hdmitx_device->HWOp.CntlConfig(hdmitx_device, CONF_HDMI_DVI_MODE, HDMI_MODE); } //check system status by reading EDID_STATUS switch(hdmitx_device->HWOp.CntlConfig(hdmitx_device, CONF_SYSTEM_ST, 0)) { case 0: hdmi_print(1,"No sink attached\n"); break; case 1: hdmi_print(1,"Source reading EDID\n"); break; case 2: hdmi_print(1,"Source in DVI Mode\n"); break; case 3: hdmi_print(1,"Source in HDMI Mode\n"); break; default: hdmi_print(1,"EDID Status error\n"); } hdmi_tx_construct_avi_packet(param, (char*)AVI_DB); if((VideoCode == HDMI_4k2k_30) || (VideoCode == HDMI_4k2k_25) || (VideoCode == HDMI_4k2k_24) || (VideoCode == HDMI_4k2k_smpte_24)) { hdmi_set_vend_spec_infofram(hdmitx_device, VideoCode); } else { hdmi_set_vend_spec_infofram(hdmitx_device, 0); } hdmitx_device->HWOp.SetPacket(HDMI_PACKET_AVI, AVI_DB, AVI_HB); ret = 0; } } else{ if(hdmitx_device->HWOp.SetDispMode) { hdmitx_device->HWOp.SetDispMode(hdmitx_device, NULL); //disable HDMI } } hdmitx_set_spd_info(hdmitx_device); return ret; }
int hdmitx_set_display(struct hdmitx_dev *hdmitx_device, enum hdmi_vic VideoCode) { struct hdmitx_vidpara *param; enum hdmi_vic vic; int i, ret = -1; unsigned char AVI_DB[32]; unsigned char AVI_HB[32]; AVI_HB[0] = TYPE_AVI_INFOFRAMES; AVI_HB[1] = AVI_INFOFRAMES_VERSION; AVI_HB[2] = AVI_INFOFRAMES_LENGTH; for (i = 0; i < 32; i++) AVI_DB[i] = 0; vic = hdmitx_device->HWOp.GetState(hdmitx_device, STAT_VIDEO_VIC, 0); hdmi_print(IMP, SYS "already init VIC = %d Now VIC = %d\n", vic, VideoCode); if ((vic != HDMI_Unkown) && (vic == VideoCode)) { hdmitx_device->cur_VIC = vic; return 1; } param = hdmi_get_video_param(VideoCode); hdmitx_device->cur_video_param = param; if (param) { param->color = param->color_prefer; if (hdmi_output_rgb) { param->color = COLOR_SPACE_RGB444; } else { /* HDMI CT 7-24 Pixel Encoding * YCbCr to YCbCr Sink */ switch (hdmitx_device->RXCap.native_Mode & 0x30) { case 0x20:/*bit5==1, then support YCBCR444 + RGB*/ case 0x30: param->color = COLOR_SPACE_YUV444; break; case 0x10:/*bit4==1, then support YCBCR422 + RGB*/ param->color = COLOR_SPACE_YUV422; break; default: param->color = COLOR_SPACE_RGB444; } } if (hdmitx_device->HWOp.SetDispMode(hdmitx_device, param) >= 0) { /* HDMI CT 7-33 DVI Sink, no HDMI VSDB nor any * other VSDB, No GB or DI expected * TMDS_MODE[hdmi_config] * 0: DVI Mode 1: HDMI Mode */ if (is_dvi_device(&hdmitx_device->RXCap)) { hdmi_print(1, "Sink is DVI device\n"); hdmitx_device->HWOp.CntlConfig(hdmitx_device, CONF_HDMI_DVI_MODE, DVI_MODE); } else { hdmi_print(1, "Sink is HDMI device\n"); hdmitx_device->HWOp.CntlConfig(hdmitx_device, CONF_HDMI_DVI_MODE, HDMI_MODE); } /*check system status by reading EDID_STATUS*/ switch (hdmitx_device->HWOp.CntlConfig( hdmitx_device, CONF_SYSTEM_ST, 0)) { case 0: hdmi_print(1, "No sink attached\n"); break; case 1: hdmi_print(1, "Source reading EDID\n"); break; case 2: hdmi_print(1, "Source in DVI Mode\n"); break; case 3: hdmi_print(1, "Source in HDMI Mode\n"); break; default: hdmi_print(1, "EDID Status error\n"); } hdmi_tx_construct_avi_packet(param, (char *)AVI_DB); if ((VideoCode == HDMI_4k2k_30) || (VideoCode == HDMI_4k2k_25) || (VideoCode == HDMI_4k2k_24) || (VideoCode == HDMI_4k2k_smpte_24)) hdmi_set_vend_spec_infofram(hdmitx_device, VideoCode); else hdmi_set_vend_spec_infofram(hdmitx_device, 0); hdmitx_device->HWOp.SetPacket(HDMI_PACKET_AVI, AVI_DB, AVI_HB); ret = 0; } } else { if (hdmitx_device->HWOp.SetDispMode) /*Disable HDMITX*/ hdmitx_device->HWOp.SetDispMode(hdmitx_device, NULL); } hdmitx_set_spd_info(hdmitx_device); hdmitx_special_handler_video(hdmitx_device); return ret; }