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

📄 philips_dtv_nim.c

📁 用于TM1300/PNX1300系列DSP(主要用于视频处理)的设备库的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    }

    iicDirectionUnSelect(IIC_DIRECTION_NIM1);

    return err;
}

#define PATH_STRING_LENGTH 256
/*****************************************************************************************/
static tmLibdevErr_t nim_board_activate(pcomponent_t comp)
{
    UInt                iicd;
    UInt32              ID;
    Char                *boardName;
    tmLibdevErr_t       rval;
    Int                 boardsDetected = 0;
    tmVideoDecoder_t    viDecoder;
    Int                 viSlaveAddr;
    pboardVIConfig_t    viConf     = &nim_vi_2;
    boardAIConfig_t     *aiConf    = &nim_ai_2;
    boardTPConfig_t     *tpConf    = &nim_tp_2;
    unitSelect_t        unitNumber = unit1;
    tsaRegEntryAdd_t    regEntry;
    Char                daughterboardName[] = "NIM board";
    tsaRegDataEntry_t   dataEntry   = {redtChar, 0, Null};
    UInt32              daughterboardsNumberOfUnits;
    UInt32              tvTunerNumberOfUnits;
    UInt32              tvAudDemNumberOfUnits;
    Char                pathString[PATH_STRING_LENGTH];

    L1_DP(("nim_board_activate\n"));

    memset(pathString, 0, PATH_STRING_LENGTH);

    /* Get board ID */
    TRY(tsaBoardGetBoard(&ID, &boardName));

    /* get number of existing daughterboards, tvTuners and tvAudDems */
    TRY(getNumberOfUnits(&daughterboardsNumberOfUnits, "/bsp/daughterboard/*"));
    TRY(getNumberOfUnits(&tvTunerNumberOfUnits, "/bsp/TvTuner/*"));
    TRY(getNumberOfUnits(&tvAudDemNumberOfUnits, "/bsp/TvAudDem/*"));

    /* this would be advisable to register an ID for the NIM board   */
    /* but this kind of stuff does not seem to exist at the point of */
    /* this writing */
    dataEntry.data       = daughterboardName;
    dataEntry.dataLength = strlen(daughterboardName) + 1;
    regEntry.path        = pathString;
    regEntry.entryType   = recData;
    regEntry.entrySize   = 0;
    regEntry.entry       = &dataEntry;    
    regEntry.flags       = TSA_REG_CREATE_ALWAYS;
    strcpy(regEntry.keyString, daughterboardName);
    
    switch (ID)
    {
    case BOARD_VERSION_PHILIPS_DTV_REF3:
        viConf     = &nim_vi_1;
        aiConf     = &nim_ai_1;
        tpConf     = &nim_tp_1;
        unitNumber = unit0;
    case BOARD_VERSION_PHILIPS_TM2700_DEBUG_1_0:
    case BOARD_VERSION_PHILIPS_DTV_REF4:
        /* check if NIM daughterboard is present */
        TRY(iicReadReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, &iicd));

        /* check which video decoder is on the board */
        rval = nim_board_detectDecoder(&viDecoder, &viSlaveAddr);
        if (rval != TMLIBDEV_OK)
            return rval;

        switch (viDecoder)
        {
        case vdtSAA7112:
        case vdtSAA7112V0:
            DP(("nim_board_activate found 7112\n"));
            viConf->vDec.slaveAddr = viSlaveAddr;
            viConf->vDec.handle    = (Pointer) &id7112;
            viConf->standards     |= SAA7112_SUPPORTED_STANDARDS;
            viConf->adapters      |= SAA7112_SUPPORTED_ADAPTERS;
            viConf->capFlags       = SAA7112_CAPABILITIES_FLAGS;
            viConf->outputFormats  = SAA7112_OUTPUT_FORMATS;
            break;
        case vdtSAA7114:
            DP(("nim_board_activate found 7114\n"));
            viConf->vDec.slaveAddr = viSlaveAddr;
            viConf->vDec.handle    = (Pointer) &id7114;
            viConf->standards     |= SAA7114_SUPPORTED_STANDARDS;
            viConf->adapters      |= SAA7114_SUPPORTED_ADAPTERS;
            viConf->capFlags       = SAA7114_CAPABILITIES_FLAGS;
            viConf->outputFormats  = SAA7114_OUTPUT_FORMATS;
            break;
        default:
            DP (("Unknown VI decoder found: 0x%x\n", viDecoder));
            return BOARD_ERR_UNKNOWN_BOARD;
        }

        /* Set video mux to default value */
        TRY(iicWriteReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, 0x3F));

        /* register VI, TP and AI */
        TRY(tsaBoardRegisterTP(unitNumber, tpConf));
        TRY(tsaBoardRegisterVI(unitNumber, viConf));
        TRY(tsaBoardRegisterAI(unitNumber, aiConf));

        /* register tuner */
        audDemUnitID0 = (unitSelect_t) tvAudDemNumberOfUnits;
        tunerConfig0.connections.audDemUnit         = audDemUnitID0;
        tunerConfig0.connections.viUnit             = unitNumber;
        tunerConfig0.connections.viAdapterType      = vaaCVBS;
        tunerConfig0.connections.viAdapterInstance  = 1;
        audDemConfig0.aiUnit                        = unit0; /* While video is connected to unit1 audio is connected to unit0! */
        audDemConfig0.aiAnalogAdapter               = aaaAuxInput1;
        audDemConfig0.tunerID                       = tvTunerNumberOfUnits;
        TRY(tsaBoardRegisterTvTuner(tvTunerNumberOfUnits, &tunerConfig0));
        TRY(tsaBoardRegisterTvAudDem(audDemUnitID0, &audDemConfig0));

        /* workaround so that we can use AI 1 on older TM2 boards, needed for digital AI */
        if ((ID == BOARD_VERSION_PHILIPS_TM2700_DEBUG_1_0) ||
            (ID == BOARD_VERSION_PHILIPS_DTV_REF4))
            TRY(tsaBoardRegisterAI(unit0, &nim_ai_1));

        /* register daughter board */
        sprintf(regEntry.path, "bsp/daughterboard/%02d", daughterboardsNumberOfUnits);
        TRY(tsaRegAddEntry(&regEntry));

        boardsDetected++;
        break;
    case BOARD_VERSION_PHILIPS_DTV_REF4_V3:
        /* first check NIM 2 */
        TRY(iicDirectionSelect(IIC_DIRECTION_NIM2));
        rval = iicReadReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, &iicd);
        if (rval == TMLIBDEV_OK)
        {
            /* check which video decoder is on the board */
            rval = nim_board_detectDecoder(&viDecoder, &viSlaveAddr);
            if (rval != TMLIBDEV_OK)
                return rval;

            switch (viDecoder)
            {
            case vdtSAA7112:
            case vdtSAA7112V0:
                DP(("nim_board_activate found 7112\n"));
                viConf->vDec.slaveAddr = viSlaveAddr;
                viConf->vDec.handle    = (Pointer) &id7112;
                viConf->standards     |= SAA7112_SUPPORTED_STANDARDS;
                viConf->adapters      |= SAA7112_SUPPORTED_ADAPTERS;
                viConf->capFlags       = SAA7112_CAPABILITIES_FLAGS;
                viConf->outputFormats  = SAA7112_OUTPUT_FORMATS;
                break;
            case vdtSAA7114:
                DP(("nim_board_activate found 7114\n"));
                viConf->vDec.slaveAddr = viSlaveAddr;
                viConf->vDec.handle    = (Pointer) &id7114;
                viConf->standards     |= SAA7114_SUPPORTED_STANDARDS;
                viConf->adapters      |= SAA7114_SUPPORTED_ADAPTERS;
                viConf->capFlags       = SAA7114_CAPABILITIES_FLAGS;
                viConf->outputFormats  = SAA7114_OUTPUT_FORMATS;
                break;
            default:
                DP (("Unknown VI decoder found: 0x%x\n", viDecoder));
                return BOARD_ERR_UNKNOWN_BOARD;
            }

            /* Set video mux to default value */
            TRY(iicWriteReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, 0x3F));

            /* register VI, TP and AI */
            TRY(tsaBoardRegisterTP(unitNumber, tpConf));
            TRY(tsaBoardRegisterVI(unitNumber, viConf));
            TRY(tsaBoardRegisterAI(unitNumber, aiConf));

            /* register tuner and audio demodulator*/
            audDemUnitID1 = (unitSelect_t) tvAudDemNumberOfUnits++;
            tunerConfig1.connections.audDemUnit         = audDemUnitID1;
            tunerConfig1.connections.viUnit             = unit1;
            tunerConfig1.connections.viAdapterType      = vaaCVBS;
            tunerConfig1.connections.viAdapterInstance  = 1;
            audDemConfig1.aiUnit                        = unit1;
            audDemConfig1.aiAnalogAdapter               = aaaAuxInput1;
            audDemConfig1.tunerID                       = tvTunerNumberOfUnits;
            TRY(tsaBoardRegisterTvTuner(tvTunerNumberOfUnits++, &tunerConfig1));
            TRY(tsaBoardRegisterTvAudDem(audDemUnitID1, &audDemConfig1));

            /* register daughter board */
            sprintf(regEntry.path, "bsp/daughterboard/%02d", daughterboardsNumberOfUnits++);
            TRY(tsaRegAddEntry(&regEntry));

            boardsDetected++;
        }
        iicDirectionUnSelect(IIC_DIRECTION_NIM2);

    case BOARD_VERSION_PHILIPS_DTV_REF5: /* REF5 board uses NX2600 and therefore has only one NIM connector */
        /* now check NIM 1 */
        TRY(iicDirectionSelect(IIC_DIRECTION_NIM1));
        rval = iicReadReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, &iicd);
        if (rval == TMLIBDEV_OK)
        {
            viConf     = &nim_vi_1;
            aiConf     = &nim_ai_1;
            tpConf     = &nim_tp_1;
            unitNumber = unit0;

            /* check which video decoder is on the board */
            rval = nim_board_detectDecoder(&viDecoder, &viSlaveAddr);
            if (rval != TMLIBDEV_OK)
                return rval;

            switch (viDecoder)
            {
            case vdtSAA7112:
            case vdtSAA7112V0:
                DP(("nim_board_activate found 7112\n"));
                viConf->vDec.slaveAddr = viSlaveAddr;
                viConf->vDec.handle    = (Pointer) &id7112;
                viConf->standards     |= SAA7112_SUPPORTED_STANDARDS;
                viConf->adapters      |= SAA7112_SUPPORTED_ADAPTERS;
                viConf->capFlags       = SAA7112_CAPABILITIES_FLAGS;
                viConf->outputFormats  = SAA7112_OUTPUT_FORMATS;
                break;
            case vdtSAA7114:
                DP(("nim_board_activate found 7114\n"));
                viConf->vDec.slaveAddr = viSlaveAddr;
                viConf->vDec.handle    = (Pointer) &id7114;
                viConf->standards     |= SAA7114_SUPPORTED_STANDARDS;
                viConf->adapters      |= SAA7114_SUPPORTED_ADAPTERS;
                viConf->capFlags       = SAA7114_CAPABILITIES_FLAGS;
                viConf->outputFormats  = SAA7114_OUTPUT_FORMATS;
                break;
            default:
                DP (("Unknown VI decoder found: 0x%x\n", viDecoder));
                return BOARD_ERR_UNKNOWN_BOARD;
            }

            /* Set video mux to default value */
            TRY(iicWriteReg(VIDMUX_IIC_EXPANDER_ADDRESS, -1, 0x3F));

            /* register VI, TP and AI */
            TRY(tsaBoardRegisterTP(unitNumber, tpConf));
            TRY(tsaBoardRegisterVI(unitNumber, viConf));
            TRY(tsaBoardRegisterAI(unitNumber, aiConf));

            /* register tuner and audio demodulator */
            audDemUnitID0 = (unitSelect_t) tvAudDemNumberOfUnits;
            tunerConfig0.connections.audDemUnit         = audDemUnitID0;
            tunerConfig0.connections.viUnit             = unit0;
            tunerConfig0.connections.viAdapterType      = vaaCVBS;
            tunerConfig0.connections.viAdapterInstance  = 1;
            audDemConfig0.aiUnit                        = unit0;
            audDemConfig0.aiAnalogAdapter               = aaaAuxInput1;
            audDemConfig0.tunerID                       = tvTunerNumberOfUnits;
            TRY(tsaBoardRegisterTvTuner(tvTunerNumberOfUnits, &tunerConfig0));
            TRY(tsaBoardRegisterTvAudDem(audDemUnitID0, &audDemConfig0));

            /* register daughter board */
            sprintf(regEntry.path, "bsp/daughterboard/%02d", daughterboardsNumberOfUnits);
            TRY(tsaRegAddEntry(&regEntry));

            boardsDetected++;
        }
        iicDirectionUnSelect(IIC_DIRECTION_NIM1);
        break;
    default:
        return BOARD_ERR_UNKNOWN_BOARD;
    }    
    
    if (boardsDetected > 0)
    {
        DP(("%d NIM board[s] detected and registered.\n", boardsDetected));
        return TMLIBDEV_OK;
    }
    else
        return BOARD_ERR_UNKNOWN_BOARD;
}

