示例#1
0
__s32 scaler_event_proc(void *parg)
#endif
{
	__u8 fe_intflags = 0, be_intflags = 0;
	__u32 scaler_index = (__u32)parg;

	if(gdisp.scaler[scaler_index].status & SCALER_USED) {
		fe_intflags = DE_SCAL_QueryINT(scaler_index);
		DE_SCAL_ClearINT(scaler_index,fe_intflags);
	}
	be_intflags = DE_BE_QueryINT(scaler_index);
	DE_BE_ClearINT(scaler_index,be_intflags);

	//DE_INF("scaler %d interrupt, scal_int_status:0x%x!\n", scaler_index, fe_intflags);

	if(be_intflags & DE_IMG_REG_LOAD_FINISH) {
		LCD_line_event_proc(scaler_index);
	}

	if((gdisp.scaler[scaler_index].status & SCALER_USED) && (fe_intflags & DE_WB_END_IE)) {
		DE_SCAL_DisableINT(scaler_index,DE_FE_INTEN_ALL);
#ifdef __LINUX_OSAL__
		if(gdisp.scaler[scaler_index].b_scaler_finished == 1 && (&gdisp.scaler[scaler_index].scaler_queue != NULL)) {
			gdisp.scaler[scaler_index].b_scaler_finished = 2;
			wake_up_interruptible(&(gdisp.scaler[scaler_index].scaler_queue));
		}	else {
			__wrn("not scaler %d begin in DRV_scaler_finish\n", scaler_index);
		}
#endif
	}

	return OSAL_IRQ_RETURN;
}
示例#2
0
__s32 Scaler_event_proc(void *parg)
#endif
{
    __u8 fe_intflags;
    __u32 sel = (__u32)parg;

    fe_intflags = DE_SCAL_QueryINT(sel);

    DE_INF("scaler %d interrupt, scal_int_status:0x%x!\n", sel, fe_intflags);

    if(fe_intflags & DE_WB_END_IE)
    {        
        DE_SCAL_ClearINT(sel,DE_WB_END_IE);
        DE_SCAL_DisableINT(sel,DE_FE_INTEN_ALL);
#ifdef __LINUX_OSAL__
        if(gdisp.scaler[sel].b_scaler_finished == 1 && (&gdisp.scaler[sel].scaler_queue != NULL))
        {
            gdisp.scaler[sel].b_scaler_finished = 2;
            wake_up_interruptible(&(gdisp.scaler[sel].scaler_queue));
        }
        else
        {
            __wrn("not scaler %d begin in DRV_scaler_finish\n", sel);
        }
#endif
    }

    return OSAL_IRQ_RETURN;
}
示例#3
0
__s32 Scaler_open(__u32 scaler_index)
{
	DE_INF("scaler %d open\n", scaler_index);

	scaler_clk_on(scaler_index);
	deu_clk_open(scaler_index, 0);
	DE_SCAL_Reset(scaler_index);
	DE_SCAL_DisableINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_Enable(scaler_index);

	return DIS_SUCCESS;
}
示例#4
0
__s32 Scaler_Exit(__u32 scaler_index)
{
	if(scaler_index == 0) {
		OSAL_InterruptDisable(gdisp.init_para.irq[DISP_MOD_FE0]);
		OSAL_UnRegISR(gdisp.init_para.irq[DISP_MOD_FE0],scaler_event_proc,(void*)scaler_index);
	} else if(scaler_index == 1) {
		OSAL_InterruptDisable(gdisp.init_para.irq[DISP_MOD_FE1]);
		OSAL_UnRegISR(gdisp.init_para.irq[DISP_MOD_FE1],scaler_event_proc,(void*)scaler_index);
	}

	DE_SCAL_DisableINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_Reset(scaler_index);
	DE_SCAL_Disable(scaler_index);
	scaler_clk_off(scaler_index);
	return DIS_SUCCESS;
}
示例#5
0
__s32 Scaler_event_proc(__s32 irq, void *parg)
#endif
{
    __u8 fe_intflags;
    __u32 sel = (__u32)parg;

    fe_intflags = DE_SCAL_QueryINT(sel);
    if(fe_intflags & DE_WB_END_IE)
    {
		DE_SCAL_ClearINT(sel,DE_WB_END_IE);
		DE_SCAL_DisableINT(sel,DE_FE_INTEN_ALL);
		gdisp.init_para.scaler_finish(sel);
    }

    return OSAL_IRQ_RETURN;
}
示例#6
0
__s32 Scaler_Init(__u32 scaler_index)
{
	scaler_clk_init(scaler_index);
	DE_SCAL_DisableINT(scaler_index,DE_WB_END_IE);

	if(scaler_index == 0) {
		OSAL_RegISR(gdisp.init_para.irq[DISP_MOD_FE0],0,scaler_event_proc, (void *)scaler_index,0,0);
#ifndef __LINUX_OSAL__
		OSAL_InterruptEnable(gdisp.init_para.irq[DISP_MOD_FE0]);
#endif
	}	else if(scaler_index == 1) {
		OSAL_RegISR(gdisp.init_para.irq[DISP_MOD_FE1],0,scaler_event_proc, (void *)scaler_index,0,0);
#ifndef __LINUX_OSAL__
		OSAL_InterruptEnable(gdisp.init_para.irq[DISP_MOD_FE1]);
#endif
	}
	return DIS_SUCCESS;
}
示例#7
0
__s32 Scaler_Exit(__u32 sel)
{
    if(sel == 0)
    {
        OSAL_InterruptDisable(INTC_IRQNO_SCALER0);
        OSAL_UnRegISR(INTC_IRQNO_SCALER0,Scaler_event_proc,(void*)sel);
    }
    else if(sel == 1)
    {
        OSAL_InterruptDisable(INTC_IRQNO_SCALER1);
        OSAL_UnRegISR(INTC_IRQNO_SCALER1,Scaler_event_proc,(void*)sel);
    }

    DE_SCAL_DisableINT(sel,DE_WB_END_IE);
    DE_SCAL_Reset(sel);
    DE_SCAL_Disable(sel);
    scaler_clk_off(sel);
    return DIS_SUCCESS;
}
示例#8
0
__s32 bsp_disp_capture_screen(__u32 screen_id, __disp_capture_screen_para_t * para)
{
	__scal_buf_addr_t in_addr;
	__scal_buf_addr_t out_addr;
	__scal_src_size_t in_size;
	__scal_out_size_t out_size;
	__scal_src_type_t in_type;
	__scal_out_type_t out_type;
	__scal_scan_mod_t in_scan;
	__scal_scan_mod_t out_scan;
	__u32 size = 0;
	__s32 scaler_index = 0;
	__s32 ret = 0;

	if(para==NULL) {
		DE_WRN("input parameter can't be null!\n");
		return DIS_FAIL;
	}

	scaler_index =  Scaler_Request(0xff);
	if(scaler_index < 0) {
		DE_WRN("request scaler fail in bsp_disp_capture_screen\n");
		return DIS_FAIL;
	}

	in_type.fmt= Scaler_sw_para_to_reg(0,DISP_MOD_INTERLEAVED, DISP_FORMAT_ARGB8888, DISP_SEQ_ARGB);
	in_type.mod= Scaler_sw_para_to_reg(1,DISP_MOD_INTERLEAVED, DISP_FORMAT_ARGB8888, DISP_SEQ_ARGB);
	in_type.ps= Scaler_sw_para_to_reg(2,DISP_MOD_INTERLEAVED, DISP_FORMAT_ARGB8888, (__u8)DISP_SEQ_ARGB);
	in_type.byte_seq = 0;
	in_type.sample_method = 0;

	if(get_fb_type(para->output_fb.format) == DISP_FB_TYPE_YUV) {
		if(para->output_fb.mode == DISP_MOD_NON_MB_PLANAR) {
			out_type.fmt = Scaler_sw_para_to_reg(3, para->output_fb.mode, para->output_fb.format, para->output_fb.seq);
		} else {
			DE_WRN("output mode:%d invalid in Display_Scaler_Start\n",para->output_fb.mode);
			return DIS_FAIL;
		}
	} else {
		if(para->output_fb.mode == DISP_MOD_NON_MB_PLANAR && (para->output_fb.format == DISP_FORMAT_RGB888
		|| para->output_fb.format == DISP_FORMAT_ARGB8888)) {
			out_type.fmt = DE_SCAL_OUTPRGB888;
		} else if(para->output_fb.mode == DISP_MOD_INTERLEAVED && para->output_fb.format == DISP_FORMAT_ARGB8888) {
			out_type.fmt = DE_SCAL_OUTI0RGB888;
		} else {
			DE_WRN("output para invalid in Display_Scaler_Start,mode:%d,format:%d\n",para->output_fb.mode, para->output_fb.format);
			return DIS_FAIL;
		}
		para->output_fb.br_swap= FALSE;
	}
	out_type.byte_seq = Scaler_sw_para_to_reg(2,para->output_fb.mode, para->output_fb.format, para->output_fb.seq);
	out_type.alpha_en = 1;
	out_type.alpha_coef_type = 0;

	out_size.width     = para->output_fb.size.width;
	out_size.height = para->output_fb.size.height;

	if(bsp_disp_get_output_type(screen_id) != DISP_OUTPUT_TYPE_NONE) {
		in_size.src_width = bsp_disp_get_screen_width(screen_id);
		in_size.src_height = bsp_disp_get_screen_height(screen_id);
		in_size.x_off = 0;
		in_size.y_off = 0;
		in_size.scal_width= bsp_disp_get_screen_width(screen_id);
		in_size.scal_height= bsp_disp_get_screen_height(screen_id);
	} else {
		in_size.src_width = para->screen_size.width;
		in_size.src_height= para->screen_size.height;
		in_size.x_off = 0;
		in_size.y_off = 0;
		in_size.scal_width= para->screen_size.width;
		in_size.scal_height= para->screen_size.height;
	}

	in_scan.field = FALSE;
	in_scan.bottom = FALSE;

	out_scan.field = FALSE; //when use scaler as writeback, won't be outinterlaced for any display device
	out_scan.bottom = FALSE;

	in_addr.ch0_addr = 0;
	in_addr.ch1_addr = 0;
	in_addr.ch2_addr = 0;

	out_addr.ch0_addr = (__u32)OSAL_VAtoPA((void*)(para->output_fb.addr[0]));
	out_addr.ch1_addr = (__u32)OSAL_VAtoPA((void*)(para->output_fb.addr[1]));
	out_addr.ch2_addr = (__u32)OSAL_VAtoPA((void*)(para->output_fb.addr[2]));

	size = (para->output_fb.size.width * para->output_fb.size.height * de_format_to_bpp(para->output_fb.format) + 7)/8;
	OSAL_CacheRangeFlush((void *)para->output_fb.addr[0],size ,CACHE_FLUSH_D_CACHE_REGION);

	if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_NONE) {
		DE_SCAL_Input_Select(scaler_index, 6 + screen_id);
		DE_BE_set_display_size(screen_id, para->screen_size.width, para->screen_size.height);
		DE_BE_Output_Select(screen_id, 6 + scaler_index);
		image_clk_on(screen_id, 1);
		Image_open(screen_id);
		DE_BE_Cfg_Ready(screen_id);
	} else {
		DE_SCAL_Input_Select(scaler_index, 4 + screen_id);
		DE_BE_Output_Select(screen_id, 2 + (scaler_index * 2) + screen_id);
	}
	DE_SCAL_Config_Src(scaler_index,&in_addr,&in_size,&in_type,FALSE,FALSE);
	DE_SCAL_Set_Scaling_Factor(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type);
	DE_SCAL_Set_Init_Phase(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, FALSE);
	DE_SCAL_Set_CSC_Coef(scaler_index, DISP_BT601, para->output_fb.cs_mode, DISP_FB_TYPE_RGB, get_fb_type(para->output_fb.format), 0, 0);
	DE_SCAL_Set_Scaling_Coef(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, DISP_VIDEO_NATUAL);
	DE_SCAL_Set_Out_Format(scaler_index, &out_type);
	DE_SCAL_Set_Out_Size(scaler_index, &out_scan,&out_type, &out_size);
	DE_SCAL_Set_Writeback_Addr(scaler_index,&out_addr);
	DE_SCAL_Output_Select(scaler_index, 3);
	DE_SCAL_ClearINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_EnableINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_Set_Reg_Rdy(scaler_index);
	DE_SCAL_Writeback_Enable(scaler_index);
	DE_SCAL_Start(scaler_index);

	DE_INF("capture begin\n");
	#ifndef __LINUX_OSAL__
	while(!(DE_SCAL_QueryINT(scaler_index) & DE_WB_END_IE)) {

	}
	#else
	{
		long timeout = (100 * HZ)/1000;//100ms

		init_waitqueue_head(&(gdisp.scaler[scaler_index].scaler_queue));
		gdisp.scaler[scaler_index].b_scaler_finished = 1;
		DE_SCAL_Writeback_Enable(scaler_index);

		timeout = wait_event_interruptible_timeout(gdisp.scaler[scaler_index].scaler_queue, gdisp.scaler[scaler_index].b_scaler_finished == 2, timeout);
		gdisp.scaler[scaler_index].b_scaler_finished = 0;
		if(timeout == 0) {
			__wrn("wait scaler %d finished timeout\n", scaler_index);
			return -1;
		}
	}
	#endif
	DE_SCAL_Reset(scaler_index);
	Scaler_Release(scaler_index, FALSE);
	if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_NONE) {
		Image_close(screen_id);
		image_clk_off(screen_id, 1);
	}
	DE_BE_Output_Select(screen_id, screen_id);
	DE_SCAL_ClearINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_DisableINT(scaler_index,DE_WB_END_IE);

	return ret;
}
示例#9
0
__s32 bsp_disp_scaler_start_ex(__u32 handle,__disp_scaler_para_t *para)
{
	__scal_buf_addr_t in_addr;
	__scal_buf_addr_t out_addr;
	__scal_src_size_t in_size;
	__scal_out_size_t out_size;
	__scal_src_type_t in_type;
	__scal_out_type_t out_type;
	__scal_scan_mod_t in_scan;
	__scal_scan_mod_t out_scan;
	__u32 size = 0;
	__u32 scaler_index = 0;
	__s32 ret = 0;

	if(para==NULL) {
		DE_WRN("input parameter can't be null!\n");
		return DIS_FAIL;
	}

	scaler_index = SCALER_HANDTOID(handle);

	in_type.fmt= Scaler_sw_para_to_reg(0,para->input_fb.mode, para->input_fb.format, para->input_fb.seq);
	in_type.mod= Scaler_sw_para_to_reg(1,para->input_fb.mode, para->input_fb.format, para->input_fb.seq);
	in_type.ps= Scaler_sw_para_to_reg(2,para->input_fb.mode, para->input_fb.format, (__u8)para->input_fb.seq);
	in_type.byte_seq = 0;
	in_type.sample_method = 0;

	if(get_fb_type(para->output_fb.format) == DISP_FB_TYPE_YUV)	{
		if(para->output_fb.mode == DISP_MOD_NON_MB_PLANAR) {
			out_type.fmt = Scaler_sw_para_to_reg(3, para->output_fb.mode, para->output_fb.format, para->output_fb.seq);
		}	else {
			DE_WRN("output mode:%d invalid in Display_Scaler_Start\n",para->output_fb.mode);
			return DIS_FAIL;
		}
	}	else {
		if(para->output_fb.mode == DISP_MOD_NON_MB_PLANAR
		    && (para->output_fb.format == DISP_FORMAT_RGB888 || para->output_fb.format == DISP_FORMAT_ARGB8888)) {
			out_type.fmt = DE_SCAL_OUTPRGB888;
		}	else if(para->output_fb.mode == DISP_MOD_INTERLEAVED && para->output_fb.format == DISP_FORMAT_ARGB8888)	{
			out_type.fmt = DE_SCAL_OUTI0RGB888;
		}	else {
			DE_WRN("output para invalid in Display_Scaler_Start,mode:%d,format:%d\n",para->output_fb.mode, para->output_fb.format);
			return DIS_FAIL;
		}
	}
	out_type.byte_seq = Scaler_sw_para_to_reg(2,para->output_fb.mode, para->output_fb.format, para->output_fb.seq);
	out_type.alpha_en = 1;
	out_type.alpha_coef_type = 0;

	out_size.width  = para->out_regn.width;
	out_size.height = para->out_regn.height;
	out_size.x_off = para->out_regn.x;
	out_size.y_off = para->out_regn.y;
	out_size.fb_width = para->output_fb.size.width;
	out_size.fb_height = para->output_fb.size.height;

	in_addr.ch0_addr = (__u32)OSAL_VAtoPA((void*)(para->input_fb.addr[0]));
	in_addr.ch1_addr = (__u32)OSAL_VAtoPA((void*)(para->input_fb.addr[1]));
	in_addr.ch2_addr = (__u32)OSAL_VAtoPA((void*)(para->input_fb.addr[2]));

	in_size.src_width = para->input_fb.size.width;
	in_size.src_height = para->input_fb.size.height;
	in_size.x_off = para->source_regn.x;
	in_size.y_off = para->source_regn.y;
	in_size.scal_width= para->source_regn.width;
	in_size.scal_height= para->source_regn.height;

	in_scan.field = FALSE;
	in_scan.bottom = FALSE;

	out_scan.field = FALSE;	//when use scaler as writeback, won't be outinterlaced for any display device
	out_scan.bottom = FALSE;

	out_addr.ch0_addr = (__u32)OSAL_VAtoPA((void*)(para->output_fb.addr[0]));
	out_addr.ch1_addr = (__u32)OSAL_VAtoPA((void*)(para->output_fb.addr[1]));
	out_addr.ch2_addr = (__u32)OSAL_VAtoPA((void*)(para->output_fb.addr[2]));

	size = (para->input_fb.size.width * para->input_fb.size.height * de_format_to_bpp(para->input_fb.format) + 7)/8;
	OSAL_CacheRangeFlush((void *)para->input_fb.addr[0],size ,CACHE_CLEAN_FLUSH_D_CACHE_REGION);

	size = (para->output_fb.size.width * para->output_fb.size.height * de_format_to_bpp(para->output_fb.format) + 7)/8;
	OSAL_CacheRangeFlush((void *)para->output_fb.addr[0],size ,CACHE_FLUSH_D_CACHE_REGION);
	if(para->input_fb.b_trd_src) {
		__scal_3d_inmode_t inmode;
		__scal_3d_outmode_t outmode = 0;
		__scal_buf_addr_t scal_addr_right;

		inmode = Scaler_3d_sw_para_to_reg(0, para->input_fb.trd_mode, FALSE);
		outmode = Scaler_3d_sw_para_to_reg(1, para->output_fb.trd_mode, FALSE);

		DE_SCAL_Get_3D_In_Single_Size(inmode, &in_size, &in_size);
		if(para->output_fb.b_trd_src)	{
			DE_SCAL_Get_3D_Out_Single_Size(outmode, &out_size, &out_size);
		}

		scal_addr_right.ch0_addr= (__u32)OSAL_VAtoPA((void*)(para->input_fb.trd_right_addr[0]));
		scal_addr_right.ch1_addr= (__u32)OSAL_VAtoPA((void*)(para->input_fb.trd_right_addr[1]));
		scal_addr_right.ch2_addr= (__u32)OSAL_VAtoPA((void*)(para->input_fb.trd_right_addr[2]));

		DE_SCAL_Set_3D_Ctrl(scaler_index, para->output_fb.b_trd_src, inmode, outmode);
		DE_SCAL_Config_3D_Src(scaler_index, &in_addr, &in_size, &in_type, inmode, &scal_addr_right);
	}	else {
		DE_SCAL_Config_Src(scaler_index,&in_addr,&in_size,&in_type,FALSE,FALSE);
	}
	DE_SCAL_Set_Scaling_Factor(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type);
	DE_SCAL_Set_Init_Phase(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, FALSE);
	DE_SCAL_Set_CSC_Coef(scaler_index, para->input_fb.cs_mode, para->output_fb.cs_mode, get_fb_type(para->input_fb.format), get_fb_type(para->output_fb.format),  para->input_fb.br_swap, para->output_fb.br_swap);
	DE_SCAL_Set_Scaling_Coef(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, DISP_VIDEO_NATUAL);
	DE_SCAL_Set_Out_Format(scaler_index, &out_type);
	DE_SCAL_Set_Out_Size(scaler_index, &out_scan,&out_type, &out_size);
	//DE_SCAL_Set_Writeback_Addr(scaler_index,&out_addr);
	DE_SCAL_Set_Writeback_Addr_ex(scaler_index,&out_addr,&out_size,&out_type);
	DE_SCAL_Writeback_Linestride_Enable(scaler_index);
	DE_SCAL_Output_Select(scaler_index, 3);
	DE_SCAL_Input_Select(scaler_index, 0);

	DE_SCAL_EnableINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_Start(scaler_index);
	DE_SCAL_Set_Reg_Rdy(scaler_index);

	DE_INF("scaler write back begin\n");

#ifndef __LINUX_OSAL__
	DE_SCAL_Writeback_Enable(scaler_index);
	while(!(DE_SCAL_QueryINT(scaler_index) & DE_WB_END_IE)) {
	}
#else
	{
		long timeout = (100 * HZ)/1000;//100ms

		init_waitqueue_head(&(gdisp.scaler[scaler_index].scaler_queue));
		gdisp.scaler[scaler_index].b_scaler_finished = 1;
		DE_SCAL_Writeback_Enable(scaler_index);

		timeout = wait_event_interruptible_timeout(gdisp.scaler[scaler_index].scaler_queue, gdisp.scaler[scaler_index].b_scaler_finished == 2, timeout);
		gdisp.scaler[scaler_index].b_scaler_finished = 0;
		if(timeout == 0)	{
			__wrn("wait scaler %d finished timeout\n", scaler_index);
			return -1;
		}
	}
#endif
	DE_SCAL_Reset(scaler_index);
	DE_SCAL_Writeback_Disable(scaler_index);
	DE_SCAL_Writeback_Linestride_Disable(scaler_index);
	DE_SCAL_ClearINT(scaler_index,DE_WB_END_IE);
	DE_SCAL_DisableINT(scaler_index,DE_WB_END_IE);

	return ret;
}