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

📄 camera.c

📁 三星 s3c6400测试代码
💻 C
📖 第 1 页 / 共 5 页
字号:
					Assert(0); //Unsupported output data format
			}
		}
		else // fifo output
		{
			oCim.m_uMainScalerCtrl |= 1<<26;
			Outp32(&CAMERAR->rCIPRSCCTRL, oCim.m_uMainScalerCtrl);
		}
		Outp32(&CAMERAR->rCIPRSCOSY, 0); // set preview scan line offset reg.
		Outp32(&CAMERAR->rCIPRSCOSCB, 0); 
		Outp32(&CAMERAR->rCIPRSCOSCR, 0); 
		Outp32(&CAMERAR->rCIPRCTRL, uDMAControl&0xFFFFFFFB);	// Clear LastIRQEn
	}
	else if (oCim.m_eProcessPath==C_PATH)
	{
		if (oCim.m_bIsScalerBypass != true)
		{
			Outp32(&CAMERAR->rCICOSCPRERATIO, uPreScalerCtrl1);		// set preview pre-scaler control reg. 1
			Outp32(&CAMERAR->rCICOSCPREDST, uPreScalerCtrl2);		// set preview pre-scaler control reg. 2
		}
		Outp32(&CAMERAR->rCICOTRGFMT, uTargetFmt);					// Set target format reg
//		Outp32(&CAMERAR->rCICOCTRL, uDMAControl|(1<<2));				// set DMA control reg, enable LastIRQEn
		
		if (oCim.m_eOutputPath==DMA)
		{
			Outp32(&CAMERAR->rCICOTAREA, oCim.m_uDstVsz*oCim.m_uDstHsz); 		// set preview DMA target area reg.
			Outp32(&CAMERAR->rCICOSCCTRL, oCim.m_uMainScalerCtrl);		// set preview main-scaler control reg.

			switch(oCim.m_eDstFmt)
			{
				case RGB24:
				case RGB18:
				case RGB16:
				case YCBYCR:
				case YCRYCB:
				case CBYCRY:
				case CRYCBY:
					Outp32(&CAMERAR->rCICOYSA1, uDstAddr0);
					Outp32(&CAMERAR->rCICOYSA2, uDstAddr1);
					Outp32(&CAMERAR->rCICOYSA3, uDstAddr0);
					Outp32(&CAMERAR->rCICOYSA4, uDstAddr1);
					break;
				case YC422:
				case YC420: 
					Outp32(&CAMERAR->rCICOYSA1, uDstAddr0);
					Outp32(&CAMERAR->rCICOCBSA1, uDstAddr0 + uOutYSz);
					Outp32(&CAMERAR->rCICOCRSA1, uDstAddr0 + uOutYSz + uOutCbCrSz);
						
					Outp32(&CAMERAR->rCICOYSA2, uDstAddr1);
					Outp32(&CAMERAR->rCICOCBSA2, uDstAddr1 + uOutYSz);
					Outp32(&CAMERAR->rCICOCRSA2, uDstAddr1 + uOutYSz + uOutCbCrSz);
						
					Outp32(&CAMERAR->rCICOYSA3, uDstAddr0);
					Outp32(&CAMERAR->rCICOCBSA3, uDstAddr0 + uOutYSz);
					Outp32(&CAMERAR->rCICOCRSA3, uDstAddr0 + uOutYSz + uOutCbCrSz);
					
					Outp32(&CAMERAR->rCICOYSA4, uDstAddr1);
					Outp32(&CAMERAR->rCICOCBSA4, uDstAddr1 + uOutYSz);
					Outp32(&CAMERAR->rCICOCRSA4, uDstAddr1 + uOutYSz + uOutCbCrSz);
					break;
				default:
					Assert(0); //Unsupported output data format
			}
		}
		else // Codec and fifo path
		{
			oCim.m_uMainScalerCtrl |= 1<<26;
			Outp32(&CAMERAR->rCICOSCCTRL, oCim.m_uMainScalerCtrl);
		} 

		Outp32(&CAMERAR->rCICOSCOSY, 0); // set codec scan line offset reg.
		Outp32(&CAMERAR->rCICOSCOSCB, 0); 
		Outp32(&CAMERAR->rCICOSCOSCR, 0); 
		Outp32(&CAMERAR->rCICOCTRL, uDMAControl&0xFFFFFFFB);	// Clear LastIRQEn
	}
	else
		Assert(0);
	
	// 12.Set image effect reg. 
	Outp32(&CAMERAR->rCIIMGEFF, 0);
	
}


