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