s3c6410_image_rotator.c

来自「SAMSUNG S3C6410 CPU BSP for winmobile6」· C语言 代码 · 共 234 行

C
234
字号
#include <windows.h>
#include <bsp_cfg.h>
#include <s3c6410.h>
#include "s3c6410_image_rotator.h"
#include "s3c6410_image_rotator_macro.h"

#ifdef	REMOVE_BEFORE_RELEASE
#define ROT_MSG(x)
#define ROT_INF(x)
#define ROT_ERR(x)	RETAILMSG(TRUE, x)
#else
//#define ROT_MSG(x)	RETAILMSG(TRUE, x)
#define ROT_MSG(x)
#define ROT_INF(x)	RETAILMSG(TRUE, x)
//#define ROT_INF(x)
#define ROT_ERR(x)	RETAILMSG(TRUE, x)
//#define ROT_ERR(x)
#endif

static volatile S3C6410_ROTATOR_REG *g_pRotatorReg = NULL;

ROT_ERROR Rotator_initialize_register_address(void *pRotatorReg)
{
	ROT_ERROR error = ROT_SUCCESS;

	ROT_MSG((_T("[ROT] ++Rotator_initialize_register_address(0x%08x)\n\r"), pRotatorReg));

	if (pRotatorReg == NULL)
	{
		ROT_ERR((_T("[ROT:ERR] Rotator_initialize_register_address() : NULL pointer parameter\n\r")));
		error = ROT_ERROR_NULL_PARAMETER;
	}
	else
	{
		g_pRotatorReg = (S3C6410_ROTATOR_REG *)pRotatorReg;
		ROT_INF((_T("[ROT:INF] g_pRotatorReg = 0x%08x\n\r"), g_pRotatorReg));
	}

	ROT_MSG((_T("[ROT] --Rotator_initialize_register_address() : %d\n\r"), error));

	return error;
}

ROT_ERROR Rotator_initialize(ROTATOR_IMAGE_FORMAT eFormat, ROTATOR_OPERATION_TYPE eOperation, unsigned int uiSrcWidth, unsigned int uiSrcHeight)
{
	ROT_ERROR error = ROT_SUCCESS;

	ROT_MSG((_T("[ROT] ++Rotator_initialize(%d, %d, %d, %d)\n\r"), eFormat, eOperation, uiSrcWidth, uiSrcHeight));

	g_pRotatorReg->CTRLCFG = g_pRotatorReg->CTRLCFG & INT_ENABLE;		// Keep Interrupt Enable Bit and Clear Others

	switch(eFormat)
	{
	case ROT_FORMAT_YUV420:
		g_pRotatorReg->CTRLCFG |= IMG_FORMAT_YUV420;
		break;
	case ROT_FORMAT_YUV422:
		g_pRotatorReg->CTRLCFG |= IMG_FORMAT_YUV422;
		break;
	case ROT_FORMAT_RGB565:
		g_pRotatorReg->CTRLCFG |= IMG_FORMAT_RGB565;
		break;
	case ROT_FORMAT_RGB888:
		g_pRotatorReg->CTRLCFG |= IMG_FORMAT_RGB888;
		break;
	default:
		ROT_ERR((_T("[ROT:ERR] Rotator_initialize() : Unknown Image Foramt [%d]\n\r"), eFormat));
		error = ROT_ERROR_ILLEGAL_PARAMETER;
		break;
	}

	switch(eOperation)
	{
	case ROT_OP_ROTATE_90:
		g_pRotatorReg->CTRLCFG |= ROTATE_DEGREE_90;
		break;
	case ROT_OP_ROTATE_180:
		g_pRotatorReg->CTRLCFG |= ROTATE_DEGREE_180;
		break;
	case ROT_OP_ROTATE_270:
		g_pRotatorReg->CTRLCFG |= ROTATE_DEGREE_270;
		break;
	case ROT_OP_FLIP_VERTICAL:
		g_pRotatorReg->CTRLCFG |= FLIP_VERTICAL;
		break;
	case ROT_OP_FLIP_HORIZONTAL:
		g_pRotatorReg->CTRLCFG |= FLIP_HORIZONTAL;
		error = ROT_ERROR_ILLEGAL_PARAMETER;
		break;
	default:
		ROT_ERR((_T("[ROT:ERR] Rotator_initialize() : Unknown Operation Type [%d]\n\r"), eOperation));
		break;
	}

	g_pRotatorReg->SrcSizeReg = VERTICAL_SIZE(uiSrcHeight) | HORIZONTAL_SIZE(uiSrcWidth);

	ROT_MSG((_T("[ROT] --Rotator_initialize() : %d\n\r"), error));

	return error;
}