//////////
// Function Name : CAMERA_InitPreviewPath0
// Function Description : Connection function Test -> SetBasicSFR Function
// Fifo input p_path dma output
// Input : 	
//	u32 uSrcCropStartX(Window Offset X1), u32 uSrcCropStartY(Window Offset X2), u32 uSrcCropHsz(Wanted Soruce Crop H Size), u32 uSrcCropVsz(Wanted Source Crop V Size), 
//	u32 uDisplayHsz(wanted display H size), u32 uDisplayVsz(wanted display V size), u32 uDstStX(display start x), u32 uDstStY(display Start Y), u32 uDstHsz(Destination H Size), u32 uDstVsz(Destination V Size), 
//	u32 uDstAddr0(Destination Address 0), u32 uDstAddr1(Destination Address 1), CSPACE eDstFmt(Destination Format), FLIP_DIR eFlip(FLIP mode), ROT_DEG eRotDeg(Rotation Mode)
// Output :    	None
void CAMERA_InitPreviewPath0(
	u32 uSrcCropStartX, u32 uSrcCropStartY, u32 uSrcCropHsz, u32 uSrcCropVsz, 
	u32 uDisplayHsz, u32 uDisplayVsz, u32 uDstStX, u32 uDstStY, u32 uDstHsz, u32 uDstVsz, 
	u32 uDstAddr0, u32 uDstAddr1, CSPACE eDstFmt, FLIP_DIR eFlip, ROT_DEG eRotDeg)
{
	CAMERA_ResetIp();

	CAMERA_SetBasicSfr(uSrcCropStartX, uSrcCropStartY, uSrcCropHsz, uSrcCropVsz, 
		uDstHsz, uDstVsz, uDstAddr0, uDstAddr1, eDstFmt, 
		FIFO, P_PATH, DMA, eFlip, eRotDeg);

	if (uDstHsz < uDisplayHsz && uDstVsz < uDisplayVsz)
		CAMERA_SetDstScanOffset(uDisplayHsz, uDisplayVsz, uDstStX, uDstStY, uDstAddr0, uDstAddr1);
	else if (uDstHsz > uDisplayHsz || uDstVsz > uDisplayVsz)
		{
			Assert(0);
		}
	else
		{}
}


//////////
// Function Name : CAMERA_InitPreviewPathToFifoOut0
// Function Description : 
// 					Fifo input p_path fifo output 
// Input : 	
//	u32 uSrcCropStartX(Window offset X1), u32 uSrcCropStartY(Window offset Y1), u32 uSrcCropHsz(Wanted source crop H size), u32 uSrcCropVsz(Wanted source srop V size), 
//	u32 uDstHsz(Destination H size), u32 uDstVsz(Destination V size), CSPACE eDstFmt(Destination format)
// Output :    	None
void CAMERA_InitPreviewPathToFifoOut0(
	u32 uSrcCropStartX, u32 uSrcCropStartY, u32 uSrcCropHsz, u32 uSrcCropVsz, 
	u32 uDstHsz, u32 uDstVsz, CSPACE eDstFmt)
{
	CAMERA_ResetIp();

	CAMERA_SetBasicSfr(uSrcCropStartX, uSrcCropStartY, uSrcCropHsz, uSrcCropVsz, 
		uDstHsz, uDstVsz, 0, 0, eDstFmt, FIFO, P_PATH, FIFO, FLIP_NO, ROT_0);
}



