__s32 BSP_disp_hdmi_open(__u32 sel) { if(!(gdisp.screen[sel].status & HDMI_ON)) { __disp_tv_mode_t tv_mod; __u32 scaler_index; tv_mod = gdisp.screen[sel].hdmi_mode; hdmi_clk_on(); lcdc_clk_on(sel); image_clk_on(sel); Image_open(sel);//set image normal channel start bit , because every de_clk_off( )will reset this bit disp_clk_cfg(sel,DISP_OUTPUT_TYPE_HDMI, tv_mod); BSP_disp_set_output_csc(sel, DISP_OUTPUT_TYPE_HDMI); DE_BE_set_display_size(sel, tv_mode_to_width(tv_mod), tv_mode_to_height(tv_mod)); DE_BE_Output_Select(sel, sel); DE_BE_Set_Outitl_enable(sel, Disp_get_screen_scan_mode(tv_mod)); for(scaler_index=0; scaler_index<2; scaler_index++) { if((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) { if(Disp_get_screen_scan_mode(tv_mod) == 1)//interlace output { Scaler_Set_Outitl(scaler_index, TRUE); } else { Scaler_Set_Outitl(scaler_index, FALSE); } } } TCON1_set_hdmi_mode(sel,tv_mod); TCON1_open(sel); if(gdisp.init_para.Hdmi_open) { gdisp.init_para.Hdmi_open(); } else { DE_WRN("Hdmi_open is NULL\n"); return -1; } Disp_Switch_Dram_Mode(DISP_OUTPUT_TYPE_HDMI, tv_mod); gdisp.screen[sel].b_out_interlace = Disp_get_screen_scan_mode(tv_mod); gdisp.screen[sel].status |= HDMI_ON; gdisp.screen[sel].lcdc_status |= LCDC_TCON1_USED; gdisp.screen[sel].output_type = DISP_OUTPUT_TYPE_HDMI; #ifdef __LINUX_OSAL__ Display_set_fb_timming(sel); #endif } return DIS_SUCCESS; }
__s32 bsp_disp_tv_close(__u32 screen_id) { if(gdisp.screen[screen_id].status & TV_ON) { Image_close(screen_id); tcon1_close(screen_id); Disp_TVEC_Close(screen_id); tve_clk_off(screen_id); image_clk_off(screen_id, 1); lcdc_clk_off(screen_id); #if (defined CONFIG_ARCH_SUN5I) __u32 scaler_index = 0; //disp_de_flicker_enable(screen_id, 2); //must close immediately, because vbi may not come DE_BE_Set_Outitl_enable(screen_id, FALSE); for(scaler_index=0; scaler_index<2; scaler_index++) { if((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == screen_id)) { Scaler_Set_Outitl(scaler_index, FALSE); } } #endif #ifdef __LINUX_OSAL__ { disp_gpio_set_t gpio_info[1]; __hdle gpio_pa_shutdown; __s32 ret; memset(gpio_info, 0, sizeof(disp_gpio_set_t)); ret = OSAL_Script_FetchParser_Data("audio_para","audio_pa_ctrl", (int *)gpio_info, sizeof(disp_gpio_set_t)/sizeof(int)); if(ret < 0) { DE_WRN("fetch script data audio_para.audio_pa_ctrl fail\n"); } else { gpio_pa_shutdown = OSAL_GPIO_Request(gpio_info, 1); if(!gpio_pa_shutdown) { DE_WRN("audio codec_wakeup request gpio fail!\n"); } else { OSAL_GPIO_DevWRITE_ONEPIN_DATA(gpio_pa_shutdown, 1, "audio_pa_ctrl"); } } } #endif gdisp.screen[screen_id].b_out_interlace = 0; gdisp.screen[screen_id].status &= TV_OFF; gdisp.screen[screen_id].lcdc_status &= LCDC_TCON1_USED_MASK; gdisp.screen[screen_id].output_type = DISP_OUTPUT_TYPE_NONE; gdisp.screen[screen_id].pll_use_status &= ((gdisp.screen[screen_id].pll_use_status == VIDEO_PLL0_USED)? VIDEO_PLL0_USED_MASK : VIDEO_PLL1_USED_MASK); Disp_set_out_interlace(screen_id); } return DIS_SUCCESS; }
__s32 Disp_set_out_interlace(__u32 sel) { __u32 i; __bool b_cvbs_out = 0; if (sunxi_is_sun5i()) return 0; if (gdisp.screen[sel].output_type == DISP_OUTPUT_TYPE_TV && (gdisp.screen[sel].tv_mode == DISP_TV_MOD_PAL || gdisp.screen[sel].tv_mode == DISP_TV_MOD_PAL_M || gdisp.screen[sel].tv_mode == DISP_TV_MOD_PAL_NC || gdisp.screen[sel].tv_mode == DISP_TV_MOD_NTSC)) { b_cvbs_out = 1; } gdisp.screen[sel].de_flicker_status |= DE_FLICKER_REQUIRED; BSP_disp_cfg_start(sel); /* when output device is cvbs */ if ((gdisp.screen[sel].de_flicker_status & DE_FLICKER_REQUIRED) && b_cvbs_out) { DE_BE_deflicker_enable(sel, TRUE); for (i = 0; i < 2; i++) { if ((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == sel)) { Scaler_Set_Outitl(i, FALSE); } } gdisp.screen[sel].de_flicker_status |= DE_FLICKER_USED; } else { DE_BE_deflicker_enable(sel, FALSE); for (i = 0; i < 2; i++) { if ((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == sel)) { Scaler_Set_Outitl(i, gdisp.screen[sel]. b_out_interlace); } } gdisp.screen[sel].de_flicker_status &= ~DE_FLICKER_USED; } DE_BE_Set_Outitl_enable(sel, gdisp.screen[sel].b_out_interlace); BSP_disp_cfg_finish(sel); return DIS_SUCCESS; }
__s32 Disp_set_out_interlace(__u32 screen_id) { __u32 i; __bool b_cvbs_out = 0; __u32 num_scalers; num_scalers = bsp_disp_feat_get_num_scalers(); if(gdisp.screen[screen_id].output_type==DISP_OUTPUT_TYPE_TV && (gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_PAL || gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_PAL_M || gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_PAL_NC || gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_NTSC)) { b_cvbs_out = 1; } gdisp.screen[screen_id].de_flicker_status |= DE_FLICKER_REQUIRED; bsp_disp_cfg_start(screen_id); /* when output device is cvbs */ if((gdisp.screen[screen_id].de_flicker_status & DE_FLICKER_REQUIRED) && b_cvbs_out) { DE_BE_deflicker_enable(screen_id, TRUE); for(i=0; i<num_scalers; i++) { if((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == screen_id)) { Scaler_Set_Outitl(i, FALSE); gdisp.scaler[i].b_reg_change = TRUE; } } gdisp.screen[screen_id].de_flicker_status |= DE_FLICKER_USED; } else { DE_BE_deflicker_enable(screen_id, FALSE); for(i=0; i<num_scalers; i++) { if((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == screen_id)) { Scaler_Set_Outitl(i, gdisp.screen[screen_id].b_out_interlace); gdisp.scaler[i].b_reg_change = TRUE; } } gdisp.screen[screen_id].de_flicker_status &= DE_FLICKER_USED_MASK; } DE_BE_Set_Outitl_enable(screen_id, gdisp.screen[screen_id].b_out_interlace); bsp_disp_cfg_finish(screen_id); return DIS_SUCCESS; }
__s32 BSP_disp_hdmi_close(__u32 sel) { if(gdisp.screen[sel].status & HDMI_ON) { __u32 scaler_index; if(gdisp.init_para.Hdmi_close) { gdisp.init_para.Hdmi_close(); } else { DE_WRN("Hdmi_close is NULL\n"); return -1; } Image_close(sel); TCON1_close(sel); image_clk_off(sel); lcdc_clk_off(sel); hdmi_clk_off(); DE_BE_Set_Outitl_enable(sel, FALSE); for(scaler_index=0; scaler_index<2; scaler_index++) { if((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) { Scaler_Set_Outitl(scaler_index, FALSE); } } gdisp.screen[sel].b_out_interlace = 0; gdisp.screen[sel].lcdc_status &= LCDC_TCON1_USED_MASK; gdisp.screen[sel].status &= HDMI_OFF; gdisp.screen[sel].output_type = DISP_OUTPUT_TYPE_NONE; gdisp.screen[sel].pll_use_status &= ((gdisp.screen[sel].pll_use_status == VIDEO_PLL0_USED)? VIDEO_PLL0_USED_MASK : VIDEO_PLL1_USED_MASK); } return DIS_SUCCESS; }
__s32 bsp_disp_tv_open(__u32 screen_id) { if(!(gdisp.screen[screen_id].status & TV_ON)) { __disp_tv_mode_t tv_mod; tv_mod = gdisp.screen[screen_id].tv_mode; image_clk_on(screen_id, 1); Image_open(screen_id);//set image normal channel start bit , because every de_clk_off( )will reset this bit disp_clk_cfg(screen_id,DISP_OUTPUT_TYPE_TV, tv_mod); tve_clk_on(screen_id); lcdc_clk_on(screen_id, 1, 0); lcdc_clk_on(screen_id, 1, 1); tcon_init(screen_id); gdisp.screen[screen_id].output_csc_type = DISP_OUT_CSC_TYPE_TV; bsp_disp_set_output_csc(screen_id, gdisp.screen[screen_id].output_csc_type, bsp_disp_drc_get_input_csc(screen_id)); DE_BE_set_display_size(screen_id, tv_mode_to_width(tv_mod), tv_mode_to_height(tv_mod)); DE_BE_Output_Select(screen_id, screen_id); #if (defined CONFIG_ARCH_SUN5I) __u32 scaler_index = 0; DE_BE_Set_Outitl_enable(screen_id , disp_get_screen_scan_mode(tv_mod)); for(scaler_index=0; scaler_index<2; scaler_index++) { if((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == screen_id)) { if(disp_get_screen_scan_mode(tv_mod) == 1)//interlace output { Scaler_Set_Outitl(scaler_index, TRUE); } else { Scaler_Set_Outitl(scaler_index, FALSE); } } } #endif tcon1_set_tv_mode(screen_id,tv_mod); TVE_set_tv_mode(screen_id, tv_mod); Disp_TVEC_DacCfg(screen_id, tv_mod); tcon1_open(screen_id); Disp_TVEC_Open(screen_id); Disp_Switch_Dram_Mode(DISP_OUTPUT_TYPE_TV, tv_mod); #ifdef __LINUX_OSAL__ { disp_gpio_set_t gpio_info[1]; __hdle gpio_pa_shutdown; __s32 ret; memset(gpio_info, 0, sizeof(disp_gpio_set_t)); ret = OSAL_Script_FetchParser_Data("audio_para","audio_pa_ctrl", (int *)gpio_info, sizeof(disp_gpio_set_t)/sizeof(int)); if(ret == 0) { gpio_pa_shutdown = OSAL_GPIO_Request(gpio_info, 1); if(!gpio_pa_shutdown) { DE_WRN("audio codec_wakeup request gpio fail!\n"); } else { OSAL_GPIO_DevWRITE_ONEPIN_DATA(gpio_pa_shutdown, 0, "audio_pa_ctrl"); } } } #endif gdisp.screen[screen_id].b_out_interlace = disp_get_screen_scan_mode(tv_mod); gdisp.screen[screen_id].status |= TV_ON; gdisp.screen[screen_id].lcdc_status |= LCDC_TCON1_USED; gdisp.screen[screen_id].output_type = DISP_OUTPUT_TYPE_TV; #if (defined CONFIG_ARCH_SUN7I) Disp_set_out_interlace(screen_id); #endif #ifdef __LINUX_OSAL__ Display_set_fb_timming(screen_id); #endif } return DIS_SUCCESS; }
__s32 BSP_disp_tv_close(__u32 sel) { if (gdisp.screen[sel].status & TV_ON) { Image_close(sel); TCON1_close(sel); Disp_TVEC_Close(sel); tve_clk_off(sel); image_clk_off(sel); lcdc_clk_off(sel); if (sunxi_is_sun5i()) { int scaler_index; Disp_de_flicker_enable(sel, 2); /* must close immediately, because vbi may not come */ DE_BE_Set_Outitl_enable(sel, FALSE); for (scaler_index = 0; scaler_index < 2; scaler_index++) if ((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) Scaler_Set_Outitl(scaler_index, FALSE); } { user_gpio_set_t gpio_info[1]; __hdle gpio_pa_shutdown; __s32 ret; memset(gpio_info, 0, sizeof(user_gpio_set_t)); ret = script_parser_fetch("audio_para", "audio_pa_ctrl", (int *)gpio_info, sizeof(user_gpio_set_t) / sizeof(int)); if (ret < 0) { DE_WRN("fetch script data " "audio_para.audio_pa_ctrl fail\n"); } else { gpio_pa_shutdown = OSAL_GPIO_Request(gpio_info, 1); if (!gpio_pa_shutdown) { DE_WRN("audio codec_wakeup request " "gpio fail!\n"); } else { OSAL_GPIO_DevWRITE_ONEPIN_DATA (gpio_pa_shutdown, 1, "audio_pa_ctrl"); } } } gdisp.screen[sel].b_out_interlace = 0; gdisp.screen[sel].status &= ~TV_ON; gdisp.screen[sel].lcdc_status &= ~LCDC_TCON1_USED; gdisp.screen[sel].output_type = DISP_OUTPUT_TYPE_NONE; gdisp.screen[sel].pll_use_status &= ((gdisp.screen[sel].pll_use_status == VIDEO_PLL0_USED) ? ~VIDEO_PLL0_USED : ~VIDEO_PLL1_USED); Disp_set_out_interlace(sel); } return DIS_SUCCESS; }
__s32 BSP_disp_tv_open(__u32 sel) { if (!(gdisp.screen[sel].status & TV_ON)) { __disp_tv_mode_t tv_mod; tv_mod = gdisp.screen[sel].tv_mode; image_clk_on(sel); /* * set image normal channel start bit , because every * de_clk_off( )will reset this bit */ Image_open(sel); disp_clk_cfg(sel, DISP_OUTPUT_TYPE_TV, tv_mod); tve_clk_on(sel); lcdc_clk_on(sel); BSP_disp_set_output_csc(sel, DISP_OUTPUT_TYPE_TV, gdisp.screen[sel]. iep_status & DRC_USED); DE_BE_set_display_size(sel, tv_mode_to_width(tv_mod), tv_mode_to_height(tv_mod)); DE_BE_Output_Select(sel, sel); if (sunxi_is_sun5i()) { int scaler_index; DE_BE_Set_Outitl_enable(sel, Disp_get_screen_scan_mode(tv_mod)); for (scaler_index = 0; scaler_index < 2; scaler_index++) if ((gdisp.scaler[scaler_index]. status & SCALER_USED) && (gdisp.scaler[scaler_index]. screen_index == sel)) { /* interlace output */ if (Disp_get_screen_scan_mode(tv_mod) == 1) Scaler_Set_Outitl(scaler_index, TRUE); else Scaler_Set_Outitl(scaler_index, FALSE); } } TCON1_set_tv_mode(sel, tv_mod); TVE_set_tv_mode(sel, tv_mod); Disp_TVEC_DacCfg(sel, tv_mod); TCON1_open(sel); Disp_TVEC_Open(sel); Disp_Switch_Dram_Mode(DISP_OUTPUT_TYPE_TV, tv_mod); Disp_de_flicker_enable(sel, TRUE); { user_gpio_set_t gpio_info[1]; __hdle gpio_pa_shutdown; __s32 ret; memset(gpio_info, 0, sizeof(user_gpio_set_t)); ret = script_parser_fetch("audio_para", "audio_pa_ctrl", (int *)gpio_info, sizeof(user_gpio_set_t) / sizeof(int)); if (ret < 0) { DE_WRN("fetch script data " "audio_para.audio_pa_ctrl fail\n"); } else { gpio_pa_shutdown = OSAL_GPIO_Request(gpio_info, 1); if (!gpio_pa_shutdown) { DE_WRN("audio codec_wakeup request " "gpio fail!\n"); } else { OSAL_GPIO_DevWRITE_ONEPIN_DATA (gpio_pa_shutdown, 0, "audio_pa_ctrl"); } } } gdisp.screen[sel].b_out_interlace = Disp_get_screen_scan_mode(tv_mod); gdisp.screen[sel].status |= TV_ON; gdisp.screen[sel].lcdc_status |= LCDC_TCON1_USED; gdisp.screen[sel].output_type = DISP_OUTPUT_TYPE_TV; Disp_set_out_interlace(sel); Display_set_fb_timing(sel); } return DIS_SUCCESS; }
/* * en : 0-close when vbi * en : 1- open when vbi * en : 2-close immediately */ __s32 Disp_de_flicker_enable(__u32 sel, __u32 en) { __disp_tv_mode_t tv_mode; __u32 scan_mode; __u32 scaler_index; tv_mode = gdisp.screen[sel].tv_mode; scan_mode = gdisp.screen[sel].b_out_interlace; if (sel) return -1; switch (en) { case 0: if (gdisp.screen[sel].iep_status & DE_FLICKER_USED) { BSP_disp_cfg_start(sel); for (scaler_index = 0; scaler_index < 2; scaler_index++) { if ((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) { Scaler_Set_Outitl(scaler_index, TRUE); gdisp.scaler[scaler_index].b_reg_change = TRUE; } } /* must do in sun5i */ DE_BE_Set_Outitl_enable(sel, TRUE); gdisp.screen[sel].iep_status &= DE_FLICKER_NEED_CLOSED; BSP_disp_cfg_finish(sel); } else { DE_INF("de: De-flicker hasn't opened yet!\n"); } break; case 1: /* when set DISP_CMD_DE_FLICKER_ON before */ if (gdisp.screen[sel].iep_status & DE_FLICKER_REQUIRED) { if ((gdisp.screen[sel].output_type == DISP_OUTPUT_TYPE_TV) && scan_mode && (gdisp.screen[sel].status & TV_ON)) { /* when interlaced tv on */ if (!(gdisp.screen[sel].iep_status & DE_FLICKER_USED)) { BSP_disp_cfg_start(sel); /* config defe to fit de-flicker */ for (scaler_index = 0; scaler_index < 2; scaler_index++) { if ((gdisp.scaler[scaler_index]. status & SCALER_USED) && (gdisp.scaler[scaler_index]. screen_index == sel)) { Scaler_Set_Outitl (scaler_index, FALSE); gdisp.scaler [scaler_index]. b_reg_change = TRUE; } } /* config debe to fit de-flicker */ /* must do in sun5i */ DE_BE_Set_Outitl_enable(sel, FALSE); Disp_de_flicker_init(sel); gdisp.screen[sel].iep_status |= DE_FLICKER_USED; BSP_disp_cfg_finish(sel); } else { DE_INF("de: De-flicker has already " "opened before !\n"); } } else { DE_INF("de: Will OPEN de-flicker when output to" " interlaced device !\n"); } } else { DE_INF("de: Run DISP_CMD_DE_FLICKER_ON will open " "de-flicker !\n"); } break; case 2: if (gdisp.screen[sel].iep_status & DE_FLICKER_USED) { BSP_disp_cfg_start(sel); for (scaler_index = 0; scaler_index < 2; scaler_index++) { if ((gdisp.scaler[scaler_index].status & SCALER_USED) && (gdisp.scaler[scaler_index].screen_index == sel)) { Scaler_Set_Outitl(scaler_index, TRUE); gdisp.scaler[scaler_index]. b_reg_change = TRUE; } } /* must do in sun5i */ DE_BE_Set_Outitl_enable(sel, TRUE); Disp_de_flicker_close_proc(sel, 1); BSP_disp_cfg_finish(sel); } else { DE_INF("de: De-flicker hasn't opened yet!\n"); } break; } return 0; }