ROT_ERROR Rotator_set_source_buffer(unsigned int AddrRGBY, unsigned int AddrCb, unsigned int AddrCr)
{
	ROT_ERROR error = ROT_SUCCESS;

	ROT_MSG((_T("[ROT] ++Rotator_set_source_buffer(0x%08x, 0x%08x, 0x%08x)\n\r"), AddrRGBY, AddrCb, AddrCr));

	if ((AddrRGBY % 0x4)
		|| (AddrCb % 0x4)
		|| (AddrCr % 0x4))
	{
		ROT_ERR((_T("[ROT:ERR] Rotator_set_source_buffer() : Source Address is Not Aligned [0x%08x, 0x%08x, 0x%08x]\n\r"), AddrRGBY, AddrCb, AddrCr));
		error = ROT_ERROR_ILLEGAL_PARAMETER;
	}
	else
	{
		g_pRotatorReg->SrcAddrReg0 = ADDRESS_RGB_Y(AddrRGBY);
		g_pRotatorReg->SrcAddrReg1 = ADDRESS_RGB_Y(AddrCb);
		g_pRotatorReg->SrcAddrReg2 = ADDRESS_RGB_Y(AddrCr);
	}

	ROT_MSG((_T("[ROT] --Rotator_set_source_buffer() : %d\n\r"), error));

	return error;
}

ROT_ERROR Rotator_set_destination_buffer(unsigned int AddrRGBY, unsigned int AddrCb, unsigned int AddrCr)
{
	ROT_ERROR error = ROT_SUCCESS;

	ROT_MSG((_T("[ROT] ++Rotator_set_destination_buffer(0x%08x, 0x%08x, 0x%08x)\n\r"), AddrRGBY, AddrCb, AddrCr));

	if ((AddrRGBY % 0x4)
		|| (AddrCb % 0x4)
		|| (AddrCr % 0x4))
	{
		ROT_ERR((_T("[ROT:ERR] Rotator_set_destination_buffer() : Destination Address is Not Aligned [0x%08x, 0x%08x, 0x%08x]\n\r"), AddrRGBY, AddrCb, AddrCr));
		error = ROT_ERROR_ILLEGAL_PARAMETER;
	}
	else
	{
		g_pRotatorReg->DstAddrReg0 = ADDRESS_RGB_Y(AddrRGBY);
		g_pRotatorReg->DstAddrReg1 = ADDRESS_RGB_Y(AddrCb);
		g_pRotatorReg->DstAddrReg2 = ADDRESS_RGB_Y(AddrCr);
	}

	ROT_MSG((_T("[ROT] --Rotator_set_destination_buffer() : %d\n\r"), error));

	return error;
}

void Rotator_start(void)
{
	ROT_MSG((_T("[ROT] Rotator_start()\n\r")));

	g_pRotatorReg->CTRLCFG |= ROTATOR_START;
}

void Rotator_stop(void)
{
	ROT_MSG((_T("[ROT] Rotator_stop()\n\r")));

	g_pRotatorReg->CTRLCFG &= ~ROTATOR_START;
}

void Rotator_enable_interrupt(void)
{
	ROT_MSG((_T("[ROT] Rotator_enable_interrupt()\n\r")));

	g_pRotatorReg->CTRLCFG |= INT_ENABLE;
}

void Rotator_disable_interrupt(void)
{
	ROT_MSG((_T("[ROT] Rotator_disable_interrupt()\n\r")));

	g_pRotatorReg->CTRLCFG &= ~INT_ENABLE;
}

BOOL Rotator_clear_interrupt_pending(void)
{
	unsigned int uiStatusValue;

	ROT_MSG((_T("[ROT] Rotator_clear_interrupt_pending()\n\r")));

	uiStatusValue = g_pRotatorReg->STATCFG;

	if (uiStatusValue & INT_PENDING)
	{
		return TRUE;		// Interrupt Pended and Cleared
	}
	else
	{
		return FALSE;	// Interrupt Not Pended
	}
}

ROT_ERROR Rotator_get_status(tRotatorStatus *pStatus)
{
	unsigned int uiStatusValue;

	ROT_ERROR error = ROT_SUCCESS;

	ROT_MSG((_T("[ROT] ++Rotator_get_status(0x%08x)\n\r"), pStatus));

	if (pStatus == NULL)
	{
		ROT_ERR((_T("[ROT:ERR] Rotator_get_status() : Null Parameter for pStatus\n\r")));
		error = ROT_ERROR_NULL_PARAMETER;
	}
	else
	{
		uiStatusValue = g_pRotatorReg->STATCFG;

		pStatus->uiCurLineNumber = CUR_LINE_MASK(uiStatusValue);

		if (uiStatusValue & INT_PENDING)
		{
			pStatus->bIntPending = TRUE;
		}
		else
		{
			pStatus->bIntPending = FALSE;
		}

		pStatus->eOpStatus = uiStatusValue&0x3;
	}

	ROT_MSG((_T("[ROT] --Rotator_get_status() : %d\n\r"), error));

	return error;
}

⌨️ 快捷键说明

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