//////////
// Function Name : CAMERA_InitCodecPath0
// Function Description : camera input DMA codec path out function 
// Fifo input c_path dma output
// Input : 	
//		u32 uSrcCropStartX(Window offset X1), u32 uSrcCropStartY(Window offset Y1), u32 uSrcCropHsz(Wanted source H size), u32 uSrcCropVsz(Wanted source V size), 
//		u32 uDisplayHsz(Wanted display H size), u32 uDisplayVsz(Wanted display V size), u32 uDstStX(Display start X), u32 uDstStY(Display start Y), u32 uDstHsz(Destination H size), u32 uDstVsz(Destination V size), 
//		u32 uDstAddr0(Destination address 0), u32 uDstAddr1(Destination Address 1), CSPACE eDstFmt(Destination format), FLIP_DIR eFlip(FLIP mode), ROT_DEG eRotDeg(Rotation mode)
// Output :    	None
void CAMERA_InitCodecPath0(u32 uSrcCropStartX, u32 uSrcCropStartY, u32 uSrcCropHsz, u32 uSrcCropVsz, 
		u32 uDisplayHsz, u32 uDisplayVsz, u32 uDstStX, u32 uDstStY, u32 uDstHsz, u32 uDstVsz, 
		u32 uDstAddr0, u32 uDstAddr1, CSPACE eDstFmt, FLIP_DIR eFlip, ROT_DEG eRotDeg)
{
	CAMERA_ResetIp();

	CAMERA_SetBasicSfr(uSrcCropStartX, uSrcCropStartY, uSrcCropHsz, uSrcCropVsz,
		uDstHsz, uDstVsz, uDstAddr0, uDstAddr1, eDstFmt, 
		FIFO, C_PATH, DMA, eFlip, eRotDeg);
	
	if (uDstHsz < uDisplayHsz && uDstVsz < uDisplayVsz)
		CAMERA_SetDstScanOffset(uDisplayHsz, uDisplayVsz, uDstStX, uDstStY, uDstAddr0, uDstAddr1);
	else if (uDstHsz > uDisplayHsz || uDstVsz > uDisplayVsz)
	{
		Assert(0);
	}
	else
		{};
}


