📄 h3a270.c
字号:
/*
DM270 ARM Evaluation Software
(c)Texas Instruments 2003
*/
/**
\file h3a270.c
\brief Hardware 3A Related APIs
*/
#include <h3a270.h>
/**
\brief Set H3A AF Engine configuration
\param afConfig AF Engine configuration paramters
\return if success, \c E_PASS, else error code
\see AF_ConfigData
*/
STATUS AF_setConfig(AF_ConfigData * afConfig) {
Uint32 addr;
if( (afConfig->winHeight < 2) || (afConfig->winHeight > 64)
||(afConfig->winWidth < 1) || (afConfig->winWidth > 256)
||(afConfig->numWinH < 1) || (afConfig->numWinH > 9)
||(afConfig->numWinV < 1) || (afConfig->numWinV >4)
||(afConfig->winStartH < 1) || (afConfig->winStartH > 4095) || (afConfig->winStartH < afConfig->iirStartH)
||(afConfig->winStartV > 4095) || (afConfig->iirStartH > 4095)
||(afConfig->winLineIncrement < 1) || (afConfig->winLineIncrement > 16)
||(afConfig->sdramAddress % 32 != 0) )
{
return E_INVALID_INPUT;
}
H3A_FSET(AFCTRL,FVMODE,afConfig->fvAccMode);
H3A_FSET(AFCTRL,GPOSUL, afConfig->greenPixel[0][0]);
H3A_FSET(AFCTRL,GPOSUR, afConfig->greenPixel[0][1]);
H3A_FSET(AFCTRL,GPOSLL, afConfig->greenPixel[1][0]);
H3A_FSET(AFCTRL,GPOSLR, afConfig->greenPixel[1][1]);
H3A_FSET(AFPAX1,PAXV,(afConfig->winHeight/2 - 1));
H3A_FSET(AFPAX1,PAXH,(afConfig->winWidth/2 - 1));
H3A_FSET(AFPAX2,PAXVC,(afConfig->numWinV - 1));
H3A_FSET(AFPAX2,PAXHC,(afConfig->numWinH - 1));
H3A_FSET(AFPAX3,PAXSH,afConfig->winStartH);
H3A_FSET(AFPAX4,PAXSV,afConfig->winStartV);
H3A_FSET(AFIIRSH,IIRSH,afConfig->iirStartH);
H3A_FSET(AFPAX5,AFINCV,(afConfig->winLineIncrement - 1));
addr = (Uint32)(afConfig->sdramAddress) - SDRAM_MEMORY_BASE;
addr = addr/32;
H3A_RSET(AFSDRA2, addr );
H3A_FSET(AFSDRA1, ADRH, addr >> 16 );
H3A_FSET(AFCOEFF10,COEFF10,afConfig->iircoeff_0[0]);
H3A_FSET(AFCOEFF11,COEFF11,afConfig->iircoeff_0[1]);
H3A_FSET(AFCOEFF12,COEFF12,afConfig->iircoeff_0[2]);
H3A_FSET(AFCOEFF13,COEFF13,afConfig->iircoeff_0[3]);
H3A_FSET(AFCOEFF14,COEFF14,afConfig->iircoeff_0[4]);
H3A_FSET(AFCOEFF15,COEFF15,afConfig->iircoeff_0[5]);
H3A_FSET(AFCOEFF16,COEFF16,afConfig->iircoeff_0[6]);
H3A_FSET(AFCOEFF17,COEFF17,afConfig->iircoeff_0[7]);
H3A_FSET(AFCOEFF18,COEFF18,afConfig->iircoeff_0[8]);
H3A_FSET(AFCOEFF19,COEFF19,afConfig->iircoeff_0[9]);
H3A_FSET(AFCOEFF110,COEFF110,afConfig->iircoeff_0[10]);
H3A_FSET(AFCOEFF20,COEFF20,afConfig->iircoeff_1[0]);
H3A_FSET(AFCOEFF21,COEFF21,afConfig->iircoeff_1[1]);
H3A_FSET(AFCOEFF22,COEFF22,afConfig->iircoeff_1[2]);
H3A_FSET(AFCOEFF23,COEFF23,afConfig->iircoeff_1[3]);
H3A_FSET(AFCOEFF24,COEFF24,afConfig->iircoeff_1[4]);
H3A_FSET(AFCOEFF25,COEFF25,afConfig->iircoeff_1[5]);
H3A_FSET(AFCOEFF26,COEFF26,afConfig->iircoeff_1[6]);
H3A_FSET(AFCOEFF27,COEFF27,afConfig->iircoeff_1[7]);
H3A_FSET(AFCOEFF28,COEFF28,afConfig->iircoeff_1[8]);
H3A_FSET(AFCOEFF29,COEFF29,afConfig->iircoeff_1[9]);
H3A_FSET(AFCOEFF210,COEFF210,afConfig->iircoeff_1[10]);
return E_PASS;
}
/**
\brief Set H3A AE/AWB Engine configuration
\param aewConfig AE/AWB Engine configuration paramters
\return if success, \c E_PASS, else error code
\see AEW_ConfigData
*/
STATUS AEWB_setConfig(AEWB_ConfigData * aewConfig) {
Uint32 addr;
if( (aewConfig->winHeight < 4) || (aewConfig->winHeight > 128) || (aewConfig->winHeight % 2 != 0)
||(aewConfig->winWidth < 2) || (aewConfig->winWidth > 512) || (aewConfig->winWidth % 2 != 0)
||(aewConfig->numWinH < 1) || (aewConfig->numWinH > 12)
||(aewConfig->numWinV < 1) || (aewConfig->numWinV >8)
||(aewConfig->winStartH > 4094) || (aewConfig->winStartH % 2 != 0)
||(aewConfig->winStartV > 4094) || (aewConfig->winStartV % 2 != 0)
||(aewConfig->winIncH < 2) || (aewConfig->winIncH > 32)
||(aewConfig->winIncV < 2) || (aewConfig->winIncV > 32)
||(aewConfig->sdramAddress % 32 != 0) )
{
return E_INVALID_INPUT;
}
H3A_FSET(AEWCTRL,AVE2LMT,aewConfig->saturationLimit);
H3A_FSET(AEWWIN1,WINV,((aewConfig->winHeight / 2) - 1));
H3A_FSET(AEWWIN1,WINH,((aewConfig->winWidth / 2) - 1));
H3A_FSET(AEWWIN2,WINVC,(aewConfig->numWinV - 1));
H3A_FSET(AEWWIN2,WINHC,(aewConfig->numWinH - 1));
H3A_FSET(AEWWIN3,WINSH,(aewConfig->winStartH / 2));
H3A_FSET(AEWWIN4,WINSV,(aewConfig->winStartV / 2));
H3A_FSET(AEWWIN5,AEWINCV, (aewConfig->winIncV / 2 ) - 1 );
H3A_FSET(AEWWIN5,AEWINCH, (aewConfig->winIncH / 2 ) - 1 );
addr = (Uint32)(aewConfig->sdramAddress) - SDRAM_MEMORY_BASE;
addr = addr/32;
H3A_RSET(AEWSDRA2, addr );
H3A_FSET(AEWSDRA1, ADRH, addr >> 16 );
return E_PASS;
}
/**
\brief Enable/Disable Auto Focus
\param enable TRUE:Enable, FALSE:Disable
\return if success, \c E_PASS, else error code
*/
STATUS AF_enable(BOOL enable) {
if(enable == TRUE)
H3A_FSET( H3ACTRL, AFEN, 1);
else
H3A_FSET( H3ACTRL, AFEN, 0);
return E_PASS;
}
/**
\brief Enable/Disable Auto Exposure and White Balance
\param enable TRUE:Enable, FALSE:Disable
\return if success, \c E_PASS, else error code
*/
STATUS AEWB_enable(BOOL enable) {
if(enable == TRUE)
H3A_FSET( H3ACTRL, AEWEN, 1);
else
H3A_FSET( H3ACTRL, AEWEN, 0);
return E_PASS;
}
/**
\brief Gives the SDRAM Address for the buffer of current frame
\return SDRAM address for the current frame buffer
*/
Uint32 AF_getCurFrameDataAddress() {
Uint32 dataAddr;
dataAddr = H3A_FGET(AFSDRA1, ADRH);
dataAddr = dataAddr << 16;
dataAddr |= H3A_RGET(AFSDRA2);
dataAddr *= 32;
dataAddr += (Uint32)SDRAM_MEMORY_BASE;
//If the second buffer is used for current frame
if(H3A_FGET(AFSDRFLG,AFSDRFLG))
{
if((H3A_FGET(AFPAX2,PAXHC) + 1) & 0x1)
dataAddr += (H3A_FGET(AFPAX2,PAXHC) + 1 + 1) * (H3A_FGET(AFPAX2,PAXVC) + 1) * 16;
else
dataAddr += (H3A_FGET(AFPAX2,PAXHC) + 1) * (H3A_FGET(AFPAX2,PAXVC) + 1) * 16;
}
return dataAddr;
}
/**
\brief Gives the SDRAM Address for the buffer of current frame
\return SDRAM address for the current frame buffer
*/
Uint32 AEWB_getCurFrameDataAddress() {
Uint32 dataAddr;
dataAddr = H3A_FGET(AEWSDRA1, ADRH);
dataAddr = dataAddr << 16;
dataAddr |= H3A_RGET(AEWSDRA2);
dataAddr *= 32;
dataAddr += (Uint32)SDRAM_MEMORY_BASE;
//If the second buffer is used for current frame
if(H3A_FGET(AEWSDRFLG,AEWSDRFLG))
{
if((H3A_FGET(AEWWIN2,WINHC) + 1) & 0x1)
dataAddr += (H3A_FGET(AEWWIN2,WINHC) + 1 + 1) * (H3A_FGET(AEWWIN2,WINVC) + 1) * 32;
else
dataAddr += (H3A_FGET(AEWWIN2,WINHC) + 1) * (H3A_FGET(AEWWIN2,WINVC) + 1) * 32;
}
return dataAddr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -