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

📄 camera.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6400 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6400.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : camera.c
*  
*	File Description : Camera API Function 
*
*	Author : 
*	Dept. : AP Development Team
*	Created Date : 
*	Version : 0.1 
* 
*	History
*	- Created
*  
**************************************************************************************/


#include <string.h>
#include <stdio.h>

#include "def.h"
#include "system.h"
#include "lcd.h"
#include "camera.h"
#include "cameram.h"
//#include "CameraModule.h"
#include "glib.h"
#include "intc.h"
#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "sysc.h"
#include "gpio.h"


#define CAMERAR 		 ( ( volatile oCAMERA_REGS * ) CAMERA_pBase )

static void *CAMERA_pBase;


typedef struct tag_CAMERA_REGS
{
	u32 rCISRCFMT; 				// 0x7800_0000			Camera Input Sorce Format
	u32 rCIWDOFST;				// 0x7800_0004			Window Offset Register
	u32 rCIGCTRL;				// 0x7800_0008			Golbal Control Register
	u32 rreserved0;
	u32 rreserved1;
	u32 rCIDOWFST2;			// 0x7800_0014			Window Offset Register 2
	u32 rCICOYSA1;				// 0x7800_0018			Interleace YCbCr, Non Interleave Y, RGB : 1st Frame Start Address for Codec DMA
	u32 rCICOYSA2;				// 0x7800_001C			Interleace YCbCr, Non Interleave Y, RGB : 2st Frame Start Address for Codec DMA
	u32 rCICOYSA3;				// 0x7800_0020			Interleace YCbCr, Non Interleave Y, RGB : 3st Frame Start Address for Codec DMA
	u32 rCICOYSA4;				// 0x7800_0024			Interleace YCbCr, Non Interleave Y, RGB : 4st Frame Start Address for Codec DMA
	u32 rCICOCBSA1;				// 0x7800_0028 		Cb 1st Frame Start Address for Codec DMA
	u32 rCICOCBSA2;				// 0x7800_002C			Cb 2st Frame Start Address for Codec DMA
	u32 rCICOCBSA3;				// 0x7800_0030			Cb 3st Frame Start Address for Codec DMA
	u32 rCICOCBSA4;				// 0x7800_0034			Cb 4st Frame Start Address for Codec DMA
	u32 rCICOCRSA1;				// 0x7800_0038			Cr 1st Frame Start Address for Codec DMA
	u32 rCICOCRSA2;				// 0x7800_003C			Cr 2st Frame Start Address for Codec DMA
	u32 rCICOCRSA3;				// 0x7800_0040			Cr 3st Frame Start Address for Codec DMA
	u32 rCICOCRSA4;				// 0x7800_0044			Cr 4st Frame Start Address for Codec DMA
	u32 rCICOTRGFMT;			// 0x7800_0048			Targer Image Format of Codec DMA
	u32 rCICOCTRL;				// 0x7800_004C			Codec DMA Control Related
	u32 rCICOSCPRERATIO;		// 0x7800_0050			Codec Pre_Scaler Ratio Control
	u32 rCICOSCPREDST;			// 0x7800_0054			Codec Pre_Scaler Destination Format
	u32 rCICOSCCTRL;				// 0x7800_0058			Codec Main_Scaler Control
	u32 rCICOTAREA;				// 0x7800_005C			Codec Pre_Scaler Destination Format(Area)
	u32 rreserved3;
	u32 rCICOSTATUS;				// 0x7800_0064			Codec Path Status
	u32 rreserved4;
	u32 rCIPRYSA1;				// 0x7800_006C			Interleace YCbCr, Non Interleave Y, RGB : 1st Frame Start Address for Preview DMA
	u32 rCIPRYSA2;				// 0x7800_0070			Interleace YCbCr, Non Interleave Y, RGB : 2st Frame Start Address for Preview DMA
	u32 rCIPRYSA3;				// 0x7800_0074			Interleace YCbCr, Non Interleave Y, RGB : 3st Frame Start Address for Preview DMA
	u32 rCIPRYSA4;				// 0x7800_0078			Interleace YCbCr, Non Interleave Y, RGB : 4st Frame Start Address for Preview DMA
	u32 rCIPRCBSA1;				// 0x7800_007C			Cb, 1st Frame Start Address for Preview DMA
	u32 rCIPRCBSA2;				// 0x7800_0080			Cb, 2st Frame Start Address for Preview DMA
	u32 rCIPRCBSA3;				// 0x7800_0084			Cb, 3st Frame Start Address for Preview DMA
	u32 rCIPRCBSA4;				// 0x7800_0088			Cb, 4st Frame Start Address for Preview DMA
	u32 rCIPRCRSA1;				// 0x7800_008C			Cr, 1st Frame Start Address for Preview DMA
	u32 rCIPRCRSA2;				// 0x7800_0090			Cr, 2st Frame Start Address for Preview DMA
	u32 rCIPRCRSA3;				// 0x7800_0094			Cr, 3st Frame Start Address for Preview DMA
	u32 rCIPRCRSA4;				// 0x7800_0098			Cr, 4st Frame Start Address for Preview DMA
	u32 rCIPRTRGFMT;				// 0x7800_009C			Target Image For Preview DMA
	u32 rCIPRCTRL;				// 0x7800_00A0			Preview DMA Control Releated
	u32 rCIPRSCPRERATIO;		// 0x7800_00A4			Preview Pre_Scaler Ratio Control
	u32 rCIPRSCPREDST;			// 0x7800_00A8			Preview Pre_Scaler Destination Format
	u32 rCIPRSCCTRL;				// 0x7800_00AC		Preview Main Scaler Control
	u32 rCIPRTAREA;				// 0x7800_00B0			Preview Pre_Scaler Destination Format(Area)
	u32 rreserved5;
	u32 rCIPRSTATUS;				// 0x7800_00B8			Preview Path Status
	u32 rreserved6;
	u32 rCIIMGCPT;				// 0x7800_00C0			Image Capture Enable Command
	u32 rCICPTSEQ;				// 0x7800_00C4			Camera Image Capture Sequence Related
	u32 rreserved7;
	u32 rreserved8;
	u32 rCIIMGEFF;				// 0x7800_00D0		Image Effects Related
	u32 rMSCOY0SA;				// 0x7800_00D4		MSDMA Y0 Start Address Related
	u32 rMSCOCB0SA;				// 0x7800_00D8		MSDMA Cb0 Start Address Related
	u32 rMSCOCR0SA;				// 0x7800_00DC		MSDMA Cr0 Start Address Related
	u32 rMSCOY0END;				// 0x7800_00E0			MSDMA Y0 End Address Related
	u32 rMSCOCB0END;			// 0x7800_00E4			MSDMA Cb0 End Address Related
	u32 rMSCOCR0END;			// 0x7800_00E8			MSDMA Cr0 End Address Related
	u32 rMSCOYOFF;				// 0x7800_00EC			MSDMA Y Offset Related
	u32 rMSCOCBOFF;				// 0x7800_00F0			MSDMA Cb Offset Related
	u32 rMSCOCROFF; 				// 0x7800_00F4			MSDMA Cr Offset Related
	u32 rMSCOWIDTH;				// 0x7800_00F8			MSDMA Source Image Width Related
	u32 rMSCOCTRL;				// 0x7800_00FC			MSDMA for Codec Control Register
	u32 rMSPRY0SA;				// 0x7800_0100			MSDMA Y0 Start Address Related(Preview)
	u32 rMSPRCB0SA;				// 0x7800_0104 		MSDMA Cb0 Start Address Related(Preview)
	u32 rMSPRCR0SA;				// 0x7800_0108			MSDMA Cr0 Start Address Related(Preview)
	u32 rMSPRY0END;				// 0x7800_010C			MSDMA Y0 End Address Related(Preview)
	u32 rMSPRCB0END;			// 0x7800_0110			MSDMA Cb0 End Address Related(Preview)
	u32 rMSPRCR0END;			// 0x7800_0114			MSDMA Cr0 End Address Related(Preview)
	u32 rMSPRYOFF;				// 0x7800_0118			MSDMA Y Offset Related(Preview)
	u32 rMSPRCBOFF;				// 0x7800_011C			MSDMA Cb Offset Related(Preview)
	u32 rMSPRCROFF;				// 0x7800_0120			MSDMA Cr Offset Related(Preview)
	u32 rMSPRWIDTH;				// 0x7800_0124			MSDMA Source Image Width RElated(Preview)
	u32 rCIMSCTRL;				// 0x7800_0128			MSDMA Control Register for Preview
	u32 rCICOSCOSY;				// 0x7800_012C			Codec Scan Line Y Offset Related
	u32 rCICOSCOSCB;				// 0x7800_0130			Codec Scan Line Cb Offset Related
	u32 rCICOSCOSCR;				// 0x7800_0134			Codec Scan Line Cr Offset Related
	u32 rCIPRSCOSY;				// 0x7800_0138			Preview Scan Line Y Offset Related
	u32 rCIPRSCOSCB;				// 0x7800_013C 		Preview Scan Line Cb Offset Related
	u32 rCIPRSCOSCR;				// 0x7800_0140			Preview Scna Line Cr Offset Related
	
}oCAMERA_REGS;

