/*! * \brief check device plugin status * * \retval None */ int sil902x_check_plugin(int hotplug) { int plugin = 0; unsigned char *buf; int option = 0; // sil902x_clr_interrupt(); plugin = (ReadByte(0x3D) & 0x04)? 1:0; if( hotplug ){ if (plugin){ buf = (unsigned char *)vout_get_edid(VOUT_DVO2HDMI); option = edid_parse_option(buf); sil902x_hdmi_edid = (option & EDID_OPT_HDMI)? 1:0; sil902x_active( sil902x_videoMode) ; } else { #ifdef SIL902X_CONTENT_PROTECT sil902x_CP_enable(0); #endif sil902x_set_power_mode(SIL902X_PWR_STANDBY); } DPRINT("[SIL902X] HDMI plug%s,option 0x%x\n",(plugin)?"in":"out",option); } vout_set_int_type(2); return plugin; } /* End of sil902x_check_plugin */
int vout_get_edid_option(int no) { vout_t *vo; DBG_DETAIL("(%d)\n",no); if( (vo = vout_get_entry(no)) == 0 ){ return 0; } if( vo->edid_info.option ){ return vo->edid_info.option; } if( vout_get_edid(no) == 0 ){ return 0; } edid_parse(vo->edid,&vo->edid_info); return vo->edid_info.option; }
vpp_timing_t *vout_find_video_mode(int no,vout_info_t *info) { vout_t *vo; char *edid = 0; unsigned int vo_option; vpp_timing_t *p_timing = 0; unsigned int opt = 0; int index = 0; vpp_timing_t *edid_timing = 0; if( (vo = vout_get_entry(no)) == 0 ) return 0; // if( vo->num != VPP_VOUT_NUM_HDMI ) // wm3445 simulate dual display { if( info->fixed_timing ){ p_timing = info->fixed_timing; DBG_MSG("%d(fixed timer)\n",no); goto find_video_mode; } } vo_option = vo->option[1]; DBG_MSG("(%d,%dx%d@%d,%d),%s\n",no,info->resx,info->resy,info->pixclk,info->fps,(vo_option & VOUT_OPT_INTERLACE)?"i":"p"); if( vo->status & VPP_VOUT_STS_PLUGIN ){ if( (edid = vout_get_edid(no)) ){ if( edid_parse(edid,&vo->edid_info) == 0 ){ edid = 0; } else { opt = info->fps | ((vo_option & VOUT_OPT_INTERLACE)? EDID_TMR_INTERLACE:0); if( edid_find_support(&vo->edid_info,info->resx,info->resy,opt,&edid_timing) ){ if( edid_timing ){ p_timing = edid_timing; DBG_MSG("Use EDID detail timing\n"); goto find_video_mode; } } } } } do { p_timing = vpp_get_video_mode(info->resx,info->resy,info->pixclk,&index); DBG_MSG("find(%dx%d@%d) -> %dx%d\n",info->resx,info->resy,info->pixclk,p_timing->hpixel,p_timing->vpixel); info->resx = p_timing->hpixel; info->resy = p_timing->vpixel; if( p_timing->option & VPP_OPT_INTERLACE ){ info->resy *= 2; } info->fps = VPP_GET_OPT_FPS(p_timing->option); opt = info->fps | ((vo_option & VOUT_OPT_INTERLACE)? EDID_TMR_INTERLACE:0); if( edid == 0 ) break; DBG_MSG("find edid %dx%d@%d%s\n",info->resx,info->resy,info->fps,(opt & EDID_TMR_INTERLACE)?"i":"p"); if( edid_find_support(&vo->edid_info,info->resx,info->resy,opt,&edid_timing) ){ break; } opt = info->fps | ((vo_option & VOUT_OPT_INTERLACE)? 0:EDID_TMR_INTERLACE); DBG_MSG("find edid %dx%d@%d%s\n",info->resx,info->resy,info->fps,(opt & EDID_TMR_INTERLACE)?"i":"p"); if( edid_find_support(&vo->edid_info,info->resx,info->resy,opt,&edid_timing) ){ break; } if( (info->resx <= vpp_video_mode_table[0].hpixel) || (index <=1) ){ info->resx = vpp_video_mode_table[0].hpixel; info->resy = vpp_video_mode_table[0].vpixel; break; } do { index--; p_timing = (vpp_timing_t *) &vpp_video_mode_table[index]; if( info->resx == p_timing->hpixel ){ int vpixel; vpixel = p_timing->vpixel; if( p_timing->option & VPP_OPT_INTERLACE ){ vpixel *= 2; index--; } if( info->resy == vpixel ){ continue; } } break; } while(1); info->resx = vpp_video_mode_table[index].hpixel; info->resy = vpp_video_mode_table[index].vpixel; if(vpp_video_mode_table[index].option & VPP_OPT_INTERLACE){ info->resy *= 2; } } while(1); if( edid_timing ){ p_timing = edid_timing; DBG_MSG("Use EDID detail timing\n"); } else { if( opt & EDID_TMR_INTERLACE ) vo_option |= VOUT_OPT_INTERLACE; else vo_option &= ~VOUT_OPT_INTERLACE; p_timing = vpp_get_video_mode_ext(info->resx,info->resy,info->fps,vo_option); } find_video_mode: { int hpixel,vpixel; info->resx = p_timing->hpixel; info->resy = p_timing->vpixel; hpixel = p_timing->hpixel + p_timing->hsync + p_timing->hfp + p_timing->hbp; vpixel = p_timing->vpixel + p_timing->vsync + p_timing->vfp + p_timing->vbp; if( p_timing->option & VPP_OPT_INTERLACE ) { info->resy *= 2; // vpixel *= 2; } info->pixclk = p_timing->pixel_clock; info->fps = info->pixclk / (hpixel * vpixel); info->resx_virtual = vpp_calc_fb_width(g_vpp.mb_colfmt,info->resx); info->resy_virtual = info->resy; } DBG_MSG("Leave (%dx%d@%d,%d)\n",p_timing->hpixel,p_timing->vpixel,p_timing->pixel_clock,info->fps); return p_timing; }