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

📄 ccdc270.c

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

    (c)Texas Instruments 2003
*/

/**
    \file ccdc270.c
    \brief CCD Controller Related APIs
*/
#include <ccdc270.h>


/**
    \brief  Set CCDC configuration parameters

    \param ccdcConfig   CCDC configuration parameters

    \return if success, \c E_PASS, else error code

    \see CCDC_ConfigData
*/
STATUS CCDC_setConfig( CCDC_ConfigData *ccdcConfig ){

    CCDC_FSET( MODESET, IMPMOD,     ccdcConfig->dataInputMode                           );
    CCDC_FSET( MODESET, DATSIZ,     14 - ccdcConfig->ccdDataWidth                       );
    CCDC_FSET( MODESET, FLDMODE,    ccdcConfig->ccdModeInterlace == TRUE ? 1 : 0        );
    CCDC_FSET( MODESET, DATAPOL,    ccdcConfig->dataPolarityInverse == TRUE ? 1 : 0     );
    CCDC_FSET( MODESET, EXWEN,      ccdcConfig->useWen == TRUE ? 1 : 0                  );
    CCDC_FSET( MODESET, FLDPOL,     ccdcConfig->fieldIdPolarityNegative == TRUE ? 1 : 0 );
    CCDC_FSET( MODESET, HDPOL,      ccdcConfig->hdPolarityNegative == TRUE ? 1 : 0      );
    CCDC_FSET( MODESET, VDPOL,      ccdcConfig->vdPolarityNegative == TRUE ? 1 : 0      );
    CCDC_FSET( MODESET, FLDOUT,     ccdcConfig->fieldIdDirOutput == TRUE ? 1 : 0        );
    CCDC_FSET( MODESET, VDHDOUT,    ccdcConfig->hdvdDirOutput == TRUE ? 1 : 0           );

    return E_PASS;
}

/**
    \brief  Set CCDC mode parameters

    \param ccdcMode     CCDC mode parameters

    \return if success, \c E_PASS, else error code

    \see CCDC_ModeData
*/
STATUS CCDC_setMode( CCDC_ModeData *ccdcMode){

    CCDC_RSET( HDWIDTH, ccdcMode->hdWidth - 1            );
    CCDC_RSET( VDWIDTH, ccdcMode->vdWidth - 1            );
    CCDC_RSET( PPLN,    ccdcMode->pixelsPerLine - 1    );
    CCDC_RSET( LPFR,    ccdcMode->linesPerFrame*2 - 1  );
    CCDC_RSET( SPH,     ccdcMode->startPixelH          );
    CCDC_RSET( NPH,     ccdcMode->numPixelH - 1        );
    CCDC_RSET( SLV0,    ccdcMode->startLineVEvenField  );
    CCDC_RSET( SLV1,    ccdcMode->startLineVOddField   );
    CCDC_RSET( NLV,     ccdcMode->numPixelV - 1        );

    CCDC_FSET( CULH, CULHEVN,  ccdcMode->cullPatternHEvenLine );
    CCDC_FSET( CULH, CULHODD,  ccdcMode->cullPatternHOddLine  );

    CCDC_RSET( CULV,    ccdcMode->cullPatternV         );

    CCDC_RSET( SDOFST,  ccdcMode->reg_sdofst    );

    CCDC_RSET( HSIZE,   ccdcMode->sdramLineOffset/32   );

    CCDC_setSdramAddress( ccdcMode->sdramAddress );

    CCDC_FSET( MODESET, PACK8, ccdcMode->sdramStorageMode  );

    CCDC_setVDINTInterval( 0, ccdcMode->vdint0Interval);
    CCDC_setVDINTInterval( 1, ccdcMode->vdint1Interval);

    CCDC_RSET( SHUT, ccdcMode->shutterControlEnable );

    return E_PASS;
}

