📄 aewb.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 + -