__s32 hdmi_main_task_loop(void) { static __u32 times = 0; HPD = main_Hpd_Check(); if( 0 == HPD ) { if((hdmi_state > HDMI_State_Wait_Hpd) || (hdmi_state == HDMI_State_Idle)) { __inf("plugout\n"); hdmi_state = HDMI_State_Idle; video_on = 0; audio_on = 0; Hdmi_hpd_event(); } if((times++) >= 10) { times = 0; __inf("unplug state !!\n"); } } switch(hdmi_state) { case HDMI_State_Idle: __inf("HDMI_State_Idle\n"); bsp_hdmi_hrst(); bsp_hdmi_standby(); hdmi_state = HDMI_State_Wait_Hpd; case HDMI_State_Wait_Hpd: __inf("HDMI_State_Wait_Hpd\n"); //bsp_hdmi_init(); if(HPD) { hdmi_state = HDMI_State_EDID_Parse; __inf("plugin\n"); } else { return 0; } msleep(200); case HDMI_State_Rx_Sense: case HDMI_State_EDID_Parse: __inf("HDMI_State_EDID_Parse\n"); ParseEDID(); hdmi_state = HDMI_State_HPD_Done; Hdmi_hpd_event(); if(video_enable) set_video_enable(true); case HDMI_State_HPD_Done: //__inf("HDMI_State_HPD_Done\n"); if(video_on && hdcp_enable) bsp_hdmi_hdl(); return 0; default: __wrn(" unkonwn hdmi state, set to idle\n"); hdmi_state = HDMI_State_Idle; return 0; } }
__s32 hdmi_core_initial(void) { if(0 != sw_init_flag) { hdmi_state = HDMI_State_Playback; } else { hdmi_state = HDMI_State_Idle; video_mode = HDMI720P_50; } memset(&audio_info,0,sizeof(HDMI_AUDIO_INFO)); memset(Device_Support_VIC,0,sizeof(Device_Support_VIC)); sunxi_set_reg_base(0xf0000000); api_set_func(hdmi_delay_us); if(0 != sw_init_flag) { ParseEDID(); Hdmi_hpd_event(); } else { video_enter_lp(); } audio_info.data_raw = 1; /* default pcm */ return 0; }
__s32 hdmi_core_initial(bool sw_only) { memset(&audio_info,0,sizeof(HDMI_AUDIO_INFO)); mutex_init(&hdmi_lock); api_set_func(hdmi_delay_us); hdmi_para_init(); if(sw_only) { video_enable = 1; hdmi_state = HDMI_State_HPD_Done; if(bsp_hdmi_get_hpd()) { ParseEDID(); video_on = 1; Hdmi_hpd_event(); } } else { bsp_hdmi_init(); } return 0; }
__s32 hdmi_main_task_loop(void) { static __u32 times = 0; HPD = main_Hpd_Check(); if( !HPD ) { if((times++) >= 10) { times = 0; sunxi_hdcp_rst(); __inf("unplug state\n"); } if(hdmi_state > HDMI_State_Wait_Hpd) { __inf("plugout\n"); hdmi_state = HDMI_State_Wait_Hpd; sunxi_hdcp_rst(); Hdmi_hpd_event(); video_enter_lp(); } } if(hdmi_state > HDMI_State_Video_config) { if(hdcp_enable) sunxi_hdcp_hdl(); } switch(hdmi_state) { case HDMI_State_Idle: hdmi_state = HDMI_State_Wait_Hpd; case HDMI_State_Wait_Hpd: if(HPD) { hdmi_state = HDMI_State_EDID_Parse; __inf("plugin\n"); } else { return 0; } case HDMI_State_Rx_Sense: case HDMI_State_EDID_Parse: hdmi_state = HDMI_State_Wait_Video_config; ParseEDID(); Hdmi_hpd_event(); case HDMI_State_Wait_Video_config: if(video_enable) { hdmi_state = HDMI_State_Video_config; } else { return 0; } case HDMI_State_Video_config: sunxi_hdcp_rst(); video_config(video_mode); hdmi_state = HDMI_State_Audio_config; case HDMI_State_Audio_config: audio_config(); hdmi_state = HDMI_State_Playback; case HDMI_State_Playback: return 0; default: __wrn(" unkonwn hdmi state, set to idle\n"); hdmi_state = HDMI_State_Idle; return 0; } }
static void det_worker(struct work_struct *work) { BYTE HPD, HPDChange ; char event_string[16]; char *envp[] = { event_string, NULL }; CheckHDMITX(&HPD, &HPDChange); if (HPDChange) { /* cable connection changes */ if (HPD) { ite661x.cable_plugin = 1; sprintf(event_string, "EVENT=plugin"); /* make sure fb is powerdown */ acquire_console_sem(); fb_blank(ite661x.fbi, FB_BLANK_POWERDOWN); release_console_sem(); if (ite661x_read_edid(ite661x.fbi) < 0) dev_err(&ite661x.client->dev, "ite661x: read edid fail\n"); else { ParseEDID(ite661x.edid + 128); if (ite661x.fbi->monspecs.modedb_len > 0) { int i; const struct fb_videomode *mode; struct fb_videomode m; fb_destroy_modelist(&ite661x.fbi->modelist); for (i = 0; i < ite661x.fbi->monspecs.modedb_len; i++) { /*FIXME now we do not support interlaced mode */ if (!(ite661x.fbi->monspecs.modedb[i].vmode & FB_VMODE_INTERLACED)) fb_add_videomode(&ite661x.fbi->monspecs.modedb[i], &ite661x.fbi->modelist); } fb_var_to_videomode(&m, &ite661x.fbi->var); mode = fb_find_nearest_mode(&m, &ite661x.fbi->modelist); fb_videomode_to_var(&ite661x.fbi->var, mode); ite661x.fbi->var.activate |= FB_ACTIVATE_FORCE; acquire_console_sem(); ite661x.fbi->flags |= FBINFO_MISC_USEREVENT; fb_set_var(ite661x.fbi, &ite661x.fbi->var); ite661x.fbi->flags &= ~FBINFO_MISC_USEREVENT; release_console_sem(); } acquire_console_sem(); fb_blank(ite661x.fbi, FB_BLANK_UNBLANK); release_console_sem(); HDMITX_SetOutput(); } } else { ite661x.cable_plugin = 0; sprintf(event_string, "EVENT=plugout"); acquire_console_sem(); fb_blank(ite661x.fbi, FB_BLANK_POWERDOWN); release_console_sem(); DisableAudioOutput(); DisableVideoOutput(); } kobject_uevent_env(&ite661x.pdev->dev.kobj, KOBJ_CHANGE, envp); } enable_irq(ite661x.client->irq); }
__s32 hdmi_main_task_loop(void) { static __u32 times = 0; HPD = main_Hpd_Check(); if( !HPD ) { if((times++) >= 10) { times = 0; __inf("unplug state\n"); } if(hdmi_state > HDMI_State_Wait_Hpd) { __inf("plugout\n"); hdmi_state = HDMI_State_Wait_Hpd; Hdmi_hpd_event(); } } switch(hdmi_state) { case HDMI_State_Idle: hdmi_state = HDMI_State_Wait_Hpd; return 0; case HDMI_State_Wait_Hpd: if(HPD) { hdmi_state = HDMI_State_EDID_Parse; __inf("plugin\n"); }else { return 0; } case HDMI_State_Rx_Sense: case HDMI_State_EDID_Parse: HDMI_WUINT32(0x004,0x80000000); HDMI_WUINT32(0x208,(1<<31)+ (1<<30)+ (1<<29)+ (3<<27)+ (0<<26)+ (1<<25)+ (0<<24)+ (0<<23)+ (4<<20)+ (7<<17)+ (15<<12)+ (7<<8)+ (0x0f<<4)+(8<<0) ); HDMI_WUINT32(0x200,0xfe800000); //txen enable HDMI_WUINT32(0x204,0x00D8C850); //ckss = 1 HDMI_WUINT32(0x20c, 0 << 21); ParseEDID(); HDMI_RUINT32(0x5f0); hdmi_state = HDMI_State_Wait_Video_config; Hdmi_hpd_event(); case HDMI_State_Wait_Video_config: if(video_enable) { hdmi_state = HDMI_State_Video_config; }else { return 0; } case HDMI_State_Video_config: video_config(video_mode); hdmi_state = HDMI_State_Audio_config; case HDMI_State_Audio_config: audio_config(); hdmi_state = HDMI_State_Playback; case HDMI_State_Playback: return 0; default: __wrn(" unkonwn hdmi state, set to idle\n"); hdmi_state = HDMI_State_Idle; return 0; } }