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

📄 saa7114.c

📁 dm642下的saa7114解码芯片的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    taskPtr->xPreScale = taskPtr->xInputLength / taskPtr->xOutputLength;
    if(taskPtr->xPreScale == 0){
        taskPtr->xPreScale = 1; 
    }
    else if(taskPtr->xPreScale > 63){
        taskPtr->xPreScale = 63;     
    }
    taskPtr->xAccLength = _SAA7114_xScale.xValues[taskPtr->xPreScale].acl;
    xRatio = 100 * taskPtr->xInputLength;
    xRatio /= taskPtr->xOutputLength;
    if(xRatio > 275){
        firLuma = 3; 
    }else if(xRatio > 200){
        firLuma = 2;      
    }else if(xRatio >= 170){
        firLuma = 1;        
    }else{
        firLuma = 0;
    }
    firChroma = firLuma;

    taskPtr->xACLWeighting = _SAA7114_xScale.xValues[taskPtr->xPreScale].c21;
    taskPtr->scalerDCGain = _SAA7114_xScale.xValues[taskPtr->xPreScale].dcGain;
    taskPtr->yPreFilterType = firLuma;
    taskPtr->cxPreFilterType = firChroma;

    xLumaInc = 1024 * taskPtr->xInputLength;
    xLumaInc /= taskPtr->xOutputLength;
    xLumaInc /= taskPtr->xPreScale;
    if(xLumaInc > 0x1FFF){
        xLumaInc = 0x1FFF;
    }

    yRatio = 100 * taskPtr->yInputLength;
    yRatio /= taskPtr->yOutputLength;
    taskPtr->brightness = 0x80;
    if(yRatio < 125){
        lpiMode = 0;
        taskPtr->contrast = 64;
        taskPtr->saturation = 64;
    }else{
        lpiMode = 1;
        saturation = 64 * taskPtr->yOutputLength;
        saturation /= taskPtr->yInputLength;
        taskPtr->contrast = (Uint8)saturation;
        taskPtr->saturation = (Uint8)saturation;
    }

    taskPtr->xLumaIncrement = xLumaInc;
    taskPtr->xChromaIncrement = xLumaInc / 2;
    taskPtr->xLumaPhaseOffset = 0;
    taskPtr->xChromaPhaseOffset = 0;

    yLumaInc = 1024 * taskPtr->yInputLength;
    yLumaInc /= taskPtr->yOutputLength;
    if(yLumaInc > 0xFFFF){
        yLumaInc = 0xFFFF;
    }
    taskPtr->yLumaIncrement = yLumaInc;
    taskPtr->yChromaIncrement = yLumaInc;
    taskPtr->verticalScalingType = lpiMode;

    for(i = 0; i < 4; i ++){
        taskPtr->yLumaPhaseOffset[i] = 0;
        taskPtr->yChromaPhaseOffset[i] = 0;
    }

    if(frameType == INTERLACED){
        taskPtr->eventTrigger = 1;
    }
    else {
        if(taskPtr == &regPtr->taskA){
            taskPtr->eventTrigger = 2;
        }else{
            taskPtr->eventTrigger = 3;
        }         
    }
    if(task == _SAA7114_TASKA){
        _IIC_write(hI2C[channel], addrI2C,0x90,(Uint8 *)taskPtr,0x30);  
    }
    else {
        _IIC_write(hI2C[channel], addrI2C,0xC0,(Uint8 *)taskPtr,0x30);  
    }
}


/*
 * ======== setScalerGlobals ========
 */
static void setScalerGlobals(Uns channel)
{
    _SAA7114_Globals *globalPtr;
    Uint8 addrI2C;


    addrI2C = (channel == 0) ? _SAA7114_IIC_ADDR0 : _SAA7114_IIC_ADDR1;
    globalPtr = &_SAA7114_settingsDef[channel].globals;
    _IIC_write(hI2C[channel], addrI2C,0x80,(Uint8 *)globalPtr,9);
}


/*
 * ======== setSAA7114InputFormat ========
 */
static void setSAA7114InputFormat(Int channel, SAA7114_AnalogFormat inFormat)
{
    _SAA7114_Generics *genericPtr; 
    Uint8 addrI2C;


    addrI2C = (channel == 0) ? _SAA7114_IIC_ADDR0 : _SAA7114_IIC_ADDR1;
    genericPtr = &_SAA7114_settingsDef[channel].generics;
    if(inFormat == SAA7114_AFMT_SVIDEO) {
        _SAA7114_settingsDef[channel].generics.analogMuxMode = 7; 
        _SAA7114_settingsDef[channel].generics.bypassYCombFilter = 1; 
        _SAA7114_settingsDef[channel].generics.yCombFilter = 0;
    }    
    else {
        _SAA7114_settingsDef[channel].generics.analogMuxMode = channel; 
        _SAA7114_settingsDef[channel].generics.bypassYCombFilter = 0; 
        _SAA7114_settingsDef[channel].generics.yCombFilter = 1;
    }
    _IIC_write(hI2C[channel], addrI2C, 0x2,(Uint8 *)genericPtr + 2,1);
    _IIC_write(hI2C[channel], addrI2C, 0x9,(Uint8 *)genericPtr + 9,1);
}



/*
 * ======== setSAA7114SyncMode ========
 */
