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

📄 aewb.c

📁 dm270 source code
💻 C
字号:
/*
    DM270 ARM Evaluation Software

    (c)Texas Instruments 2003
*/

#include <system/prev270.h>
#include <system/h3a270.h>
#include <system/osd270.h>

#include <user/ccdm_3d3.h>
#include <user/intc.h>

#include <h3a/aewb.h>
#include <demo/mem_alloc.h>


#define BLOCK_NUM_AEWB	12*8

awbprm_t  awbprm;
aeprm_t   aeprm;
aeret_t   aeret;
awbret_t  awbret;
		
extern Int16 AETablePreview[]; 
extern Int16 AETablePostview[]; 
extern Int16 AETableCapture[];

static Int16 AEHistory[] = {1, 1, 1 };
static Int16 AEHistory_ptrZ0 = 1;
static Int16 AEHistory_ptrZ1 = 0;

static Int16 AWBHistory[2][32];
static Int16 AWBHistory_ptr = 0;

extern Int16 AWBRCompasation[]; 
extern Int16 AWBBCompasation[]; 

AEWB_ConfigData aewbCfg;

void AEWBInit(void) {

	// AE/AWB Hardware config
	{
		aewbCfg.saturationLimit = 255;
		aewbCfg.winHeight		= 24;		
		aewbCfg.winWidth		= 160;		
		aewbCfg.numWinH			= 12;		
		aewbCfg.numWinV			= 8;		
		aewbCfg.winStartH		= 168;		
		aewbCfg.winStartV		= 16;		
		aewbCfg.winIncH			= 4;		
		aewbCfg.winIncV			= 4;		
		aewbCfg.sdramAddress	= AEWB_DATA_ADDR;	

		awbprm.aewbConfig		= &aewbCfg;

		AEWB_setConfig( awbprm.aewbConfig );
	}

	// AWB parameter init
	{
		Uint16 i, TmpData;

		awbprm.AwbRCompValuePreview = 8;
		awbprm.AwbBCompValuePreview = 16;
		awbprm.AwbRCompValueCapture = 12;
		awbprm.AwbBCompValueCapture = 12;

		awbprm.AwbDefaultGainR = (PREV_RGET(WBGAIN1)&0xff)   <<8;
		awbprm.AwbDefaultGainB = (PREV_RGET(WBGAIN0)&0xff)   <<8;
		awbprm.AwbDefaultGainG = (PREV_RGET(WBGAIN0)&0xff00) >>8;

		TmpData = awbprm.AwbDefaultGainR / awbprm.AwbDefaultGainG;
		for(i=0;i<32;i++) 
			AWBHistory[0][i] = TmpData;

		TmpData = awbprm.AwbDefaultGainB / awbprm.AwbDefaultGainG;
		for(i=0;i<32;i++) 
			AWBHistory[1][i] = TmpData;
		

		awbprm.AwbRThreshHigh = 512;
		awbprm.AwbRThreshLow = 350;
		awbprm.AwbBThreshHigh = 480;
		awbprm.AwbBThreshLow = 250;
		awbprm.AwbRTotalThreshHigh = 512;
		awbprm.AwbRTotalThreshLow = 200;
		awbprm.AwbBTotalThreshHigh = 458;
		awbprm.AwbBTotalThreshLow = 154;
	}

	// AE parameter init
	{
		aeprm.AeInitialShutterSpeed = 100;
		aeprm.AeReferenceLevel = 17;

		aeprm.AeCurrentShutterSpeed = aeprm.AeInitialShutterSpeed;
		aeprm.AeCoringLevel = 2;
		aeprm.AeUpperLimiter = 35*240;
	}

}

