⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c6400_post_proc.c

📁 Samsung公司S3C6400芯片的BSP源码包
💻 C
📖 第 1 页 / 共 2 页
字号:
	default:
		POST_ERR((_T("[POST:ERR] Post_set_mode() : Unknown Source Type %d)\n\r"), SrcType));
		error = POST_ERROR_ILLEGAL_PARAMETER;
		break;
	}

	switch(DstType)
	{
	case POST_DST_RGB16:
		g_pPostReg->MODE |= OUTFMT_RGB | OUTRGB_RGB565;
		break;
	case POST_DST_RGB24:
		g_pPostReg->MODE |= OUTFMT_RGB | OUTRGB_RGB24;
		break;
	case POST_DST_YUV420:
		g_pPostReg->MODE |= OUTFMT_YUV | OUTYUV_YUV420;
		break;
	case POST_DST_YUV422_YCBYCR:
		g_pPostReg->MODE |= OUTFMT_YUV | OUTYUV_YUV422 | OUTYUV_YCBYCR;
		break;
	case POST_DST_YUV422_CBYCRY:
		g_pPostReg->MODE |= OUTFMT_YUV | OUTYUV_YUV422 | OUTYUV_CBYCRY;
		break;
	case POST_DST_YUV422_YCRYCB:
		g_pPostReg->MODE |= OUTFMT_YUV | OUTYUV_YUV422 | OUTYUV_YCRYCB;
		break;
	case POST_DST_YUV422_CRYCBY:
		g_pPostReg->MODE |= OUTFMT_YUV | OUTYUV_YUV422 | OUTYUV_CRYCBY;
		break;
	case POST_DST_FIFO_YUV444:
		g_pPostReg->MODE |= OUTFMT_YUV | FIFO_OUT_ENABLE;
		break;
	case POST_DST_FIFO_RGB888:
		g_pPostReg->MODE |= OUTFMT_RGB | FIFO_OUT_ENABLE;
		break;
	default:
		POST_ERR((_T("[POST:ERR] Post_set_mode() : Unknown Destination Type %d)\n\r"), DstType));
		error = POST_ERROR_ILLEGAL_PARAMETER;
		break;
	}

	POST_MSG((_T("[POST]--Post_set_mode() : %d\n\r"), error));

	return error;
}

static POST_ERROR Post_set_source_size(unsigned int BaseWidth, unsigned int BaseHeight, unsigned int Width, unsigned int Height, unsigned int OffsetX, unsigned int OffsetY)
{
	POST_ERROR error = POST_SUCCESS;

	POST_MSG((_T("[POST]++Post_set_source_size(%d, %d, %d, %d, %d, %d)\n\r"), BaseWidth, BaseHeight, Width, Height, OffsetX, OffsetY));

	g_PostConfig.SrcBaseWidth = BaseWidth;
	g_PostConfig.SrcBaseHeight = BaseHeight;
	g_PostConfig.SrcWidth = Width;
	g_PostConfig.SrcHeight = Height;
	g_PostConfig.SrcOffsetX = OffsetX;
	g_PostConfig.SrcOffsetY = OffsetY;

	// TODO: Check Validity

	POST_MSG((_T("[POST]--Post_set_source_size() : %d\n\r"), error));

	return error;
}

static POST_ERROR Post_set_destination_size(unsigned int BaseWidth, unsigned int BaseHeight, unsigned int Width, unsigned int Height, unsigned int OffsetX, unsigned int OffsetY)
{
	POST_ERROR error = POST_SUCCESS;

	POST_MSG((_T("[POST]++Post_set_destination_size(%d, %d, %d, %d, %d, %d)\n\r"), BaseWidth, BaseHeight, Width, Height, OffsetX, OffsetY));

	g_PostConfig.DstBaseWidth = BaseWidth;
	g_PostConfig.DstBaseHeight = BaseHeight;
	g_PostConfig.DstWidth = Width;
	g_PostConfig.DstHeight = Height;
	g_PostConfig.DstOffsetX = OffsetX;
	g_PostConfig.DstOffsetY = OffsetY;

	// TODO: Check Validity

	POST_MSG((_T("[POST]--Post_set_destination_size() : %d\n\r"), error));

	return error;
}