CIM oCim;
static volatile u32 CAMTYPE;	

#define SCALER_BYPASS_MAX_HSIZE 4096
#define SCALER_MAX_HSIZE_P 640
#define SCALER_MAX_HSIZE_C 1600
#define OUTPUT_MAX_HSIZE_ROT_RGB_P 320
#define OUTPUT_MAX_HSIZE_ROT_RGB_C 800
#define INPUT_MAX_HSIZE_ROT_P 160
#define INPUT_MAX_VSIZE_ROT_P 120
#define INPUT_MAX_HSIZE_ROT_C 720
#define INPUT_MAX_VSIZE_ROT_C 576


/*
//////////
// Function Name : CAMERA_ReadCameraModuleStatus 
// Function Description : Camerar Module 1.3M(SXGA) 2M(UXGA) IIC Initial Setting Value Write / Read
// Input : 	
// Output :    	None
void CAMERA_ReadCameraModuleStatus(void)
{

#if (CAM_MODEL == CAM_S5K3AA)
	oCim.m_eCcir = CCIR656; 
	oCim.m_eCamSrcFmt = CBYCRY;
	CAMTYPE = 0;
	CAMERA_Read_Write(CAMTYPE,oCim.m_eCcir, oCim.m_eCamSrcFmt, VGA);
#elif (CAM_MODEL == CAM_S5K3BA) ///
	oCim.m_eCcir = CCIR601;
	oCim.m_eCamSrcFmt = YCRYCB; 
	CAMTYPE = 1;
	CAMERA_Read_Write(CAMTYPE,oCim.m_eCcir, oCim.m_eCamSrcFmt, SUB_SAMPLING0);
#else
	Assert(0);
#endif

}
*/