//////////
// Function Name : CAMERA_InitDmaInpath0
// Function Description : this function is Dma input image out through output DMA
// 					Dma input dma output
// Input : 	
//		u32 uSrcOrgHsz(Sourcr image H size), u32 uSrcOrgVsz(Source image V size), u32 uSrcCropStartX(window offset X1), u32 uSrcCropStartY(Window offset Y1), 
//		u32 uSrcCropHsz(Wanted source H size), u32 uSrcCropVsz(Wanted source V size), u32 uSrcAddr0(Source address 0), u32 uSrcAddr1(Source address 1), CSPACE eSrcFmt(Source format),
//		u32 uDisplayHsz, u32 uDisplayVsz, u32 uDstStX, u32 uDstStY, u32 uDstHsz, u32 uDstVsz, 
//		u32 uDstAddr0(Destination address 0), u32 uDstAddr1(Destination address 1), CSPACE eDstFmt(Destination format), FLIP_DIR eFlip(FLIP mode), ROT_DEG eRotDeg(Rotation mode), PROCESS_PATH ePathMode(Process mode)
// Output :    	None
void CAMERA_InitDmaInPath0(u32 uSrcOrgHsz, u32 uSrcOrgVsz, u32 uSrcCropStartX, u32 uSrcCropStartY, 
		u32 uSrcCropHsz, u32 uSrcCropVsz, u32 uSrcAddr0, u32 uSrcAddr1, CSPACE eSrcFmt,
		u32 uDisplayHsz, u32 uDisplayVsz, u32 uDstStX, u32 uDstStY, u32 uDstHsz, u32 uDstVsz, 
		u32 uDstAddr0, u32 uDstAddr1, CSPACE eDstFmt, FLIP_DIR eFlip, ROT_DEG eRotDeg, PROCESS_PATH ePathMode)
{
	u32 uSrcStartY0, uSrcStartCb0,uSrcStartCr0;
	u32 uSrcEndY0, uSrcEndCb0, uSrcEndCr0;
	u32 uSrcStartY1, uSrcStartCb1,uSrcStartCr1;
	u32 uSrcOffsetY, uSrcOffsetCbCr;
	u32 uBytesPerPixel;
	int nVRatio;
	u32 uMSSz;

	// 1. Set the source size, source data format and source address
	//==============================================
	oCim.m_uSrcHsz = uSrcOrgHsz;
	oCim.m_uSrcVsz = uSrcOrgVsz;
	oCim.m_eMemSrcFmt = eSrcFmt;
	oCim.m_uSrcAddr0 = uSrcAddr0;
	oCim.m_uSrcAddr1 = uSrcAddr1;
	oCim.m_eProcessPath = ePathMode; // jungil 0223
	
	// 2. Set the basic sfr
	//===============================================
	CAMERA_SetBasicSfr(uSrcCropStartX, uSrcCropStartY, uSrcCropHsz, uSrcCropVsz, uDstHsz, uDstVsz,
		uDstAddr0, uDstAddr1, eDstFmt, DMA, ePathMode, DMA, eFlip, eRotDeg);

	// 3. Compute the start address of source
	//===============================================
	uBytesPerPixel = ((oCim.m_eMemSrcFmt == YC420)||(oCim.m_eMemSrcFmt == YC422)) ? 1 :
		((oCim.m_eMemSrcFmt == YCBYCR)||(oCim.m_eMemSrcFmt == YCRYCB)||(oCim.m_eMemSrcFmt == CBYCRY)
		 ||(oCim.m_eMemSrcFmt == CRYCBY)||(oCim.m_eMemSrcFmt == RGB16)) ? 2 : 4;

	uSrcOffsetY = (uSrcOrgHsz - uSrcCropHsz)*uBytesPerPixel;
	
	uSrcStartY0 = oCim.m_uSrcAddr0 + (uSrcOrgHsz*uSrcCropStartY + uSrcCropStartX)*uBytesPerPixel;
	uSrcEndY0 = uSrcStartY0 + uSrcCropHsz*uSrcCropVsz*uBytesPerPixel + uSrcOffsetY*(uSrcCropVsz-1);
	uSrcStartY1 = oCim.m_uSrcAddr1 + (uSrcOrgHsz*uSrcCropStartY + uSrcCropStartX)*uBytesPerPixel;

	Assert(uSrcStartY0%4 == 0); //Start addr must be word aligned
	Assert(uSrcStartY1%4 == 0); //Start addr must be word aligned
	
	if ((oCim.m_eMemSrcFmt == YC420)||(oCim.m_eMemSrcFmt == YC422))
	{
		uSrcOffsetCbCr = (uSrcOrgHsz - uSrcCropHsz)*1/2;
		nVRatio=(oCim.m_eMemSrcFmt == YC420)? 2 : 1;

		uSrcStartCb0 = oCim.m_uSrcAddr0+ uSrcOrgHsz*uSrcOrgVsz
			+ uSrcOrgHsz/2*uSrcCropStartY/nVRatio + uSrcCropStartX/2;
		uSrcStartCr0 = oCim.m_uSrcAddr0 + uSrcOrgHsz*uSrcOrgVsz + uSrcOrgHsz/2*uSrcOrgVsz/nVRatio
			+ uSrcOrgHsz/2*uSrcCropStartY/nVRatio + uSrcCropStartX/2;
		uSrcEndCb0 = uSrcStartCb0 + uSrcCropHsz/2*uSrcCropVsz/nVRatio + uSrcOffsetCbCr*(uSrcCropVsz/nVRatio-1);
		uSrcEndCr0 = uSrcStartCr0 + uSrcCropHsz/2*uSrcCropVsz/nVRatio + uSrcOffsetCbCr*(uSrcCropVsz/nVRatio-1);

		uSrcStartCb1 = oCim.m_uSrcAddr1+ uSrcOrgHsz*uSrcOrgVsz
			+ uSrcOrgHsz/2*uSrcCropStartY/nVRatio + uSrcCropStartX/2;
		uSrcStartCr1 = oCim.m_uSrcAddr1 + uSrcOrgHsz*uSrcOrgVsz + uSrcOrgHsz/2*uSrcOrgVsz/nVRatio
			+ uSrcOrgHsz/2*uSrcCropStartY/nVRatio + uSrcCropStartX/2;
		Assert(uSrcStartCb0%4 == 0); //Start addr must be word aligned
		Assert(uSrcStartCb1%4 == 0); //Start addr must be word aligned
		Assert(uSrcStartCr0%4 == 0); //Start addr must be word aligned
		Assert(uSrcStartCr1%4 == 0); //Start addr must be word aligned
	} 
	else
	{
		uSrcOffsetCbCr = 0;
		uSrcStartCb0 = 0;
		uSrcEndCb0 = 0;
		uSrcStartCr0 = 0;
		uSrcEndCr0 = 0;
		uSrcStartCb1 = 0;
		uSrcStartCr1 = 0;
	}

	// 4. Set the register of source start address and image size
	//==========================================
	uMSSz = (uSrcCropVsz<<16)|(uSrcCropHsz);
	if (oCim.m_eProcessPath==P_PATH)
	{
		Outp32(&CAMERAR->rMSPRWIDTH, uMSSz); // Set MSDMA source image size

		Outp32(&CAMERAR->rCIPRYSA1, uDstAddr0);
		Outp32(&CAMERAR->rCIPRYSA2, uDstAddr1); 
		Outp32(&CAMERAR->rCIPRYSA3, uDstAddr0);
		Outp32(&CAMERAR->rCIPRYSA4, uDstAddr1); 
		Outp32(&CAMERAR->rMSPRY0SA, uSrcStartY0);
		Outp32(&CAMERAR->rMSPRY0END, uSrcEndY0);
		Outp32(&CAMERAR->rMSPRCB0SA, uSrcStartCb0);
		Outp32(&CAMERAR->rMSPRCB0END, uSrcEndCb0); 
		Outp32(&CAMERAR->rMSPRCR0SA, uSrcStartCr0);
		Outp32(&CAMERAR->rMSPRCR0END, uSrcEndCr0);
		Outp32(&CAMERAR->rMSPRYOFF, uSrcOffsetY); 
		Outp32(&CAMERAR->rMSPRCBOFF, uSrcOffsetCbCr);
		Outp32(&CAMERAR->rMSPRCROFF, uSrcOffsetCbCr);

	}
	else 
	{
		Outp32(&CAMERAR->rMSCOWIDTH, uMSSz);// Set MSDMA source image size

		Outp32(&CAMERAR->rCICOYSA1, uDstAddr0);
		Outp32(&CAMERAR->rCICOYSA2, uDstAddr1); 
		Outp32(&CAMERAR->rCICOYSA3, uDstAddr0);
		Outp32(&CAMERAR->rCICOYSA4, uDstAddr1); 
		Outp32(&CAMERAR->rMSCOY0SA, uSrcStartY0); // Set SrcAddr0 Y, Cb, Cr
		Outp32(&CAMERAR->rMSCOY0END, uSrcEndY0);
		Outp32(&CAMERAR->rMSCOCB0SA, uSrcStartCb0);
		Outp32(&CAMERAR->rMSCOCB0END, uSrcEndCb0); 
		Outp32(&CAMERAR->rMSCOCR0SA, uSrcStartCr0);
		Outp32(&CAMERAR->rMSCOCR0END, uSrcEndCr0); 
		Outp32(&CAMERAR->rMSCOYOFF, uSrcOffsetY); // Set Offset of Y, Cb, Cr
		Outp32(&CAMERAR->rMSCOCBOFF, uSrcOffsetCbCr);
		Outp32(&CAMERAR->rMSCOCROFF, uSrcOffsetCbCr);
	}

	// 5. Set scan line offset 
	//===========================================
	if (uDstHsz < uDisplayHsz && uDstVsz < uDisplayVsz)
		CAMERA_SetDstScanOffset(uDisplayHsz, uDisplayVsz, uDstStX, uDstStY, uDstAddr0, uDstAddr1);
	else if (uDstHsz > uDisplayHsz || uDstVsz > uDisplayVsz)
		{
			Assert(0);
		}
	else
		{};
}