static POST_ERROR Post_get_prescaler_horizontal_value(unsigned int *PrescalerRatio, unsigned int *MainShift)
{
	POST_ERROR error = POST_SUCCESS;

	if (g_PostConfig.SrcWidth >= 64*g_PostConfig.DstWidth)
	{
		POST_ERR((_T("[POST:ERR] Post_get_prescaler_horizontal_value() : Out of Range\r\n")));
		error = POST_ERROR_PRESCALER_OUT_OF_SCALE_RANGE;
	}
	else if (g_PostConfig.SrcWidth >= 32*g_PostConfig.DstWidth)
	{
		*PrescalerRatio = 32;
		*MainShift = 5;
	}
	else if (g_PostConfig.SrcWidth >= 16*g_PostConfig.DstWidth)
	{
		*PrescalerRatio = 16;
		*MainShift = 4;
	}
	else if (g_PostConfig.SrcWidth >= 8*g_PostConfig.DstWidth)
	{
		*PrescalerRatio = 8;
		*MainShift = 3;
	}
	else if (g_PostConfig.SrcWidth >= 4*g_PostConfig.DstWidth)
	{
		*PrescalerRatio = 4;
		*MainShift = 2;
	}
	else if (g_PostConfig.SrcWidth >= 2*g_PostConfig.DstWidth)
	{
		*PrescalerRatio = 2;
		*MainShift = 1;
	}
	else
	{
		*PrescalerRatio = 1;
		*MainShift = 0;
	}

	return error;
}

static POST_ERROR Post_get_prescaler_vertical_value(unsigned int *PrescalerRatio, unsigned int *MainShift)
{
	POST_ERROR error = POST_SUCCESS;

	if (g_PostConfig.SrcHeight >= 64*g_PostConfig.DstHeight)
	{
		POST_ERR((_T("[POST:ERR] Post_get_prescaler_vertical_value() : Out of Range\r\n")));
		error = POST_ERROR_PRESCALER_OUT_OF_SCALE_RANGE;
	}
	else if (g_PostConfig.SrcHeight >= 32*g_PostConfig.DstHeight)
	{
		*PrescalerRatio = 32;
		*MainShift = 5;
	}
	else if (g_PostConfig.SrcHeight >= 16*g_PostConfig.DstHeight)
	{
		*PrescalerRatio = 16;
		*MainShift = 4;
	}
	else if (g_PostConfig.SrcHeight >= 8*g_PostConfig.DstHeight)
	{
		*PrescalerRatio = 8;
		*MainShift = 3;
	}
	else if (g_PostConfig.SrcHeight >= 4*g_PostConfig.DstHeight)
	{
		*PrescalerRatio = 4;
		*MainShift = 2;
	}
	else if (g_PostConfig.SrcHeight >= 2*g_PostConfig.DstHeight)
	{
		*PrescalerRatio = 2;
		*MainShift = 1;
	}
	else
	{
		*PrescalerRatio = 1;
		*MainShift = 0;
	}

	return error;
}

static POST_ERROR Post_update_condition(void)
{
	POST_ERROR error = POST_SUCCESS;

	unsigned int PreHozRatio, PreVerRatio;
	unsigned int MainHozShift, MainVerShift;

	POST_MSG((_T("[POST]++Post_update_condition()\n\r")));

	error = Post_get_prescaler_horizontal_value(&PreHozRatio, &MainHozShift);
	if (error == POST_SUCCESS)
	{
		error = Post_get_prescaler_vertical_value(&PreVerRatio, &MainVerShift);
		if (error == POST_SUCCESS)
		{
			g_pPostReg->PreScale_Ratio = PRESCALE_V_RATIO(PreVerRatio) | PRESCALE_H_RATIO(PreHozRatio);
			g_pPostReg->PreScaleImgSize = PRESCALE_WIDTH(g_PostConfig.SrcWidth/PreHozRatio) | PRESCALE_HEIGHT(g_PostConfig.SrcHeight/PreVerRatio);
			g_pPostReg->SRCImgSize = SRC_WIDTH(g_PostConfig.SrcWidth) | SRC_HEIGHT(g_PostConfig.SrcHeight);
			g_pPostReg->MainScale_H_Ratio = MAINSCALE_H_RATIO((g_PostConfig.SrcWidth<<8)/(g_PostConfig.DstWidth<<MainHozShift));
			g_pPostReg->MainScale_V_Ratio = MAINSCALE_V_RATIO((g_PostConfig.SrcHeight<<8)/(g_PostConfig.DstHeight<<MainVerShift));
			g_pPostReg->DSTImgSize = DST_WIDTH(g_PostConfig.DstWidth) | DST_HEIGHT(g_PostConfig.DstHeight);
			g_pPostReg->PreScale_SHFactor = PRESCALE_SHFACTOR(10-(MainHozShift+MainVerShift));
		}
	}

	POST_MSG((_T("[POST]--Post_update_condition() : %d\n\r"), error));

	return error;
}