static void setSAA7114SyncMode(Int channel, Bool enableBT656Sync)
{
    _SAA7114_Task *taskPtrA, *taskPtrB;
    _SAA7114_Generics *genericPtr; 
    Uint8 addrI2C;


    addrI2C = (channel == 0) ? _SAA7114_IIC_ADDR0 : _SAA7114_IIC_ADDR1;

    genericPtr = &_SAA7114_settingsDef[channel].generics;
    taskPtrA = &_SAA7114_settingsDef[channel].taskA;
    taskPtrB = &_SAA7114_settingsDef[channel].taskB;

    if(enableBT656Sync) {
        _SAA7114_settingsDef[channel].taskA.ccir656Enable = 1;
        _SAA7114_settingsDef[channel].taskB.ccir656Enable = 1;
    } else {
        _SAA7114_settingsDef[channel].taskA.ccir656Enable = 0;
        _SAA7114_settingsDef[channel].taskB.ccir656Enable = 0;
    }    
    _IIC_write(hI2C[channel], addrI2C,0x93,(Uint8 *)taskPtrA + 3,1);
    _IIC_write(hI2C[channel], addrI2C,0xc3,(Uint8 *)taskPtrB + 3,1);
    _IIC_write(hI2C[channel], addrI2C,0x13,(Uint8 *)genericPtr + 0x13, 1);
    _IIC_write(hI2C[channel], addrI2C,0x1b,(Uint8 *)genericPtr + 0x1b, 1);
    
}
 
/*
 * ======== setupUserDefResolution ========
 */
static void setupUserDefResolution(Arg arg)
{
    SAA7114_ConfParams *saa7114Params = (SAA7114_ConfParams *)arg;    
    if(saa7114Params->outMode == SAA7114_MODE_USER) {
        outModeTbl[SAA7114_MODE_USER][0] = saa7114Params->hSize;
        outModeTbl[SAA7114_MODE_USER][1] = saa7114Params->vSize;
        outModeTbl[SAA7114_MODE_USER][2] = saa7114Params->interlaced;
        
        
    }
    
}

/*
 * ======== SAA7114_close ========
 */
static Int SAA7114_close(EDC_Handle handle) 
{
    Int devId = (int)handle;


    /*First Check if the Handle is correct */
    if(devId == 0 || devId == 1) {
        /*Put _SAA7114 in power down mode */
        powerdownSAA7114(devId, TRUE);
        return EDC_SUCCESS;    
    } else {
        return EDC_FAILED;
    }
}

/*
 * ======== SAA7114_ctrl ========
 */
static Int SAA7114_ctrl(EDC_Handle handle, SAA7114_Cmd cmd, Arg arg)
{
    Int devId = (int)handle;                    
    _SAA7114_Generics *genericPtr; 
    Uint8 addrI2C;
    

    addrI2C = (devId == 0) ? _SAA7114_IIC_ADDR0 : _SAA7114_IIC_ADDR1;
    genericPtr = &_SAA7114_settingsDef[devId].generics;
    /*First Check if the Handle is correct */
    if(devId != 0 && devId != 1) {
        return EDC_FAILED;
    }
    
    switch(cmd) {
        case EDC_CONFIG: {
            SAA7114_ConfParams *saa7114Params = (SAA7114_ConfParams *)arg;
            hI2C[devId] = saa7114Params->hI2C;
            enableIPortOutput(devId, saa7114Params->enableIPortOutput);
            setupUserDefResolution(arg);
            configSAA7114(devId, saa7114Params->inMode, saa7114Params->outMode, 
                saa7114Params->aFmt);
            setSAA7114SyncMode(devId, saa7114Params->enableBT656Sync);
        }
        break;
        case EDC_RESET:
        resetSAA7114(devId);
        break;
        case SAA7114_POWERDOWN:
        powerdownSAA7114(devId, TRUE);
        break;                 
        case SAA7114_POWERUP:
        powerdownSAA7114(devId, FALSE);
        break;
        case SAA7114_SET_AMUXMODE:
        _SAA7114_settingsDef[devId].generics.analogMuxMode = (int)arg; 
        if((int)arg >= 6) {/* svideo input */
            _SAA7114_settingsDef[devId].generics.bypassYCombFilter = 1; 
           _SAA7114_settingsDef[devId].generics.yCombFilter = 0;
        }else {
            _SAA7114_settingsDef[devId].generics.bypassYCombFilter = 0;         
           _SAA7114_settingsDef[devId].generics.yCombFilter = 1;
        }
        _IIC_write(hI2C[0], addrI2C,0x2,(Uint8 *)genericPtr + 2,1);
        _IIC_write(hI2C[0], addrI2C,0x9,(Uint8 *)genericPtr + 9,1);
        break;
    }
    return EDC_SUCCESS;
}

 
/*
 * ======== SAA7114_open ========
 */
static EDC_Handle SAA7114_open(String devName, Arg optArg)
{
    Int devId;


    /* Check if the addresse is correct */
    if(devName[0] != '/') {
        devId = -1;
    } else if(devName[1] == '0') {
         devId = 0;
    } else if(devName[1] == '1'){
         devId = 1;
    } else {
         devId = -1;
    }
    return (EDC_Handle)devId;
}


/**************************************************************************/
/* End of file                                                                            */
/**************************************************************************/

⌨️ 快捷键说明

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