//////////
// Function Name : CAMERA_InitDmaInPathToFifoOut0
// Function Description : 
// 					Dma input fifo output
// Input : 	
//		u32 uSrcOrgHsz(Source image H size), u32 uSrcOrgVsz(Source image V size), u32 uSrcCropStartX(Window offset X1), u32 uSrcCropStartY(Window offset Y1), 
//		u32 uSrcCropHsz(Wanted crop H size), u32 uSrcCropVsz(Wanted crop V size), u32 uSrcAddr0(Source image address 0), u32 uSrcAddr1(Source image address 1), CSPACE eSrcFmt(Source image format),
//		u32 uDstHsz(Destination image H size), u32 uDstVsz(Destination image V size), CSPACE eDstFmt(Destination image format), 
//		ROT_DEG eRotDeg(Rotation mode), PROCESS_PATH ePathMode(Process path)
// Output :    	None
void CAMERA_InitDmaInPathToFifoOut0(u32 uSrcOrgHsz, u32 uSrcOrgVsz, u32 uSrcCropStartX, u32 uSrcCropStartY, 
		u32 uSrcCropHsz, u32 uSrcCropVsz, u32 uSrcAddr0, u32 uSrcAddr1, CSPACE eSrcFmt,
		u32 uDstHsz, u32 uDstVsz, CSPACE eDstFmt, 
		ROT_DEG eRotDeg, PROCESS_PATH ePathMode)
{
	u32 uSrcStartY0, uSrcStartCb0,uSrcStartCr0;
	u32 uSrcEndY0, uSrcEndCb0, uSrcEndCr0;
	u32 uSrcStartY1, uSrcStartCb1,uSrcStartCr1;
	u32 uSrcOffsetY, uSrcOffsetCbCr;
	u32 uBytesPerPixel;
	int nVRatio;
	u32 uMSSz;

		
	// 1. Set the source size, source data format and source address
	//==========================================
	oCim.m_uSrcHsz = uSrcOrgHsz;
	oCim.m_uSrcVsz = uSrcOrgVsz;
	oCim.m_eMemSrcFmt = eSrcFmt;
	oCim.m_uSrcAddr0 = uSrcAddr0;
	oCim.m_uSrcAddr1 = uSrcAddr1;
	oCim.m_eProcessPath = ePathMode; // jungil
	
	// 2. Set the basic sfr
	//===========================================
	CAMERA_SetBasicSfr(uSrcCropStartX, uSrcCropStartY, uSrcCropHsz, uSrcCropVsz, uDstHsz, uDstVsz,
		0, 0, eDstFmt, DMA, ePathMode, FIFO, FLIP_NO, eRotDeg);

	// 3. Compute the start address of source
	//===========================================
	uBytesPerPixel = (oCim.m_eMemSrcFmt == YC420||oCim.m_eMemSrcFmt == YC422) ? 1 :
		(oCim.m_eMemSrcFmt == YCBYCR||oCim.m_eMemSrcFmt == YCRYCB||oCim.m_eMemSrcFmt == CBYCRY
		 ||oCim.m_eMemSrcFmt == CRYCBY||oCim.m_eMemSrcFmt == RGB16) ? 2 : 4;
	
	uSrcOffsetY = (uSrcOrgHsz - uSrcCropHsz)*uBytesPerPixel;
	
	uSrcStartY0 = oCim.m_uSrcAddr0 + (uSrcOrgHsz*uSrcCropStartY + uSrcCropStartX)*uBytesPerPixel;
	uSrcEndY0 = uSrcStartY0 + uSrcCropHsz*uSrcCropVsz*uBytesPerPixel + uSrcOffsetY*(uSrcCropVsz-1);
	uSrcStartY1 = oCim.m_uSrcAddr1 + (uSrcOrgHsz*uSrcCropStartY + uSrcCropStartX)*uBytesPerPixel;

	Assert(uSrcStartY0%4 == 0); //Start addr must be word aligned
	Assert(uSrcStartY1%4 == 0); //Start addr must be word aligned

	if (oCim.m_eMemSrcFmt == YC420||oCim.m_eMemSrcFmt == YC422)
	{
		uSrcOffsetCbCr = (uSrcOrgHsz - uSrcCropHsz)*1/2;
		nVRatio=(oCim.m_eMemSrcFmt == YC420)? 2 : 1;

		uSrcStartCb0 = oCim.m_uSrcAddr0+ uSrcOrgHsz*uSrcOrgVsz

⌨️ 快捷键说明

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