static POST_ERROR Post_set_dma_address(POST_DMA_ADDRESS DMA, unsigned int AddrY, unsigned int AddrCb, unsigned int AddrCr)
{
	POST_ERROR error = POST_SUCCESS;

	DWORD Format;
	unsigned int AddrStart_Y=0, AddrStart_Cb=0, AddrStart_Cr=0;
	unsigned int AddrEnd_Y=0, AddrEnd_Cb=0, AddrEnd_Cr=0;
	unsigned int Offset_Y=0, Offset_Cb=0, Offset_Cr=0;

	POST_MSG((_T("[POST]++Post_set_dma_address(%d, 0x%08x, 0x%08x, 0x%08x)\n\r"), DMA, AddrY, AddrCb, AddrCr));

	if (DMA == POST_SRC_ADDRESS || DMA == POST_NEXT_SRC_ADDRESS)
	{
		Format = g_PostConfig.SrcType;
	}
	else if (DMA == POST_DST_ADDRESS || DMA == POST_NEXT_DST_ADDRESS)
	{
		Format = g_PostConfig.DstType;
	}
	else
	{
		POST_ERR((_T("[POST:ERR] Post_set_dma_address() : Unknown DMA address %d\r\n"), DMA));
		error = POST_ERROR_ILLEGAL_PARAMETER;
	}

	switch(Format)
	{
	case POST_SRC_RGB16:			// POST_DST_RGB16
	case POST_SRC_YUV422_YCBYCR:	// POST_DST_YUV422_YCBYCR
	case POST_SRC_YUV422_CBYCRY:	// POST_DST_YUV422_CBYCRY
	case POST_SRC_YUV422_YCRYCB:	// POST_DST_YUV422_YCRYCB
	case POST_SRC_YUV422_CRYCBY:	// POST_DST_YUV422_CRYCBY
		Offset_Y = (g_PostConfig.SrcBaseWidth - g_PostConfig.SrcWidth)*2;
		AddrStart_Y = AddrY+(g_PostConfig.SrcBaseWidth*g_PostConfig.SrcOffsetY)*2 + g_PostConfig.SrcOffsetX*2;
		AddrEnd_Y = AddrStart_Y+(g_PostConfig.SrcWidth*g_PostConfig.SrcHeight)*2 + (g_PostConfig.SrcHeight-1)*Offset_Y;
		break;
	case POST_SRC_RGB24:			// POST_DST_RGB24
		Offset_Y = (g_PostConfig.SrcBaseWidth - g_PostConfig.SrcWidth)*4;
		AddrStart_Y = AddrY+(g_PostConfig.SrcBaseWidth*g_PostConfig.SrcOffsetY)*4 + g_PostConfig.SrcOffsetX*4;
		AddrEnd_Y = AddrStart_Y+(g_PostConfig.SrcWidth*g_PostConfig.SrcHeight)*4 + (g_PostConfig.SrcHeight-1)*Offset_Y;
		break;
	case POST_SRC_YUV420:			// POST_DST_YUV420
		Offset_Y = (g_PostConfig.SrcBaseWidth - g_PostConfig.SrcWidth);
		Offset_Cb = Offset_Y/2;
		Offset_Cr = Offset_Y/2;
		AddrStart_Y = AddrY+(g_PostConfig.SrcBaseWidth*g_PostConfig.SrcOffsetY) + g_PostConfig.SrcOffsetX;
		AddrEnd_Y = AddrStart_Y+(g_PostConfig.SrcWidth*g_PostConfig.SrcHeight) + (g_PostConfig.SrcHeight-1)*Offset_Y;
		AddrStart_Cb = AddrCb+(g_PostConfig.SrcBaseWidth/2)*(g_PostConfig.SrcOffsetY/2) + g_PostConfig.SrcOffsetX/2;
		AddrEnd_Cb = AddrStart_Cb+(g_PostConfig.SrcWidth/2)*(g_PostConfig.SrcHeight/2) + (g_PostConfig.SrcHeight/2-1)*Offset_Cb;
		AddrStart_Cr = AddrCr+(g_PostConfig.SrcBaseWidth/2)*(g_PostConfig.SrcOffsetY/2) + g_PostConfig.SrcOffsetX/2;
		AddrEnd_Cr = AddrStart_Cr+(g_PostConfig.SrcWidth/2)*(g_PostConfig.SrcHeight/2) + (g_PostConfig.SrcHeight/2-1)*Offset_Cr;
		break;
	default:
		POST_ERR((_T("[POST:ERR] Post_set_dma_address() : Unknown Format %d\r\n"), Format));
		error = POST_ERROR_ILLEGAL_PARAMETER;
	}

	switch(DMA)
	{
	case POST_SRC_ADDRESS:
		g_pPostReg->ADDRStart_Y = AddrStart_Y;
		g_pPostReg->ADDREnd_Y = AddrEnd_Y;
		g_pPostReg->ADDRStart_Cb = AddrStart_Cb;
		g_pPostReg->ADDREnd_Cb = AddrEnd_Cb;
		g_pPostReg->ADDRStart_Cr = AddrStart_Cr;
		g_pPostReg->ADDREnd_Cr = AddrEnd_Cr;
		g_pPostReg->Offset_Y= Offset_Y;
		g_pPostReg->Offset_Cb= Offset_Cb;
		g_pPostReg->Offset_Cr= Offset_Cr;
		break;
	case POST_NEXT_SRC_ADDRESS:
		g_pPostReg->MODE_2 |= ADDR_CHANGE_DISABLE;	// for Safe
		g_pPostReg->NxtADDRStart_Y = AddrStart_Y;
		g_pPostReg->NxtADDREnd_Y = AddrEnd_Y;
		g_pPostReg->NxtADDRStart_Cb = AddrStart_Cb;
		g_pPostReg->NxtADDREnd_Cb = AddrEnd_Cb;
		g_pPostReg->NxtADDRStart_Cr = AddrStart_Cr;
		g_pPostReg->NxtADDREnd_Cr = AddrEnd_Cr;
		g_pPostReg->MODE_2 &= ~ADDR_CHANGE_DISABLE;	// for Safe
		break;
	case POST_DST_ADDRESS:
		g_pPostReg->ADDRStart_RGB = AddrStart_Y;
		g_pPostReg->ADDREnd_RGB = AddrEnd_Y;
		g_pPostReg->ADDRStart_oCb = AddrStart_Cb;
		g_pPostReg->ADDREnd_oCb = AddrEnd_Cb;
		g_pPostReg->ADDRStart_oCr = AddrStart_Cr;
		g_pPostReg->ADDREnd_oCr = AddrEnd_Cr;
		g_pPostReg->Offset_RGB= Offset_Y;
		g_pPostReg->Offset_oCb= Offset_Cb;
		g_pPostReg->Offset_oCr= Offset_Cr;
		break;
	case POST_NEXT_DST_ADDRESS:
		g_pPostReg->MODE_2 |= ADDR_CHANGE_DISABLE;	// for Safe
		g_pPostReg->NxtADDRStart_RGB = AddrStart_Y;
		g_pPostReg->NxtADDREnd_RGB = AddrEnd_Y;
		g_pPostReg->NxtADDRStart_oCb = AddrStart_Cb;
		g_pPostReg->NxtADDREnd_oCb = AddrEnd_Cb;
		g_pPostReg->NxtADDRStart_oCr = AddrStart_Cr;
		g_pPostReg->NxtADDREnd_oCr = AddrEnd_Cr;
		g_pPostReg->MODE_2 &= ~ADDR_CHANGE_DISABLE;	// for Safe
		break;
	}

	POST_MSG((_T("[POST]--Post_set_dma_address() : %d\n\r"), error));

	return error;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -