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

📄 s3c6400_camera.cpp

📁 Samsung公司S3C6400芯片的BSP源码包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
		    pBufInfo[i].VirtAddr = (DWORD)pPreviewVirtAddr + size*i;
		    pBufInfo[i].size = size;
		    pBufInfo[i].pY = (DWORD*)((DWORD)(PhysPreviewAddr.LowPart) + size*i);
		}

		if(OUTPUT_CODEC_YCBCR420 == Preview_Buffer.Format)
		{
			sizeY = Preview_Buffer.Width*Preview_Buffer.Height;
			sizeC = Preview_Buffer.Width*Preview_Buffer.Height/4;
			for(i=0;i<MAX_HW_FRAMES;i++)
			{
			    pBufInfo[i].pCb = (DWORD*)((DWORD)pBufInfo[i].pY + sizeY);
			    pBufInfo[i].pCr = (DWORD*)((DWORD)pBufInfo[i].pCb + sizeC);
			}
		}
    }
    else
    {
    	return FALSE;
    }

	RETAILMSG(CAM_INOUT,(TEXT("------------------CameraPrepareBuffer\n")));
	return TRUE;
}


int 	CameraDeallocateBuffer(int BufferType)
{
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraDeallocateBuffer\n")));

	RETAILMSG(CAM_INOUT,(TEXT("------------------CameraDeallocateBuffer\n")));
	return TRUE;
}

int 	CameraSetFormat(UINT32 width, UINT32 height, int format, int BufferType)
{
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraSetFormat\n")));
    if(BufferType == VIDEO_CAPTURE_BUFFER)
    {
    	Video_Buffer.Width = width;
    	Video_Buffer.Height = height;
    	Video_Buffer.Format = format;
 		//SetCodecRegister(width, height, format);
    }
    else if(BufferType == STILL_CAPTURE_BUFFER)
    {
    	Still_Buffer.Width = width;
    	Still_Buffer.Height = height;
    	Still_Buffer.Format = format;
    	//SetCodecRegister(width, height, format);
    }
    else if(BufferType == PREVIEW_CAPTURE_BUFFER)
    {
    	Preview_Buffer.Width = width;
    	Preview_Buffer.Height = height;
    	Preview_Buffer.Format = format;
   		//SetPreviewRegister(width, height, format);
    }
    else
    {
    	return FALSE;
    }
	RETAILMSG(CAM_INOUT,(TEXT("------------------CameraSetFormat\n")));
	return TRUE;
}


void CameraSetCodecRegister(UINT32 width, UINT32 height, int Format)		// set codec register
{	
	MODULE_DESCRIPTOR value;
	BYTE	Out422_Co, Cpt_CoDMA_RGBFMT;
	UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;	
	
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetCodecRegister  Width=%d  Height=%d  Format=%d\n"),width,height,Format));
	ModuleGetFormat(value);
	
	switch(Format)
	{
	case OUTPUT_CODEC_YCBCR422:
		Out422_Co = 2;		// we don't support Non-interleave 4:2:2
		Cpt_CoDMA_RGBFMT = 0;
		CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
		MainBurstSizeY /= 2;
		RemainedBurstSizeY /= 2;
		MainBurstSizeC = MainBurstSizeY/2;
		RemainedBurstSizeC = RemainedBurstSizeY/2;		
		//CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);		
		break;
	case OUTPUT_CODEC_RGB16:
		Out422_Co = 3;
		Cpt_CoDMA_RGBFMT = 0;	
		CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);		
		MainBurstSizeC = 0;
		RemainedBurstSizeC = 0;
		break;
	case OUTPUT_CODEC_RGB24:
		Out422_Co = 3;
		Cpt_CoDMA_RGBFMT = 2;		
		CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);	
		MainBurstSizeC = 0;
		RemainedBurstSizeC = 0;			
		break;
	case OUTPUT_CODEC_YCBCR420:
	default:
		Out422_Co = 0;
		Cpt_CoDMA_RGBFMT = 0;
		CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
		CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);			
		break;
	}	
	

	//CameraClockOn(TRUE);
	s6400CAM->CICOTRGFMT= (Out422_Co<<29)|(width<<16)|(height);
	s6400CAM->CICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4)|(0);
	s6400CAM->CICOSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_CoDMA_RGBFMT<<11)|(0<<10);	
	
	CameraSetScaler(width,height,CODEC_PATH);

	s6400CAM->CICOTAREA=width*height;
	
	//s6400CAM->CIIMGCPT ;
	//CameraClockOn(FALSE);
	RETAILMSG(CAM_INOUT,(TEXT("------------------SetCodecRegister\n")));
}

void CameraSetPreviewRegister(UINT32 width, UINT32 height, int Format) 	// set preview register
{
	MODULE_DESCRIPTOR value;
	BYTE   Out422_Pr, Cpt_PrDMA_RGBFMT;
	UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;		
		
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetPreviewRegister\n")));
	ModuleGetFormat(value);
	
	switch(Format)
	{
	case OUTPUT_CODEC_YCBCR422:
		Out422_Pr = 2;		// we don't support Non-interleave 4:2:2
		Cpt_PrDMA_RGBFMT = 0;
		CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
		CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);		
		break;
	case OUTPUT_CODEC_RGB16:
		Out422_Pr = 3;
		Cpt_PrDMA_RGBFMT = 0;	
		CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);		
		MainBurstSizeC = 0;
		RemainedBurstSizeC = 0;
		break;
	case OUTPUT_CODEC_RGB24:
		Out422_Pr = 3;
		Cpt_PrDMA_RGBFMT = 2;		
		CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);	
		MainBurstSizeC = 0;
		RemainedBurstSizeC = 0;			
		break;
	case OUTPUT_CODEC_YCBCR420:
	default:
		Out422_Pr = 0;
		Cpt_PrDMA_RGBFMT = 0;
		CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
		CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);			
		break;
	}	
	

	//CameraClockOn(TRUE);

	s6400CAM->CIPRTRGFMT= (Out422_Pr<<29)|(width<<16)|(height);
	s6400CAM->CIPRCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4);
	s6400CAM->CIPRSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_PrDMA_RGBFMT<<11)|(0<<10);	
	
	CameraSetScaler(width,height,PREVIEW_PATH);
    
	s6400CAM->CIPRTAREA= width*height;	
	
	s6400CAM->CICPTSEQ = 0xFFFFFFFF;
	s6400CAM->CIMSCTRL = 0;	
	s6400CAM->CIPRSCOSY = 0;
	s6400CAM->CIPRSCOSCB = 0;
	s6400CAM->CIPRSCOSCR = 0;
	
	//CameraClockOn(FALSE);	
	RETAILMSG(CAM_INOUT,(TEXT("------------------SetPreviewRegister\n")));
}

/********************************************************
 CalculateBurstSize - Calculate the busrt lengths

 Description:
 - dstHSize: the number of the byte of H Size.

*/
void CalculateBurstSize(unsigned int hSize,unsigned int *mainBurstSize,unsigned int *remainedBurstSize)
{
	unsigned int tmp;
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculateBurstSize\n")));
	tmp=(hSize/4)%16;
	switch(tmp) {
		case 0:
			*mainBurstSize=16;
			*remainedBurstSize=16;
			break;
		case 4:
			*mainBurstSize=16;
			*remainedBurstSize=4;
			break;
		case 8:
			*mainBurstSize=16;
			*remainedBurstSize=8;
			break;
		default:
			tmp=(hSize/4)%8;
			switch(tmp) {
				case 0:
					*mainBurstSize=8;
					*remainedBurstSize=8;
					break;
				case 4:
					*mainBurstSize=8;
					*remainedBurstSize=4;
				default:
					*mainBurstSize=4;
					tmp=(hSize/4)%4;
					*remainedBurstSize= (tmp) ? tmp: 4;
					break;
			}
			break;
	}
	RETAILMSG(CAM_INOUT,(TEXT("------------------CalculateBurstSize\n")));
}

/********************************************************
 CalculatePrescalerRatioShift - none

 Description:
 - none

*/
void CalculatePrescalerRatioShift(unsigned int SrcSize, unsigned int DstSize, unsigned int *ratio,unsigned int *shift)
{
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculatePrescalerRatioShift\n")));
	if(SrcSize>=64*DstSize) {
//		Uart_Printf("ERROR: out of the prescaler range: SrcSize/DstSize = %d(< 64)\r\n",SrcSize/DstSize);
		while(1);
	}
	else if(SrcSize>=32*DstSize) {
		*ratio=32;
		*shift=5;
	}
	else if(SrcSize>=16*DstSize) {
		*ratio=16;
		*shift=4;
	}
	else if(SrcSize>=8*DstSize) {
		*ratio=8;
		*shift=3;
	}
	else if(SrcSize>=4*DstSize) {
		*ratio=4;
		*shift=2;
	}
	else if(SrcSize>=2*DstSize) {
		*ratio=2;
		*shift=1;
	}
	else {
		*ratio=1;
		*shift=0;
	}
	RETAILMSG(CAM_INOUT,(TEXT("------------------CalculatePrescalerRatioShift\n")));
}

UINT32 CalculateBufferSize(UINT32 width, UINT32 height, int format)
{
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CalculateBufferSize\n")));
	UINT32 size=0;
	switch(format)
	{
	case OUTPUT_CODEC_YCBCR422:
		size = width*height + width*height/2*2;
		break;
	case OUTPUT_CODEC_YCBCR420:
		size = width*height + width*height/4*2;
		break;
	case OUTPUT_CODEC_RGB24:
		size = width*height*4;
		break;
	case OUTPUT_CODEC_RGB16:
		size = width*height*2;
		break;
	}

	RETAILMSG(CAM_INOUT,(TEXT("------------------CalculateBufferSize\n")));
	return size;
}

int		CameraGetCurrentFrameNum(int BufferType)
{
	int temp;
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraGetCurrentFrameNum\n")));
	if(VIDEO_CAPTURE_BUFFER == BufferType)
	{
		temp = (s6400CAM->CICOSTATUS>>26)&3;
		temp = (temp + 2) % 4;
	}
	else if(STILL_CAPTURE_BUFFER == BufferType)
	{
		temp = (s6400CAM->CICOSTATUS>>26)&3;
		temp = (temp + 2) % 4;
	}
	else if(PREVIEW_CAPTURE_BUFFER == BufferType)
	{
		temp = (s6400CAM->CIPRSTATUS>>26)&3;
		temp = (temp + 2) % 4;
	}
	RETAILMSG(CAM_INOUT,(TEXT("------------------CameraGetCurrentFrameNum\n")));
	return temp;
}

int 	CameraCaptureControl(int Format, BOOL on)
{
	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraCaptureControl\n")));
	//CameraClockOn(TRUE);
	s6400CAM->CIIMGCPT &= ~(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT);
	if(PREVIEW_CAPTURE_BUFFER == Format)
	{
		if(on)
		{
			RETAILMSG(CAM_MSG,(TEXT("Preview ON\n")));
			PreviewOn = TRUE;
			s6400CAM->CIPRSCCTRL |=(CAM_PVIEW_SACLER_START_BIT);
			s6400CAM->CIIMGCPT |= (CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT)|(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
			//s6400INT->INTSUBMSK &= ~(1<<IRQ_SUB_CAM_P);

			//while((s6400CAM->CIPRSTATUS&(1<<21)) == 0);
		}
		else
		{
			RETAILMSG(CAM_MSG,(TEXT("Preview OFF\n")));
			PreviewFrameCnt = 0;
			PreviewOn = FALSE;
			s6400CAM->CIPRSCCTRL &= ~(CAM_PVIEW_SACLER_START_BIT);
			s6400CAM->CIIMGCPT &= ~(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT);
			//s6400INT->INTMSK |= (1<<IRQ_SUB_CAM_P);

		}
	}
	else	// STILL, VIDEO
	{
		if(on)
		{
			RETAILMSG(CAM_MSG,(TEXT("Capture ON\n")));
			CodecOn = TRUE;
			if(STILL_CAPTURE_BUFFER == Format)
			{
				StillOn = TRUE;
				VideoOn = FALSE;
			}
			else
			{
				StillOn = FALSE;
				VideoOn = TRUE;
			}
			s6400CAM->CICOSCCTRL |=(CAM_CODEC_SACLER_START_BIT);
			s6400CAM->CIIMGCPT |=(CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT)|(CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT);
			//s6400INT->INTSUBMSK &= ~(1<<IRQ_SUB_CAM_C);

		}
		else
		{
			RETAILMSG(CAM_MSG,(TEXT("Capture OFF\n")));
			CodecOn = FALSE;
			StillOn = FALSE;
			VideoOn = FALSE;
			CodecFrameCnt = 0;
			s6400CAM->CICOSCCTRL &= ~(CAM_CODEC_SACLER_START_BIT);
			s6400CAM->CIIMGCPT &= ~((CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT));
			//s6400INT->INTSUBMSK |= (1<<IRQ_SUB_CAM_C);

		}
	}

	if(PreviewOn == FALSE && CodecOn == FALSE)	// All Off
	{
		s6400CAM->CIGCTRL &= ~(1<<20);
		//CameraClockOn(FALSE);
		//s6400INT->INTMSK |= (1<<IRQ_CAM);
	}
	else		// On
	{
		s6400CAM->CIGCTRL |= (1<<20);
		s6400CAM->CIIMGCPT |= (CAM_CAMIF_GLOBAL_CAPTURE_ENABLE_BIT);

		RETAILMSG(CAM_MSG,(TEXT("s6400CAM->CIPRSCCTRL=0x%08X\n"),s6400CAM->CIPRSCCTRL));
		RETAILMSG(CAM_MSG,(TEXT("s6400CAM->CIIMGCPT=0x%08X\n"),s6400CAM->CIIMGCPT));
		RETAILMSG(CAM_MSG,(TEXT("s6400CAM->CIPRSTATUS=0x%08X\n"),s6400CAM->CIPRSTATUS));
		//s6400INT->INTMSK &= ~(1<<IRQ_CAM);
	}

	RETAILMSG(CAM_INOUT,(TEXT("------------------CameraCaptureControl\n")));
	return TRUE;
}

int 	CameraSetRegisters(int format)
{
	int size;

    int sizeY,sizeC;

	RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++CameraSetRegisters\n")));

	//CameraClockOn(TRUE);
    if(format == VIDEO_CAPTURE_BUFFER)
    {
		size = Video_Buffer.FrameSize;
		s6400CAM->CICOYSA1 = (UINT32)(PhysCodecAddr.LowPart);
		s6400CAM->CICOYSA2 = s6400CAM->CICOYSA1 + size;
		s6400CAM->CICOYSA3 = s6400CAM->CICOYSA2 + size;
		s6400CAM->CICOYSA4 = s6400CAM->CICOYSA3 + size;

		if(OUTPUT_CODEC_YCBCR420 == Video_Buffer.Format)
		{
			sizeY = Video_Buffer.Width*Video_Buffer.Height;
			sizeC = Video_Buffer.Width*Video_Buffer.Height/4;
			/*
			s6400CAM->CICOCBSA1=s6400CAM->CICOYSA1+sizeY;
			s6400CAM->CICOCBSA2=s6400CAM->CICOYSA2+sizeY;
			s6400CAM->CICOCBSA3=s6400CAM->CICOYSA3+sizeY;
			s6400CAM->CICOCBSA4=s6400CAM->CICOYSA4+sizeY;

			s6400CAM->CICOCRSA1=s6400CAM->CICOCBSA1+sizeC;
			s6400CAM->CICOCRSA2=s6400CAM->CICOCBSA2+sizeC;
			s6400CAM->CICOCRSA3=s6400CAM->CICOCBSA3+sizeC;
			s6400CAM->CICOCRSA4=s6400CAM->CICOCBSA4+sizeC;		*/

			// In DSHOW  CB and Cr are changed.
			s6400CAM->CICOCRSA1=s6400CAM->CICOYSA1+sizeY;
			s6400CAM->CICOCRSA2=s6400CAM->CICOYSA2+sizeY;
			s6400CAM->CICOCRSA3=s6400CAM->CICOYSA3+sizeY;
			s6400CAM->CICOCRSA4=s6400CAM->CICOYSA4+sizeY;

			s6400CAM->CICOCBSA1=s6400CAM->CICOCRSA1+sizeC;
			s6400CAM->CICOCBSA2=s6400CAM->CICOCRSA2+sizeC;
			s6400CAM->CICOCBSA3=s6400CAM->CICOCRSA3+sizeC;
			s6400CAM->CICOCBSA4=s6400CAM->CICOCRSA4+sizeC;

⌨️ 快捷键说明

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