static tmLibdevErr_t nim_board_detectDecoder(tmVideoDecoder_t *decoder, int * nSlaveAddress)      
{
    Bool  bFound = False;                           /* Found any IC? */
    UInt8 ucLoop;                                   /* Loop counter for all */
                                                    /* possible devices */
    UInt8 ucCount;                                  /* Counter for chip ID bytes */
    UInt8 ucRead[20];                               /* Read data buffer  */
    UInt8 ucWrite[2];                               /* Write data buffer */

    /* Possible decoder slave addresses */
#define NUM_SLAVE 4
    UInt8 m_nSlaveAddresses [NUM_SLAVE] = { 0x40, 0x42, 0x48, 0x4a };

    /* Chip ID SAA7111 */
    UInt8 SAA7111Code[7] =  {'\xf', '\x7', '\x1', '\x1', '\x1', '\xd', '\x0'};
    /* Chip ID SAA7111A */
    UInt8 SAA7111ACode[7] = {'\xf', '\x7', '\x1', '\x1', '\x1', '\xd', '\x1'};
    /* Chip ID SAA7112 V0 */
    UInt8 SAA7112V0Code[7] = {'\x0', '\x0', '\x0', '\x0', '\x0', '\x0', '\x0'};
    /* Chip ID SAA7112 */
    UInt8 SAA7112Code[7] = {'\xf', '\x7', '\x1', '\x1', '\x2', '\xd', '\x0'};
    /* Chip ID SAA7113 A */
    UInt8 SAA7113ACode[9] = {'\xf', '\x7', '\x1', '\x1', '\x3', '\xd', '\x1', '\xe', '\x0'};
    /* Chip ID SAA7113 V0 */
    UInt8 SAA7113V0Code[9] = {'\xf', '\x7', '\x1', '\x1', '\x3', '\xd', '\x0', '\xe', '\x0'};
    /* Chip ID SAA7113 */
    UInt8 SAA7113Code[9] = {'\xf', '\x7', '\x1', '\x1', '\x3', '\xd', '\x0', '\xe', '\x1'};
    /* Chip ID SAA7114 */
    UInt8 SAA7114Code[9] = {'\xf', '\x7', '\x1', '\x1', '\x4', '\xd', '\x0', '\xe', '\x0'};

    Int instance = 0;
    iicRequest_t req;
    tmLibdevErr_t err;

    /* Default to no decoder */
    *decoder = vdtNone;

    if (err = iicOpen(&instance))
        return err;
            
    /* Repeat loop for all possible addresses until decoder found */
    for (ucLoop = 0; ucLoop < NUM_SLAVE && !bFound; ucLoop++)
    {
        ucWrite[0] = 0;                             /* Set register */
        ucWrite[1] = 0;                             /* Set data to write */
                                                    /* one slave address after another */

        req.direction           = IIC_READ;
        req.byteCount           = 1;
        req.address             = m_nSlaveAddresses[ucLoop];
        req.subaddress          = ucWrite [0];
        req.numRetries          = 10;
        req.waitBeforeRetry     = 50;
        req.data                = ucRead;
        req.mode                = IIC_Synchronous_By_Polling;
        req.type                = IIC_SUBADDRESS;
        req.completion_function = Null;

        /* Read the decoder's CC registers */
        err = iicDispatch(instance, &req);

        if (err != TMLIBDEV_OK)                     /* Device with this slave */
            continue;                               /* address is not accessible */
        else                                        /* Device responds on this */
        {                                           /* address */
            for (ucCount = 0; ucCount < 20; ucCount++)
            {
                req.direction           = IIC_WRITE;
                req.byteCount           = 2;
                req.subaddress          = 0;
                req.data                = ucWrite;
                req.type                = IIC_SIMPLE;
                ucWrite[1] = ucCount;
                err = iicDispatch(instance, &req);

                req.direction           = IIC_READ;
                req.byteCount           = 1;
                req.subaddress          = 0;
                req.data                = &ucRead[ucCount];
                req.type                = IIC_SUBADDRESS;
                err = iicDispatch(instance, &req);

                if (err == TMLIBDEV_OK)
                    ucRead[ucCount] &= 0x0f;        /* Only lower nibble */
            }
            /* Check read bytes for IC specific ID */
            if (!memcmp(&ucRead[1], SAA7111Code, 7))
            {
                *decoder = vdtSAA7111;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
            else if (!memcmp(&ucRead[1], SAA7111ACode, 7))
            {
                *decoder = vdtSAA7111A;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
            else if (!memcmp(&ucRead[1], SAA7112Code, 7))
            {
                *decoder = vdtSAA7112;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
            else if (!memcmp(&ucRead[1], SAA7112V0Code, 7))
            {
                if ((m_nSlaveAddresses[ucLoop] == 0x40) ||
                    (m_nSlaveAddresses[ucLoop] == 0x42))
                {
                    *decoder = vdtSAA7112V0;
                    *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                    bFound = True;
                    break;
                }
            }
            else if (!memcmp(&ucRead[1], SAA7113ACode, 9))
            {
                *decoder = vdtSAA7113A;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
            else if (!memcmp(&ucRead[1], SAA7113V0Code, 9))
            {
                *decoder = vdtSAA7113V0;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
            else if (!memcmp(&ucRead[1], SAA7113Code, 9))
            {
                *decoder = vdtSAA7113;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
            else if (!memcmp(&ucRead[1], SAA7114Code, 9))
            {
                *decoder = vdtSAA7114;
                *nSlaveAddress = m_nSlaveAddresses[ucLoop];
                bFound = True;
                break;
            }
        }
    }

    err |= iicClose(instance);

    return err;
}

TSA_COMP_DEF_IO_COMPONENT(nim_board, 
                          TSA_COMP_BUILD_ARG_LIST_1("bsp/boardID"), 
                          TSA_COMP_BUILD_ARG_LIST_1("bsp/daughterboard"), 
                          nim_board_activate
                          );





⌨️ 快捷键说明

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