/**
    \brief  Set CCDC data processing parameters

    \param ccdcProcessing   CCDC data processing parameters

    \return if success, \c E_PASS, else error code

    \see CCDC_ProcessingData
*/
STATUS CCDC_setProcessing( CCDC_ProcessingData *ccdcProcessing){

    CCDC_FSET( MODESET, LPF, ccdcProcessing->hlpfEnable == TRUE ? 1 : 0);

    CCDC_FSET( CLAMP, CLAMPEN, ccdcProcessing->clampEnable == TRUE ? 1: 0);
    CCDC_FSET( CLAMP, OBSLEN,  ccdcProcessing->clampPixel );
    CCDC_FSET( CLAMP, OBSLN,   ccdcProcessing->clampLine );
    CCDC_FSET( CLAMP, OBST,    ccdcProcessing->clampStart );

    CCDC_RSET( DCSUB, ccdcProcessing->dcsubValue );

    CCDC_FSET( COLPTN, EPEL0, ccdcProcessing->colPatFld0EvenEven );
    CCDC_FSET( COLPTN, EPOL0, ccdcProcessing->colPatFld0EvenOdd );
    CCDC_FSET( COLPTN, OPEL0, ccdcProcessing->colPatFld0OddEven );
    CCDC_FSET( COLPTN, OPOL0, ccdcProcessing->colPatFld0OddOdd );

    CCDC_FSET( COLPTN, EPEL1, ccdcProcessing->colPatFld1EvenEven );
    CCDC_FSET( COLPTN, EPOL1, ccdcProcessing->colPatFld1EvenOdd );
    CCDC_FSET( COLPTN, OPEL1, ccdcProcessing->colPatFld1OddEven );
    CCDC_FSET( COLPTN, OPOL1, ccdcProcessing->colPatFld1OddOdd );

    CCDC_FSET( BLKCMP1, R_YE,  ccdcProcessing->offsetR );
    CCDC_FSET( BLKCMP1, GR_CY, ccdcProcessing->offsetGr );
    CCDC_FSET( BLKCMP2, GB_G,  ccdcProcessing->offsetGb );
    CCDC_FSET( BLKCMP2, B_MG,  ccdcProcessing->offsetB );

    CCDC_FSET( MEDFILT, MFEN,  ccdcProcessing->medianFilterEnable == TRUE ? 1 : 0);
    CCDC_FSET( MEDFILT, MFTHR, ccdcProcessing->medianFilterThreshold );

    CCDC_RSET( GAIN,   ccdcProcessing->gain );
    CCDC_RSET( OFFSET, ccdcProcessing->offset );

    CCDC_RSET( OUTTH,  ccdcProcessing->outputThreshold );
    CCDC_RSET( OUTCLIP, ccdcProcessing->outputClip );

    CCDC_FSET( GAMMA, GWDI,   ccdcProcessing->gammaInputWidth );
    CCDC_FSET( GAMMA, H3ATBL, ccdcProcessing->gammaH3AEnable == TRUE ? 1 : 0);
    CCDC_FSET( GAMMA, CCDTBL, ccdcProcessing->gammaCCDCEnable == TRUE ? 1 : 0);

    return E_PASS;
}

/**
    \brief  Enable/Disable CCDC HD/VD, SDRAM write

    \param  hdvdEnable      HD/VD enable, TRUE:Enable, FALSE: disable
    \param  sdrWrEnable     SDRAM Write enable, TRUE:Enable, FALSE: disable

    \return if success, \c E_PASS, else error code
*/
STATUS CCDC_enable( BOOL hdvdEnable, BOOL sdrWrEnable){
    Uint16 value, mask;

    value = CCDC_FMK( SYNCEN, WEN,    sdrWrEnable == TRUE ? 1 : 0 ) |
            CCDC_FMK( SYNCEN, VDHDEN, hdvdEnable  == TRUE ? 1 : 0 );

    mask =  CCDC_FMK( SYNCEN, WEN,    0xFFFF ) |
            CCDC_FMK( SYNCEN, VDHDEN, 0xFFFF );

    CCDC_RAOI( SYNCEN, ~mask, value, 0);

    return E_PASS;
}

/**
    \brief  Set CCDC data write SDRAM address

    \param  sdramAddress    Absolute SDRAM address, must be 32byte aligned

    \return if success, \c E_PASS, else error code
*/
STATUS CCDC_setSdramAddress( char *sdramAddress){
    STATUS status=E_PASS;
    Uint32 addr;

    if( sdramAddress == NULL )
        return E_INVALID_INPUT;

    addr = (Uint32)sdramAddress - SDRAM_MEMORY_BASE;
    if(addr%32!=0)
        status=E_INVALID_INPUT;

    addr /= 32;

    CCDC_RSET( STADRL, addr );
    CCDC_RSET( STADRH, addr >> 16 );

    return status;
}

/**
    \brief  Set VD0, VD1 interrupt interval

    \param  vdintID     0: VD0 interrupt, 1: VD1 interrupt
    \param  interval    VDx interrupt timing, 1..4096 lines from start of VD

    \return if success, \c E_PASS, else error code
*/
STATUS CCDC_setVDINTInterval( Uint8 vdintID, Uint16 interval){
    STATUS status=E_PASS;

    switch(vdintID) {
        case 0:
            CCDC_RSET( VDINT0, interval);
            break;
        case 1:
            CCDC_RSET( VDINT1, interval);
            break;
        default:
            status=E_INVALID_INPUT;
            break;
    }
    return status;
}

/**
    \brief  Enable/Disable REC656 interface

    \param  enable                  REC656 interface, TRUE: enable, FALSE: disable
    \param  errorCorrectionEnable   Error correction, TRUE: enable, FALSE: disable

    \return if success, \c E_PASS, else error code
*/
STATUS CCDC_rec656Enable( BOOL enable, BOOL errorCorrectionEnable){
    Uint16 value, mask;

    value = CCDC_FMK( REC656IF, ECCFVH, errorCorrectionEnable == TRUE ? 1 : 0 ) |
            CCDC_FMK( REC656IF, R656ON, enable == TRUE ? 1 : 0 );

    mask  = CCDC_FMK( REC656IF, ECCFVH, 0xFFFF ) |
            CCDC_FMK( REC656IF, R656ON, 0xFFFF );

    CCDC_RAOI( REC656IF, ~mask, value, 0);

    return E_PASS;
}

/**
    \brief  CCDC Misc Control.

    This routine writes the 'ctrlValue' to register CCDCFG

    \param ctrlValue        register CCDCFG value

    \return if success, \c E_PASS, else error code
*/
STATUS CCDC_miscControl( Uint16 ctrlValue ){
    CCDC_RSET( CCDCFG, ctrlValue );
    return E_PASS;
}

⌨️ 快捷键说明

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