void AE(void) {

	Uint16 YLevel[BLOCK_NUM_AEWB];
	
	Uint32  TempSdramAddress;	
	Uint32  TempDataRGGB;
	Uint16 TempDataR;
	Uint16 TempDataB;
	Uint16 TempDataG;
	

	Uint32  AveYLevel;
	Uint16 AELevel;	
	Int16  AEDifference;
	
	Int16 i;
	


	AveYLevel = 0;
		
	TempSdramAddress = AEWB_getCurFrameDataAddress();
	
	for(i=0;i<BLOCK_NUM_AEWB;i++) {
		TempDataRGGB = *(Uint32 *)TempSdramAddress;
		TempSdramAddress += 4;
		TempDataG = (TempDataRGGB&0xFFFF)>>1;
		TempDataR = (TempDataRGGB&0xFFFF0000)>>16;
		TempDataRGGB = *(Uint32 *)TempSdramAddress;
		TempDataB = TempDataRGGB&0xFFFF;
		TempDataG += (TempDataRGGB&0xFFFF0000)>>17;
		
		YLevel[i] = (Uint16)((TempDataR+TempDataG+TempDataG+TempDataB)>>2);
		if(YLevel[i] > aeprm.AeUpperLimiter)
			YLevel[i] = aeprm.AeUpperLimiter;
			
		TempSdramAddress += 28;
	}


	for(i=0;i<BLOCK_NUM_AEWB;i++) 
		AveYLevel += YLevel[i];	
		
	AELevel = (Uint16)(AveYLevel / 23040);
	
	AEDifference = AELevel- aeprm.AeReferenceLevel + 128;
	AEDifference = AEDifference>255?255:AEDifference;
	AEDifference = AEDifference<0?0:AEDifference;
 
	if((AEDifference<(aeprm.AeCoringLevel+128))&&(AEDifference>(128-aeprm.AeCoringLevel))) 
		if(!(AEHistory[AEHistory_ptrZ1])) {
			AEDifference = 128;
			
		}
			
	AEHistory_ptrZ1++;
	AEHistory[AEHistory_ptrZ0++] = AETablePreview[AEDifference];
	
	AEHistory_ptrZ0 = AEHistory_ptrZ0>2?0:AEHistory_ptrZ0;
	AEHistory_ptrZ1 = AEHistory_ptrZ1>2?0:AEHistory_ptrZ1; 


	aeret.AeLevelPreview = aeprm.AeCurrentShutterSpeed 
					+ AETablePreview[AEDifference];

	aeret.AeLevelPostview = AETablePostview[AELevel]; 
    aeret.AeLevelCapture = (AETableCapture[aeret.AeLevelPreview]*2)>>1;
                                                        /* test 02-24-2003*/   
	if(aeret.AeLevelPreview<0) 
		aeret.AeLevelPreview=0;

	aeprm.AeCurrentShutterSpeed = aeret.AeLevelPreview;
	CCDM_3D3_tgInit(CCDM_DRAFT_MODE, aeret.AeLevelPreview+10);
}