//////////
// Function Name : CAMERA_ClkSetting
// Function Description : Camera CLK output setting. using HCLKx2
// Input : 	None
// Output :    	None
void CAMERA_ClkSetting(void)
{
	u32 uCamCLKDiver;
	u32 uHCLKx2;

	SYSC_GetClkInform();
	printf("\n----------------------------------------------------------------------------------------\n");
	printf("ARMCLK: %.2fMHz  HCLKx2: %.2fMHz  HCLK: %.2fMHz  PCLK: %.2fMHz\n",(float)g_ARMCLK/1.0e6, (float)g_HCLKx2/1.0e6, (float)g_HCLK/1.0e6, (float)g_PCLK/1.0e6);	

	uHCLKx2 = (int)(g_HCLKx2/1000000);

	switch ( uHCLKx2)
	{
		case 200:
			printf ("  CAMCLK Source is HCLKx2 = 200 Mhz       \n");
			printf ("  CAMCLK = 200 / (1+7) = 25Mhz Setting    \n");
			uCamCLKDiver = Inp32SYSC(0x20);
			uCamCLKDiver = ( uCamCLKDiver & ~(0xf<<20)) | (7<<20); // 200 Mhz / (9+1) = 25Mhz... 
//			uCamCLKDiver = ( uCamCLKDiver & ~(0xf<<20)) | (12<<20); // 200 Mhz / (9+1) = 20Mhz... 
			Outp32SYSC(0x20, uCamCLKDiver);
			break;
		case 266:
			printf ("  CAMCLK Source is HCLKx2 = 266 Mhz        =");
			printf ("  CAMCLK = 266 / (1+9) = 26Mhz Setting     =");
			uCamCLKDiver = Inp32SYSC(0x20);
			uCamCLKDiver = ( uCamCLKDiver & ~(0xf<<20)) | (9<<20); // 266 Mhz / (9+1) = 26Mhz... 
			Outp32SYSC(0x20, uCamCLKDiver);
			break;
		default:
			printf("Check HCLKx2 is 200 or 266Mhz!!\n");
			Assert(0);
			break;
	}
	
#if 0	
	// CamCLK Source is HCLK
	printf("\n===============================");
	printf ("\n=  CAMCLK Source is HCLKx2 = 200 Mhz        =");
	printf ("\n=  CAMCLK = 200 / (1+9) = 20Mhz Setting     =");
	printf("\n===============================");
	uCamCLKDiver = Inp32SYSC(0x20);
	uCamCLKDiver = ( uCamCLKDiver & ~(0xf<<20)) | (9<<20); // 200 Mhz / (9+1) = 20Mhz... 
	Outp32SYSC(0x20, uCamCLKDiver);
#endif
}


//////////
// Function Name : CAMERA_InitSensor
// Function Description : Camera Moudle Init
// Input : 	None
// Output :    	None
void CAMERA_InitSensor(void)
{
	// 1. Reset sensor
	//==========================================
	CAMERA_ResetSensor(); 
	Delay(5000);
	// 2. Initalize the member variables and initalize the camera model.
	//==========================================
	oCim.m_uIfBits = 8;
#if (CAM_MODEL == CAM_S5K3AA)
	oCim.m_bInvPclk = true, 
	oCim.m_bInvVsync = false, 
	oCim.m_bInvHref = false;
	oCim.m_uSrcHsz = 640, oCim.m_uSrcVsz = 480;
//	oCim.m_uSrcHsz = 1280, oCim.m_uSrcVsz = 1024;	
	oCim.m_eCcir = CCIR656; 
	oCim.m_eCamSrcFmt = CBYCRY;
//	oCim.m_eCamSrcFmt = YCRYCB;	
	CAMTYPE = 0;
	CAMERA_InitS5K3AAE_VGA();	

#elif (CAM_MODEL == CAM_S5K3BA) ///
	oCim.m_bInvPclk = false,
	oCim.m_bInvVsync = true,
	oCim.m_bInvHref = false;
	oCim.m_uSrcHsz = 800, oCim.m_uSrcVsz = 600;
//	oCim.m_uSrcHsz = 1280, oCim.m_uSrcVsz = 1024;	
	oCim.m_eCcir = CCIR601;
	oCim.m_eCamSrcFmt = YCRYCB; 
	CAMTYPE = 1;
	CAMERA_InitS5K3BAF(oCim.m_eCcir, oCim.m_eCamSrcFmt, SUB_SAMPLING2);	

#elif (CAM_MODEL == CAM_A3AFX_VGA) ///
	oCim.m_bInvPclk = false,
	oCim.m_bInvVsync = true,
	oCim.m_bInvHref = false;
	oCim.m_uSrcHsz = 320, oCim.m_uSrcVsz = 240;
//	oCim.m_uSrcHsz = 176, oCim.m_uSrcVsz = 144;	
	oCim.m_eCcir = CCIR601;
	oCim.m_eCamSrcFmt = YCBYCR; 	
	CAMERA_InitA3AFX_QVGA_20FR();
//	CAMERA_InitA3AFX_QVGA_15FR();	
//	CAMERA_InitA3AFX_QCIF_30FR();
//	CAMERA_InitA3AFX_QCIF_15FR();
#else
	Assert(0);
#endif

}
	

