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

📄 h3a270.c

📁 dm270 source code
💻 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 + -