📄 philips_dtv_nim.c
字号:
}
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(®Entry));
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(®Entry));
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(®Entry));
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 + -