//////////
// Function Name : CAMERA_InitSensor1
// Function Description : This Function use at JPEG Test. 
// Input : 	IMG_SIZE eSize(Image Size), CAM_ATTR eCcir(Source YCBCR Format), CSPACE eSrcFmt(Source Format)
// Output :    	None
void CAMERA_InitSensor1(IMG_SIZE eSize, CAM_ATTR eCcir, CSPACE eSrcFmt)
{
	SUB_SAMPLING eSub; 
	// 1. Reset sensor
	//==========================================
	CAMERA_ResetSensor();

	// 2. Initalize the member variables and initalize the camera model.
	//==========================================
	oCim.m_uIfBits = 8;
	oCim.m_eCcir = eCcir;
	oCim.m_eCamSrcFmt = eSrcFmt;

	if (eSize == UXGA)
		oCim.m_uSrcHsz = 1600, oCim.m_uSrcVsz = 1200; 
	else if (eSize == SXGA)
		oCim.m_uSrcHsz = 1280, oCim.m_uSrcVsz = 1024; 
	else if (eSize == SVGA)
		oCim.m_uSrcHsz = 800, oCim.m_uSrcVsz = 600; 
	else if (eSize == VGA)
		oCim.m_uSrcHsz = 640, oCim.m_uSrcVsz = 480; 
	else if (eSize == QVGA)
		oCim.m_uSrcHsz = 320, oCim.m_uSrcVsz = 240; 
	else if (eSize == QQVGA)
		oCim.m_uSrcHsz = 160, oCim.m_uSrcVsz = 120; 
	else if (eSize == CIF)
		oCim.m_uSrcHsz = 352, oCim.m_uSrcVsz = 288; 
	else if (eSize == QCIF)
		oCim.m_uSrcHsz = 172, oCim.m_uSrcVsz = 144; 
	else
	{
		Assert(0);
	}

#if (CAM_MODEL == CAM_S5K3AA)

	Assert( oCim.m_eCcir == CCIR656);
	oCim.m_bInvPclk = true, 
	oCim.m_bInvVsync = false,
	oCim.m_bInvHref = false;
	oCim.m_eCamSrcFmt = CBYCRY;
	
	CAMERA_InitS5K3AAE(oCim.m_eCcir, oCim.m_eCamSrcFmt, SXGA);

#elif (CAM_MODEL == CAM_S5K4AAF)
	oCim.m_bInvPclk = false,
	oCim.m_bInvVsync = false,
	oCim.m_bInvHref = false;
	oCim.m_eCamSrcFmt = YCRYCB;  // change camif setting instead of cam module.

	oCim.m_oCamera.InitS5K4AAF(oCim.m_eCcir, oCim.m_eCamSrcFmt, eSize);
#elif (CAM_MODEL == CAM_S5K3BA)

	Assert( oCim.m_eCcir == CCIR601);
	oCim.m_bInvPclk = false, 
	oCim.m_bInvVsync = true, 
	oCim.m_bInvHref = false;
	oCim.m_eCamSrcFmt = YCRYCB;


	switch(eSize)
	{
		case UXGA:case SXGA:
			eSub = SUB_SAMPLING0;
			oCim.m_uSrcHsz = 1600; oCim.m_uSrcVsz = 1200;
			break;
		case SVGA:case VGA:
			eSub = SUB_SAMPLING2;
			oCim.m_uSrcHsz = 800; oCim.m_uSrcVsz = 600;
			break;
		case QVGA:case QQVGA:case CIF:case QCIF:
			eSub = SUB_SAMPLING4;
			oCim.m_uSrcHsz = 400; oCim.m_uSrcVsz = 300;
			break;

⌨️ 快捷键说明

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