void AWB(void) {
	Uint16 GRRatio[BLOCK_NUM_AEWB];
	Uint16 GBRatio[BLOCK_NUM_AEWB];
	Uint16 YLevel[BLOCK_NUM_AEWB];
	
	Uint32  TempSdramAddress;	
	Uint32  TempDataRGGB;
	Uint16 TempDataR;
	Uint16 TempDataB;
	Uint16 TempDataG;
	
	Uint16 AwbREffectveBlockNumber;
	Uint16 AwbBEffectveBlockNumber;
	Uint16 AwbEffectveBlockNumber;
	Uint32  AveGRRatio;
	Uint32  AveGBRatio;
	Uint16 AwbRLevel;
	Uint16 AwbBLevel;

	
	Int16  AWBStatus;
	
	Int16 i; 
	
	AwbREffectveBlockNumber=0;
	AwbBEffectveBlockNumber=0;
	AwbEffectveBlockNumber=0;
	AveGRRatio = 0;
	AveGBRatio = 0;


	AWBStatus = 0;
	
	
	TempSdramAddress = AEWB_getCurFrameDataAddress();
	
	for(i=0;i<BLOCK_NUM_AEWB;i++) {
		TempDataRGGB = *(Uint32 *)TempSdramAddress;
		TempSdramAddress += 4;
		TempDataG = (TempDataRGGB&0xFFFF)>>1;
		TempDataR = (TempDataRGGB&0xFFFF0000)>>16;
		TempDataRGGB = *(Uint32 *)TempSdramAddress;
		TempDataB = TempDataRGGB&0xFFFF;
		TempDataG += (TempDataRGGB&0xFFFF0000)>>17;
		
		YLevel[i] = (Uint16)((TempDataR+TempDataG+TempDataG+TempDataB)>>2);
		if(YLevel[i] > aeprm.AeUpperLimiter)
			YLevel[i] = aeprm.AeUpperLimiter;
			
		if(YLevel[i] <= aeprm.AeUpperLimiter) {
			GRRatio[AwbEffectveBlockNumber] = TempDataG/((TempDataR>>8)+1);
    		GBRatio[AwbEffectveBlockNumber] = TempDataG/((TempDataB>>8)+1);
			AwbEffectveBlockNumber++;
		}
		TempSdramAddress += 28;
	}



	if(!AwbEffectveBlockNumber)
		AWBStatus = 1;

	for(i=0;i<AwbEffectveBlockNumber;i++) {
		if((GRRatio[i]<awbprm.AwbRThreshHigh)&&(GRRatio[i]>awbprm.AwbRThreshLow)){
			AveGRRatio += GRRatio[i];
			AwbREffectveBlockNumber++;
		}
		if((GBRatio[i]<awbprm.AwbBThreshHigh)&&(GBRatio[i]>awbprm.AwbBThreshLow)){
			AveGBRatio += GBRatio[i];
			AwbBEffectveBlockNumber++;
		}
	}

	AwbRLevel =(Uint16)(AveGRRatio / AwbREffectveBlockNumber);//+58;
	AwbBLevel =(Uint16)(AveGBRatio / AwbBEffectveBlockNumber);//+60;

  if((AwbRLevel>awbprm.AwbRTotalThreshHigh)
   ||(AwbRLevel<awbprm.AwbRTotalThreshLow)
   ||(AwbBLevel>awbprm.AwbBTotalThreshHigh)
   ||(AwbBLevel<awbprm.AwbBTotalThreshLow)
   ||AWBStatus){
		AwbRLevel = AWBHistory[0][AWBHistory_ptr];
		AwbBLevel = AWBHistory[1][AWBHistory_ptr];
		if(!AWBHistory_ptr) {
			AwbRLevel = AWBHistory[0][31];
			AwbBLevel = AWBHistory[1][31];
		}
	}

	AWBHistory[0][AWBHistory_ptr] = AwbRLevel;
	AWBHistory[1][AWBHistory_ptr] = AwbBLevel;
	AWBHistory_ptr++;
	AWBHistory_ptr = AWBHistory_ptr>31?0:AWBHistory_ptr;

	awbret.AwbRgainPreview = 0;	
	awbret.AwbBgainPreview = 0;

	for(i=0;i<32;i++) {
		awbret.AwbRgainPreview += AWBHistory[0][i];
    	awbret.AwbBgainPreview += AWBHistory[1][i];
	}
	awbret.AwbRgainPreview >>= (5+2); 
	awbret.AwbBgainPreview >>= (5+2); 
  
	TempDataR = PREV_RGET(WBGAIN1)&0xff00;
	PREV_RSET( WBGAIN1, TempDataR + (awbret.AwbRgainPreview&0xff)+awbprm.AwbRCompValuePreview);	
	TempDataB = PREV_RGET(WBGAIN0)&0xff00;          
	PREV_RSET( WBGAIN0 , TempDataB + (awbret.AwbBgainPreview&0xff)+awbprm.AwbBCompValuePreview);		
 	
 	awbret.AwbRgainCapture = (awbret.AwbRgainPreview+awbprm.AwbRCompValueCapture)<<3;	
	awbret.AwbGgainCapture = 0x1e0;
	awbret.AwbBgainCapture = (awbret.AwbBgainPreview+awbprm.AwbBCompValueCapture)<<3;;
}

static void AEWB_isr() {
	AE();
	AWB();
}


void AEWBDemoInit() {
	AEWBInit();
}

void AEWBDemoStart() {
	INTC_enable( INT_VD0, FALSE );
	INTCAttachISR( INT_VD0, AEWB_isr );
	INTC_enable( INT_VD0, TRUE );
	AEWB_enable(TRUE);
}

void AEWBDemoStop() {
	INTC_enable( INT_VD0, FALSE );
	INTCDetachISR( INT_VD0 );
	
	AEWB_enable(FALSE);
}


⌨️ 快捷键说明

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