提交SMOD ATSC IMX APP版本 V122

This commit is contained in:
2026-07-16 14:35:59 +08:00
commit 7601c270d5
485 changed files with 255032 additions and 0 deletions
+703
View File
@@ -0,0 +1,703 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/08/30
Modification ID : 902dae58eb5249e028ccc5d7f60bb66cca9b43a9
------------------------------------------------------------------------------*/
#include "sony_demod_isdbc.h"
#include "sony_demod_isdbc_monitor.h"
#ifdef SONY_DEMOD_SUPPORT_ISDBC_CHBOND
#include "sony_demod_isdbc_chbond.h"
#endif
/*------------------------------------------------------------------------------
Static Function Prototypes
------------------------------------------------------------------------------*/
/**
@brief Set TSMF output format, TSID(Relative TS number) and network ID
*/
static sony_result_t SetTSMFSetting (sony_demod_t * pDemod,
sony_demod_isdbc_tsmf_mode_t tsmfMode,
sony_isdbc_tsid_type_t tsidType,
uint16_t tsid,
uint16_t networkId);
/**
@brief Configure the demodulator from Sleep to Active for ISDB-C
*/
static sony_result_t SLtoAIC (sony_demod_t * pDemod);
/**
@brief Configure the demodulator from Active ISDB-C to Active to ISDB-C. Used
for changing channel parameters.
*/
static sony_result_t AICtoAIC (sony_demod_t * pDemod);
/**
@brief Configure the demodulator from Active ISDB-C to Sleep.
*/
static sony_result_t AICtoSL (sony_demod_t * pDemod);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_demod_isdbc_Tune (sony_demod_t * pDemod, sony_isdbc_tune_param_t * pTuneParam)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_demod_isdbc_Tune");
if ((!pDemod) || (!pTuneParam)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pDemod->state == SONY_DEMOD_STATE_ACTIVE) && (pDemod->system == SONY_DTV_SYSTEM_ISDBC)) {
pDemod->bandwidth = SONY_DTV_BW_6_MHZ;
/* Demodulator Active and set to ISDB-C mode */
result = SetTSMFSetting(pDemod, pTuneParam->tsmfMode, pTuneParam->tsidType, pTuneParam->tsid, pTuneParam->networkId);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = AICtoAIC (pDemod);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
else if((pDemod->state == SONY_DEMOD_STATE_ACTIVE) && (pDemod->system != SONY_DTV_SYSTEM_ISDBC)){
/* Demodulator Active but not ISDB-C mode */
result = sony_demod_Sleep (pDemod);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
pDemod->system = SONY_DTV_SYSTEM_ISDBC;
pDemod->bandwidth = SONY_DTV_BW_6_MHZ;
result = SetTSMFSetting(pDemod, pTuneParam->tsmfMode, pTuneParam->tsidType, pTuneParam->tsid, pTuneParam->networkId);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = SLtoAIC (pDemod);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
else if (pDemod->state == SONY_DEMOD_STATE_SLEEP) {
/* Demodulator in Sleep mode */
pDemod->system = SONY_DTV_SYSTEM_ISDBC;
pDemod->bandwidth = SONY_DTV_BW_6_MHZ;
result = SetTSMFSetting(pDemod, pTuneParam->tsmfMode, pTuneParam->tsidType, pTuneParam->tsid, pTuneParam->networkId);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = SLtoAIC (pDemod);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Update demodulator state */
pDemod->state = SONY_DEMOD_STATE_ACTIVE;
SONY_TRACE_RETURN (result);
}
sony_result_t sony_demod_isdbc_Sleep (sony_demod_t * pDemod)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_demod_isdbc_Sleep");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pDemod->state != SONY_DEMOD_STATE_SLEEP) && (pDemod->state != SONY_DEMOD_STATE_ACTIVE)) {
/* This api is accepted in Sleep and Active states only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = AICtoSL (pDemod);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_demod_isdbc_CheckTSLock (sony_demod_t * pDemod,
sony_demod_lock_result_t * pLock)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t arLock = 0;
uint8_t tsLock = 0;
uint8_t unlockDetected = 0;
SONY_TRACE_ENTER ("sony_demod_isdbc_CheckTSLock");
if ((!pDemod) || (!pLock)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = sony_demod_isdbc_monitor_SyncStat (pDemod, &arLock, &tsLock, &unlockDetected);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
if (pDemod->scanMode) {
if (unlockDetected == 1) {
*pLock = SONY_DEMOD_LOCK_RESULT_UNLOCKED;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
}
if (arLock == 0) {
*pLock = SONY_DEMOD_LOCK_RESULT_NOTDETECT;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
*pLock = tsLock ? SONY_DEMOD_LOCK_RESULT_LOCKED : SONY_DEMOD_LOCK_RESULT_NOTDETECT;
SONY_TRACE_RETURN (result);
}
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t SetTSMFSetting (sony_demod_t * pDemod,
sony_demod_isdbc_tsmf_mode_t tsmfMode,
sony_isdbc_tsid_type_t tsidType,
uint16_t tsid,
uint16_t networkId)
{
uint8_t mode = 0;
uint8_t data[4];
SONY_TRACE_ENTER ("SetTSMFSetting");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((tsidType == SONY_ISDBC_TSID_TYPE_RELATIVE_TS_NUMBER) && (tsid > 0x0F || tsid == 0)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Set SLV-T Bank : 0x49 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x49) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TSMF mode setting
*
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 49h 36h [4:1] 8'h13 8'h13 OREG_TSMF_MODE[1:0],OREG_TSMF_HEADER_PID_CHG_DISABLE,OREG_TSMF_VALID_TSMF_CTRL
*
* OREG_TSMF_MODE[1:0] : 0:Single TS mode,1:Multiple TS mode,2:Auto-detect
*/
mode = ((uint8_t)tsmfMode) << 3;
if (sony_i2c_SetRegisterBits (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x36, mode, 0x18) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (tsidType == SONY_ISDBC_TSID_TYPE_TSID) {
/*
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 49h 37h [4:0] 8'h10 8'h00 OREG_TSMF_RELATIVE_TS_NUM_ON,OREG_TSMF_RELATIVE_TS_NUM[3:0]
* <SLV-T> 49h 32h [7:0] 8'h00 8'hxx OREG_TSMF_TS_ID[15:8]
* <SLV-T> 49h 33h [7:0] 8'h00 8'hxx OREG_TSMF_TS_ID[7:0]
* <SLV-T> 49h 34h [7:0] 8'h00 8'hxx OREG_TSMF_ORIG_NETWORK_ID[15:8]
* <SLV-T> 49h 35h [7:0] 8'h00 8'hxx OREG_TSMF_ORIG_NETWORK_ID[7:0]
*
* OREG_TSMF_TS_ID[15:0] : the TS ID of the desired TS
* OREG_TSMF_ORIG_NETWORK_ID[15:0] : the Original network ID of the desired TS
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x37, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
data[0] = (uint8_t)((tsid >> 8) & 0xFF);
data[1] = (uint8_t)(tsid & 0xFF);
data[2] = (uint8_t)((networkId >> 8) & 0xFF);
data[3] = (uint8_t)(networkId & 0xFF);
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x32, data, 4) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
} else {
/*
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 49h 37h [4:0] 8'h10 8'h1x OREG_TSMF_RELATIVE_TS_NUM_ON,OREG_TSMF_RELATIVE_TS_NUM[3:0]
*
* OREG_TSMF_RELATIVE_TS_NUM[3:0] : the Relative TS number(1~15) of the desired TS
*/
data[0] = 0x10 | (uint8_t)(tsid & 0x0F);
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x37, data[0]) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t SLtoAIC (sony_demod_t * pDemod)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("SLtoAIC");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
#ifdef SONY_DEMOD_SUPPORT_ISDBC_CHBOND
if (pDemod->chbondConfig == SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
result = sony_demod_isdbc_chbond_Enable (pDemod, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
if ((pDemod->isdbcChBondOutput == SONY_DEMOD_OUTPUT_ISDBC_CHBOND_TS) || (pDemod->isdbcChBondOutput == SONY_DEMOD_OUTPUT_ISDBC_CHBOND_TS_TLV_AUTO)) {
/* Configure TS clock Mode and Frequency */
result = sony_demod_SetTSClockModeAndFreq (pDemod, SONY_DTV_SYSTEM_ISDBC);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
#ifdef SONY_DEMOD_SUPPORT_TLV
if ((pDemod->isdbcChBondOutput == SONY_DEMOD_OUTPUT_ISDBC_CHBOND_TLV) || (pDemod->isdbcChBondOutput == SONY_DEMOD_OUTPUT_ISDBC_CHBOND_TS_TLV_AUTO)) {
/* Configure TLV clock Mode and Frequency. */
result = sony_demod_SetTLVClockModeAndFreq (pDemod, SONY_DTV_SYSTEM_ISDBC);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
#endif
} else
#endif
{
/* Configure TS clock Mode and Frequency */
result = sony_demod_SetTSClockModeAndFreq (pDemod, SONY_DTV_SYSTEM_ISDBC);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
/* Set SLV-X Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set demod mode */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x17, 0x09) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set TS/TLV mode */
{
uint8_t data = 0;
if ((pDemod->chbondConfig == SONY_DEMOD_CHBOND_CONFIG_ISDBC) && (pDemod->isdbcChBondOutput == SONY_DEMOD_OUTPUT_ISDBC_CHBOND_TLV)) {
data = 0x01;
} else {
data = 0x00;
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA9, data) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/* Enable demod clock */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x2C, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TADC setting */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x4B, 0x74) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TADC setting */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x49, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TADC setting */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x18, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x11 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x11) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* BBAGC TARGET level setting
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 11h 6Ah [7:0] 8'h50 8'h48 OREG_ITB_DAGC_TRGT[7:0]
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x6A, 0x48) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x10 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x10) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->tunerOptimize == SONY_DEMOD_TUNER_OPTIMIZE_SONYSILICON) {
/* ASCOT setting ON
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 10h A5h [0] 8'h01 8'h01 OREG_ITB_GDEQ_EN
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA5, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
else {
/* ASCOT setting OFF
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 10h A5h [0] 8'h01 8'h00 OREG_ITB_GDEQ_EN
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA5, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/* Set SLV-T Bank : 0x11 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x11) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
{
/* ISDB-C 24MHz Xtal setting
* Slave Bank Addr Bit Default Value Name
* ---------------------------------------------------------------------------------
* <SLV-T> 11h 33h [7:0] 8'hC8 8'h00 OCTL_IFAGC_INITWAIT[7:0]
* <SLV-T> 11h 34h [7:0] 8'h02 8'h03 OCTL_IFAGC_MINWAIT[7:0]
* <SLV-T> 11h 35h [7:0] 8'h32 8'h3B OCTL_IFAGC_MAXWAIT[7:0]
*/
const uint8_t data[3] = { 0x00, 0x03, 0x3B };
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x33, data, sizeof (data)) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/* Set SLV-T Bank : 0x48 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x48) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* ISDB-C 24MHz Xtal setting
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 48h 2Ch [1] 8'h01 8'h03 OREG_SYNCLOCKUSE
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x2C, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TSIF setting
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 00h CEh [0] 8'h01 8'h01 ONOPARITY
* <SLV-T> 00h CFh [0] 8'h01 8'h01 ONOPARITY_MANUAL_ON
*/
{
const uint8_t data[] = { 0x01, 0x01 };
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xCE, data, sizeof (data)) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/* Set SLV-T Bank : 0x10 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x10) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set tuner and bandwidth specific settings */
/*
* Filter settings for Sony silicon tuners
* slave bank addr bit default name
* ------------------------------------------------------------------
* <SLV-T> 10h A6h [7:0] 8'h1E OREG_ITB_COEF01[7:0]
* <SLV-T> 10h A7h [7:0] 8'h1D OREG_ITB_COEF02[7:0]
* <SLV-T> 10h A8h [7:0] 8'h29 OREG_ITB_COEF11[7:0]
* <SLV-T> 10h A9h [7:0] 8'hC9 OREG_ITB_COEF12[7:0]
* <SLV-T> 10h AAh [7:0] 8'h2A OREG_ITB_COEF21[7:0]
* <SLV-T> 10h ABh [7:0] 8'hBA OREG_ITB_COEF22[7:0]
* <SLV-T> 10h ACh [7:0] 8'h29 OREG_ITB_COEF31[7:0]
* <SLV-T> 10h ADh [7:0] 8'hAD OREG_ITB_COEF32[7:0]
* <SLV-T> 10h AEh [7:0] 8'h29 OREG_ITB_COEF41[7:0]
* <SLV-T> 10h AFh [7:0] 8'hA4 OREG_ITB_COEF42[7:0]
* <SLV-T> 10h B0h [7:0] 8'h29 OREG_ITB_COEF51[7:0]
* <SLV-T> 10h B1h [7:0] 8'h9A OREG_ITB_COEF52[7:0]
* <SLV-T> 10h B2h [7:0] 8'h28 OREG_ITB_COEF61[7:0]
* <SLV-T> 10h B3h [7:0] 8'h9E OREG_ITB_COEF62[7:0]
*/
if (pDemod->tunerOptimize == SONY_DEMOD_TUNER_OPTIMIZE_SONYSILICON) {
const uint8_t itbCoef[14] = {
/* COEF01 COEF02 COEF11 COEF12 COEF21 COEF22 COEF31 COEF32 COEF41 COEF42 COEF51 COEF52 COEF61 COEF62 */
0x31, 0xA8, 0x29, 0x9B, 0x27, 0x9C, 0x28, 0x9E, 0x29, 0xA4, 0x29, 0xA2, 0x29, 0xA8
};
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA6, itbCoef, 14) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
{
/*
* <IF freq setting>
* slave bank addr bit default value name
* ---------------------------------------------------------------------------------
* <SLV-T> 10h B6h [7:0] 8'h1F user defined OREG_DNCNV_LOFRQ_T[23:16]
* <SLV-T> 10h B7h [7:0] 8'h38 user defined OREG_DNCNV_LOFRQ_T[15:8]
* <SLV-T> 10h B8h [7:0] 8'h32 user defined OREG_DNCNV_LOFRQ_T[7:0]
*/
uint8_t data[3];
data[0] = (uint8_t) ((pDemod->iffreqConfig.configISDBC_6 >> 16) & 0xFF);
data[1] = (uint8_t) ((pDemod->iffreqConfig.configISDBC_6 >> 8) & 0xFF);
data[2] = (uint8_t) (pDemod->iffreqConfig.configISDBC_6 & 0xFF);
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xB6, data, sizeof (data)) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/*
* IMR Filter Bandwidth setting
* slave Bank Addr Bit default Value Name
* ---------------------------------------------------------------------------------
* <SLV-T> 11h A3h [4:0] 8'h00 8'h14 OREG_IMR_FORCE_CHANNEL_WIDTH,1'b0,OREG_IMR_CHANNEL_WIDTH[2:0]
*/
/* Set SLV-T Bank : 0x11 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x11) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA3, 0x14) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
{
/* The settings of Symbol rate search range
* slave Bank Addr Bit default Value Name
* ---------------------------------------------------------------------------------
* <SLV-T> 40h 14h [4:0] 8'h1F 8'14 OREG_QAM_ENABLE[4:0]
* <SLV-T> 40h 1Eh [7] 8'h00 8'h80 OREG_DISCRETE_SEARCH
* <SLV-T> 40h 26h [3:0] 8'h09 tsrate1 OREG_TRIAL_SRATE0[11:8]
* <SLV-T> 40h 27h [7:0] 8'h9A tsrate2 OREG_TRIAL_SRATE0[7:0]
* <SLV-T> 40h 28h [3:0] 8'h00 tsrate3 OREG_TRIAL_SRATE1[11:8]
* <SLV-T> 40h 29h [7:0] 8'hEE tsrate4 OREG_TRIAL_SRATE1[7:0]
*/
const uint8_t symRate[4] = {
/* tsrate1 tsrate2 tsrate3 tsrate4 */
0x07, 0x08, 0x07, 0x08
};
/* Set SLV-T Bank : 0x40 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x40) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x14, 0x14) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x1E, 0x80) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x26, symRate, 4) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/* Set SLV-T Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Disable HiZ Setting 1 (TAGC, SAGC(Hi-Z), TSVALID, TSSYNC, TSCLK) */
if (sony_i2c_SetRegisterBits (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x80, 0x08, 0x1F) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Disable HiZ Setting 2 */
result = sony_demod_SetTSDataPinHiZ (pDemod, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
SONY_TRACE_RETURN (result);
}
static sony_result_t AICtoAIC(sony_demod_t * pDemod)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("AICtoAIC");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Disable TS output */
result = sony_demod_SetStreamOutput (pDemod, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
static sony_result_t AICtoSL(sony_demod_t * pDemod)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("AICtoSL");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Disable TS output */
result = sony_demod_SetStreamOutput (pDemod, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Set SLV-T Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Enable Hi-Z setting 1 (TAGC, SAGC, TSVALID, TSSYNC, TSCLK) */
if (sony_i2c_SetRegisterBits (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x80, 0x1F, 0x1F) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Enable Hi-Z setting 2 */
result = sony_demod_SetTSDataPinHiZ (pDemod, 1);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* cancel ISDB-C Demod parameter setting
* slave Bank Addr Bit default Value Name
* ---------------------------------------------------------------------------------
* <SLV-T> 11h A3h [4:0] 8'h00 8'h00 OREG_IMR_FORCE_CHANNEL_WIDTH,1'b0,OREG_IMR_CHANNEL_WIDTH[2:0]
* <SLV-T> 48h 2Ch [1] 8'h01 8'h01 OREG_SYNCLOCKUSE
* <SLV-T> 40h 14h [4:0] 8'h1F 8'h1F OREG_QAM_ENABLE[4:0]
* <SLV-T> 40h 1Eh [7] 8'h00 8'h00 OREG_DISCRETE_SEARCH
*/
/* Set SLV-T Bank : 0x11 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x11) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA3, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x48 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x48) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x2C, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x40 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x40) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x14, 0x1F) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x1E, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-X Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TADC setting */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x18, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TADC setting */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x49, 0x33) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TADC setting */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x4B, 0x21) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Demodulator SW reset */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xFE, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Disable demodulator clock */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x2C, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set tstlv mode to default */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xA9, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set demodulator mode to default */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x17, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
#ifdef SONY_DEMOD_SUPPORT_ISDBC_CHBOND
if (pDemod->chbondConfig == SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
result = sony_demod_isdbc_chbond_Enable (pDemod, 0);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
#endif
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
+106
View File
@@ -0,0 +1,106 @@
/*------------------------------------------------------------------------------
Copyright 2016 Sony Semiconductor Solutions Corporation
Last Updated : 2016/08/01
Modification ID : b30d76210d343216ea52b88e9b450c8fd5c0359f
------------------------------------------------------------------------------*/
/**
@file sony_demod_isdbc.h
This file provides the demodulator control interface specific to ISDB-C.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DEMOD_ISDBC_H
#define SONY_DEMOD_ISDBC_H
#include "../sony_common.h"
#include "../sony_demod.h"
#include "sony_isdbc.h"
/*------------------------------------------------------------------------------
Enumerations
------------------------------------------------------------------------------*/
/**
@brief TSMF output format.
*/
typedef enum {
/**
@brief Treat the input stream as not containing multiple TS. Pass through mode.
*/
SONY_DEMOD_ISDBC_TSMF_MODE_SINGLE,
/**
@brief Treat the input stream as containing multiple TS. Output slot of the
selected ID, other slots will be replaced to NULL.
*/
SONY_DEMOD_ISDBC_TSMF_MODE_MULTIPLE,
/**
@brief Automatically select between the single mode and multiple mode.
After meeting the following two conditions once, output format will be change
Multiple mdoe.
- TSMF header synchronization is locked.
- CRC check is OK
*/
SONY_DEMOD_ISDBC_TSMF_MODE_AUTO
} sony_demod_isdbc_tsmf_mode_t;
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief The tune parameters for a ISDB-C signal
*/
typedef struct sony_isdbc_tune_param_t {
uint32_t centerFreqKHz; /**< Center frequency in kHz of the ISDB-C channel */
sony_demod_isdbc_tsmf_mode_t tsmfMode; /**< TSMF output format */
/**
@brief This parameter is used to tsId indicates whether TSID or relative TS number.
If Relative TS number is selected networkId will be ignored.
*/
sony_isdbc_tsid_type_t tsidType;
uint16_t tsid; /**< TSID */
uint16_t networkId; /**< Network ID */
} sony_isdbc_tune_param_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Enable acquisition on the demodulator for ISDB-C channels. Called from
the integration layer ::sony_integ_isdbc_Tune API.
@param pDemod The demodulator instance
@param pTuneParam The tune parameters.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_Tune (sony_demod_t * pDemod, sony_isdbc_tune_param_t * pTuneParam);
/**
@brief Put the demodulator into ::SONY_DEMOD_STATE_SLEEP state. Can be called
from Active, Shutdown or Sleep states. Called from the integration layer
::sony_integ_Sleep API.
@param pDemod The demodulator instance
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_Sleep (sony_demod_t * pDemod);
/**
@brief Check ISDB-C TS lock status.
@note This API is for checking lock status in tuning stage.
After tuning (while receiving the signal),
please use sony_demod_isdbc_monitor_SyncStat instead
to check current lock status.
@param pDemod The demodulator instance
@param pLock TS lock state
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_CheckTSLock (sony_demod_t * pDemod,
sony_demod_lock_result_t * pLock);
#endif /* SONY_DEMOD_ISDBC_H */
+794
View File
@@ -0,0 +1,794 @@
/*------------------------------------------------------------------------------
Copyright 2018-2019 Sony Semiconductor Solutions Corporation
Last Updated : 2019/10/04
Modification ID : ae1245fdaf66401838902e7214d8494b0f5e5a76
------------------------------------------------------------------------------*/
#include <string.h>
#include <stdlib.h>
#include "sony_demod_isdbc_chbond.h"
#include "sony_demod_isdbc_monitor.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_demod_isdbc_chbond_Enable (sony_demod_t * pDemod,
uint8_t enable)
{
uint8_t enableStreamIn = 0;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_Enable");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Set SLV-X Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* --------------------------------------------------------------------------------
* <SLV-X> 00h C1h [2:0] 8'h00 8'h0x OREG_STREAMIN_EN
*
* Bit[0]: Stream input0 Bit[1]: Stream input1 Bit[2]: Stream input2
* 1: Stream input enble 0:Stream input disable
*/
if (enable) {
enableStreamIn = pDemod->chbondStreamIn;
}
/* Set Stream Input */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVX, 0xC1, enableStreamIn) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (enable) {
uint8_t data[2] = {0x01, 0x09};
/* Channel Bonding initial setting */
/* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 03h 17h [0] 8'h00 8'h01 OREG_SEL_FRAMEVALID
* <SLV-T> 03h 18h [3] 8'h01 8'h09 OREG_IGNORE_STREAMTYPE
*/
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x17, data, 2) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
/* Bonding mode setting */
/*
* slave Bank Addr Bit default Value Name meaning
* --------------------------------------------------------------------------------
* <SLV-T> 03h b1h [0] 8'h00 8'h0x OREG_XCHBOND_ON 0: Channel Bonding Off 1: Channel Bonding On
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xB1, enable) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* TLV output setting (CXD2878 family)
* slave Bank Addr Bit default Value Name
* ---------------------------------------------------------------------------------
* <SLV-T> 01h E8h [0] 8'h00 8'h01 OTLV_WFMT_TIMER_OFF
*/
/* Set SLV-T Bank : 0x01 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x01) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xE8, 0x01) != SONY_RESULT_OK){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_SetTSMFConfig (sony_demod_t * pDemod,
sony_isdbc_tsid_type_t tsidType,
uint16_t tsid,
uint16_t networkId)
{
uint8_t data[4];
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_SetTSMFConfig");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pDemod->state != SONY_DEMOD_STATE_SLEEP) && (pDemod->state != SONY_DEMOD_STATE_ACTIVE)) {
/* This api is accepted in Sleep and Active states only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* For ISDB-C channel bonding only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((tsidType == SONY_ISDBC_TSID_TYPE_RELATIVE_TS_NUMBER) && (tsid > 0x0F || tsid == 0)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (tsidType == SONY_ISDBC_TSID_TYPE_TSID) {
/*
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 03h 10h [7:0] 8'h00 8'hxx OREG_TSMF_TS_ID[15:8]
* <SLV-T> 03h 11h [7:0] 8'h00 8'hxx OREG_TSMF_TS_ID[7:0]
* <SLV-T> 03h 12h [7:0] 8'h00 8'hxx OREG_TSMF_ORIG_NETWORK_ID[15:8]
* <SLV-T> 03h 13h [7:0] 8'h00 8'hxx OREG_TSMF_ORIG_NETWORK_ID[7:0]
*
* OREG_TSMF_TS_ID[15:0] : the TS ID of the desired TS
* OREG_TSMF_ORIG_NETWORK_ID[15:0] : the Original network ID of the desired TS
*/
data[0] = (uint8_t)((tsid >> 8) & 0xFF);
data[1] = (uint8_t)(tsid & 0xFF);
data[2] = (uint8_t)((networkId >> 8) & 0xFF);
data[3] = (uint8_t)(networkId & 0xFF);
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x10, data, 4) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 03h 3fh [4:0] 8'h00 8'h00 OREG_TSMF_RELATIVE_TS_NUM_ON0,OREG_TSMF_RELATIVE_TS_NUM0[3:0] from Ext0
* <SLV-T> 03h 56h [4:0] 8'h00 8'h00 OREG_TSMF_RELATIVE_TS_NUM_ON1,OREG_TSMF_RELATIVE_TS_NUM1[3:0] from Ext1
* <SLV-T> 03h 57h [4:0] 8'h00 8'h00 OREG_TSMF_RELATIVE_TS_NUM_ON2,OREG_TSMF_RELATIVE_TS_NUM2[3:0] from Ext2
* <SLV-T> 03h 58h [4:0] 8'h00 8'h00 OREG_TSMF_RELATIVE_TS_NUM_ON3,OREG_TSMF_RELATIVE_TS_NUM3[3:0] from internal dmd
*
* OREG_TSMF_RELATIVE_TS_NUMx[3:0] : the Relative TS number(1~15) of the desired TS
* OREG_TSMF_RELATIVE_TS_NUM_ONx :
* 0: TS select by the TS ID and the original network ID,
* 1: TS select by the relative TS number
*/
data[0] = data[1] = data[2] = data[3] = 0x00;
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x3F, data[0]) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x56, &data[1], 3) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
} else {
/*
* slave Bank Addr Bit default Value Name
* ----------------------------------------------------------------------------------
* <SLV-T> 03h 3fh [4:0] 8'h00 8'h1x OREG_TSMF_RELATIVE_TS_NUM_ON0,OREG_TSMF_RELATIVE_TS_NUM0[3:0] from Ext0
* <SLV-T> 03h 56h [4:0] 8'h00 8'h1x OREG_TSMF_RELATIVE_TS_NUM_ON1,OREG_TSMF_RELATIVE_TS_NUM1[3:0] from Ext1
* <SLV-T> 03h 57h [4:0] 8'h00 8'h1x OREG_TSMF_RELATIVE_TS_NUM_ON2,OREG_TSMF_RELATIVE_TS_NUM2[3:0] from Ext2
* <SLV-T> 03h 58h [4:0] 8'h00 8'h1x OREG_TSMF_RELATIVE_TS_NUM_ON3,OREG_TSMF_RELATIVE_TS_NUM3[3:0] from internal dmd
*
* OREG_TSMF_RELATIVE_TS_NUMx[3:0] : the Relative TS number(1~15) of the desired TS
* OREG_TSMF_RELATIVE_TS_NUM_ONx :
* 0: TS select by the TS ID and the original network ID,
* 1: TS select by the relative TS number
*/
data[0] = data[1] = data[2] = data[3] = 0x10 | (uint8_t)(tsid & 0x0F);
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x3F, data[0]) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (pDemod->pI2c->WriteRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x56, &data[1], 3) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_SoftReset (sony_demod_t * pDemod)
{
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_SoftReset");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pDemod->state != SONY_DEMOD_STATE_ACTIVE) && (pDemod->state != SONY_DEMOD_STATE_SLEEP)) {
/* This api is accepted in Sleep and Active states only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* For ISDB-C channel bonding only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x00 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x00) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* --------------------------------------------------------------------------------
* <SLV-T> 00h FAh [0] 8'h00 8'h01 OREG_SRST_LCHBOND
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0xFA, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_BondStat (sony_demod_t * pDemod,
sony_demod_isdbc_chbond_state_t * pState)
{
uint8_t data;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_BondStat");
if ((!pDemod) || (!pState)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) || (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC)) {
/* Not ISDB-C or channel boding is not enabled */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit Name meaning
* -------------------------------------------------------------------------------------------------------------------------------
* <SLV-T> 03h 20h [6] IREG_BONDOK 0: Bonding NG 1: Bonding OK
* <SLV-T> 03h 20h [4] IREG_GROUPID_CHK 0: different values or no valid carrier 1: same values
* <SLV-T> 03h 20h [3] IREG_STREAMTYPE_CHK 0: different values or no valid carrier 1: same values
* <SLV-T> 03h 20h [1] IREG_NUMCARRIERS_CHK 0: different values or no valid carrier 1: same values
* <SLV-T> 03h 20h [0] IREG_CARRSEQ_CHK 0: duplication or no valid carrier 1: no duplication
* <SLV-T> 03h 20h [2] IREG_CAL_NUMCARRIERS_CHK 0: different values or no valid carrier 1: same values
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x20, &data, 1) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
pState->bondOK = (data >> 6) & 0x01;
pState->groupIDCheck = (data >> 4) & 0x01;
pState->streamTypeCheck = (data >> 3) & 0x01;
pState->numCarriersCheck = (data >> 1) & 0x01;
pState->carrierSeqCheck = data & 0x01;
pState->calcNumCarriersCheck = (data >> 2) & 0x01;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_BondStat_hold (sony_demod_t * pDemod,
sony_demod_isdbc_chbond_state_t * pState)
{
uint8_t data;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_BondStat_hold");
if ((!pDemod) || (!pState)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) && (pDemod->chbondConfig) != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* Not ISDB-C and Channel Boding is not enable */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit Name meaning
* ----------------------------------------------------------------------------------------------------------------------------------
* <SLV-T> 03h 22h [6] IREG_BOND_NG_HLD 0: Bonding OK 1: Bonding NG
* <SLV-T> 03h 22h [4] IREG_GROUPID_NG_HLD 0: same values 1: different values or no valid carrier
* <SLV-T> 03h 22h [3] IREG_STREAMTYPE_NG_HLD 0: same values 1: different values or no valid carrier
* <SLV-T> 03h 22h [1] IREG_NUMCARR_NG_HLD 0: same values 1: different values or no valid carrier
* <SLV-T> 03h 22h [0] IREG_CARRIER_SEQ_NG_HLD 0: no duplication 1: duplication or no valid carrier
* <SLV-T> 03h 22h [2] IREG_CAL_NUMCARRIERS_NG_HLD 0: same values 1: different values or no valid carrier
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x22, &data, 1) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
data ^= 0x7F;
pState->bondOK = ((data >> 6) & 0x01);
pState->groupIDCheck = ((data >> 4) & 0x01);
pState->streamTypeCheck = ((data >> 3) & 0x01);
pState->numCarriersCheck = ((data >> 1) & 0x01);
pState->carrierSeqCheck = (data & 0x01);
pState->calcNumCarriersCheck = ((data >> 2) & 0x01);
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_ClearBondStat (sony_demod_t * pDemod)
{
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_ClearBondStat");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* For ISDB-C channel bonding only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 1bh [0] 1'b0 1'b1 OREG_CLR_BONDMON
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x1B, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_TLVConvError (sony_demod_t * pDemod,
uint8_t * pError)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data;
sony_demod_isdbc_chbond_state_t chbondState;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_TLVConvError");
if ((!pDemod) || (!pError)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) && (pDemod->chbondConfig) != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* Not ISDB-C and Channel Boding is not enable */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Freeze registers */
if (SLVT_FreezeReg (pDemod) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = sony_demod_isdbc_chbond_monitor_BondStat (pDemod, &chbondState);
if (result != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (result);
}
if (!chbondState.bondOK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_HW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name meaning
* -------------------------------------------------------------------------------------------------------------------------------
* <SLV-T> 03h 16h [0] 1'b1 1'bx OREG_VAR_TLV_EN 0: TS or Fixed length TLV, 1: Variable length TLV
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x16, &data, 1) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (!(data & 0x01)) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_HW_STATE);
}
/*
* slave Bank Addr Bit Name meaning
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 24h [4] IREG_TLVERR_ALL_HLD 0: No TLV error 1: TLV error
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x24, &data, 1) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SLVT_UnFreezeReg (pDemod);
*pError = (data >> 4) & 0x01;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_ClearTLVConvError (sony_demod_t * pDemod)
{
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_ClearTLVConvError");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* For ISDB-C channel bonding only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 19h [0] 1'b0 1'b1 OREG_TLVCHK_RST
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x19, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_CarrierDelay (sony_demod_t * pDemod,
uint32_t * pDelay)
{
uint8_t data[3];
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_CarrierDelay");
if ((!pDemod) || (!pDelay)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) && (pDemod->chbondConfig) != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* Not ISDB-C and Channel Boding is not enable */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit Name
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 1dh [7:0] IREG_MON_VALID,2'd0,IREG_FDELAY[20:16]
* <SLV-T> 03h 1eh [7:0] IREG_FDELAY[15:8]
* <SLV-T> 03h 1fh [7:0] IREG_FDELAY[7:0]
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x1D, data, 3) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
if (!(data[0] & 0x80)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_HW_STATE);
}
*pDelay = ((data[0] & 0x1F) << 16) | (data[1] << 8) | data[2];
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_EWSChange (sony_demod_t * pDemod,
uint8_t * pEWSChange)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data;
sony_demod_isdbc_chbond_state_t chbondState;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_EWSChange");
if ((!pDemod) || (!pEWSChange)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) && (pDemod->chbondConfig) != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* Not ISDB-C and Channel Boding is not enable */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Freeze registers */
if (SLVT_FreezeReg (pDemod) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = sony_demod_isdbc_chbond_monitor_BondStat (pDemod, &chbondState);
if (result != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (result);
}
if (!chbondState.bondOK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_HW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit Name meaning
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 52h [4] IREG_EWS0 from Ext0
* <SLV-T> 03h 52h [5] IREG_EWS1 from Ext1
* <SLV-T> 03h 52h [6] IREG_EWS2 from Ext2
* <SLV-T> 03h 52h [7] IREG_EWS3 from internal dmd
* IREG_EWSX 0:Emergancy boot control is not detected. 1:Emergancy boot control is detected
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x52, &data, 1) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SLVT_UnFreezeReg (pDemod);
*pEWSChange = (data >> 4) & 0x0F;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_ClearEWSChange (sony_demod_t * pDemod)
{
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_ClearEWSChange");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* For ISDB-C channel bonding only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 53h [0] 1'b0 1'b1 OREG_CLR_EWS
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x53, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_VersionChange (sony_demod_t * pDemod,
uint8_t * pVersionChange)
{
sony_result_t result = SONY_RESULT_OK;
uint8_t data;
sony_demod_isdbc_chbond_state_t chbondState;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_VersionChange");
if ((!pDemod) || (!pVersionChange)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) && (pDemod->chbondConfig) != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* Not ISDB-C and Channel Boding is not enable */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Freeze registers */
if (SLVT_FreezeReg (pDemod) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = sony_demod_isdbc_chbond_monitor_BondStat (pDemod, &chbondState);
if (result != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (result);
}
if (!chbondState.bondOK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_HW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit Name meaning
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 52h [0] IREG_VERNUMCHG0 from Ext0
* <SLV-T> 03h 52h [1] IREG_VERNUMCHG1 from Ext1
* <SLV-T> 03h 52h [2] IREG_VERNUMCHG2 from Ext2
* <SLV-T> 03h 52h [3] IREG_VERNUMCHG3 from internal dmd
* IREG_VERNUMCHGx 0:TSMF version number change is not detected. 1:TSMF version number change is detected
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x52, &data, 1) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SLVT_UnFreezeReg (pDemod);
*pVersionChange = data & 0x0F;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_ClearVersionChange (sony_demod_t * pDemod)
{
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_ClearVersionChange");
if (!pDemod) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pDemod->chbondConfig != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* For ISDB-C channel bonding only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/*
* slave Bank Addr Bit default Value Name
* -----------------------------------------------------------------------------------------------
* <SLV-T> 03h 54h [0] 1'b0 1'b1 OREG_CLR_VERNUMCHG
*/
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x54, 0x01) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_StreamType (sony_demod_t * pDemod,
sony_isdbc_chbond_stream_type_t * pStreamType)
{
sony_result_t result = SONY_RESULT_OK;
sony_demod_isdbc_chbond_state_t chbondState;
uint8_t data;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_StreamType");
if ((!pDemod) || (!pStreamType)){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Software state check */
if (pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if ((pDemod->system != SONY_DTV_SYSTEM_ISDBC) && (pDemod->chbondConfig) != SONY_DEMOD_CHBOND_CONFIG_ISDBC) {
/* Not ISDB-C and Channel Boding is not enable */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Freeze registers */
if (SLVT_FreezeReg (pDemod) != SONY_RESULT_OK) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
result = sony_demod_isdbc_chbond_monitor_BondStat (pDemod, &chbondState);
if (result != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (result);
}
if (!chbondState.bondOK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_HW_STATE);
}
/* Set SLV-T Bank : 0x03 */
if (pDemod->pI2c->WriteOneRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x00, 0x03) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
/* slave Bank Addr Bit Name meaning
* ---------------------------------------------------------------------------------------------------------------------------------------
* <SLV-T> 03h 25h [6] IREG_STREAMTYPE 0:TS output, 1:TLV output
*/
if (pDemod->pI2c->ReadRegister (pDemod->pI2c, pDemod->i2cAddressSLVT, 0x25, &data, 1) != SONY_RESULT_OK) {
SLVT_UnFreezeReg (pDemod);
SONY_TRACE_RETURN (SONY_RESULT_ERROR_I2C);
}
SLVT_UnFreezeReg (pDemod);
if (data & 0x40) {
*pStreamType = SONY_ISDBC_CHBOND_STREAM_TYPE_TLV;
} else {
*pStreamType = SONY_ISDBC_CHBOND_STREAM_TYPE_TS_NONE;
}
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
sony_result_t sony_demod_isdbc_chbond_monitor_TSMFHeaderExt (sony_demod_t * pDemod,
sony_isdbc_tsmf_header_t * pTSMFHeader,
sony_isdbc_chbond_tsmf_header_ext_t * pTSMFHeaderExt)
{
int i;
SONY_TRACE_ENTER ("sony_demod_isdbc_chbond_monitor_TSMFHeaderExt");
if ((!pDemod) || (!pTSMFHeader) || (!pTSMFHeaderExt)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
memcpy(&pTSMFHeaderExt->aceewData[0], &pTSMFHeader->privateData[0], 26);
for (i = 0; i < 8; i++) {
pTSMFHeaderExt->streamType[i] = (sony_isdbc_chbond_stream_type_t)((pTSMFHeader->privateData[26] >> (7 - i)) & 0x01);
}
for (i = 0; i < 7; i++) {
pTSMFHeaderExt->streamType[i + 8] = (sony_isdbc_chbond_stream_type_t)((pTSMFHeader->privateData[27] >> (7 - i)) & 0x01);
}
pTSMFHeaderExt->groupID = pTSMFHeader->privateData[28];
pTSMFHeaderExt->numCarriers = pTSMFHeader->privateData[29];
pTSMFHeaderExt->carrierSequence = pTSMFHeader->privateData[30];
pTSMFHeaderExt->numFrames = (pTSMFHeader->privateData[31] >> 4) & 0x0F;
pTSMFHeaderExt->framePosition = pTSMFHeader->privateData[31] & 0x0F;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
+223
View File
@@ -0,0 +1,223 @@
/*------------------------------------------------------------------------------
Copyright 2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/12/13
Modification ID : e402a4dcb0e51a00c34b174334c082c1211eebf1
------------------------------------------------------------------------------*/
/**
@file sony_demod_isdbc_chbond.h
This file provides the demodulator control and monitor interface for ISDB-C channel bonding.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DEMOD_ISDBC_CHBOND_H
#define SONY_DEMOD_ISDBC_CHBOND_H
#include "../sony_demod.h"
#include "sony_isdbc_chbond.h"
#include "sony_isdbc.h"
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief Channel bonding state.
@note For each members, 1 is set if each check is OK.
*/
typedef struct {
uint8_t bondOK; /**< Bonding OK or not */
uint8_t groupIDCheck; /**< Group ID values are same or not */
uint8_t streamTypeCheck; /**< Stream type values are same or not */
uint8_t numCarriersCheck; /**< Number of carriers values are same or not */
uint8_t carrierSeqCheck; /**< Carrier sequence value check is OK or not */
uint8_t calcNumCarriersCheck; /**< Number of valid input carriers are OK or not */
} sony_demod_isdbc_chbond_state_t;
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Enable/disable ISDB-C channel bonding function.
This API is called internally to enable/disable channel bonding.
Note that ISDB-C channel bonding function is available on CXD2878 family only.
@param pDemod The demodulator instance
@param enable Enable/disable setting.
- 0: Disable
- 1: Enable
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_Enable (sony_demod_t * pDemod,
uint8_t enable);
/**
@brief TSMF TS selection after channel bonding.
@param pDemod The demodulator instance
@param tsidType Absolute TSID or relative TS number selection
@param tsid TSID or relative TS number
@param networkId Network ID. Ignored if relative TS number is selected.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_SetTSMFConfig (sony_demod_t * pDemod,
sony_isdbc_tsid_type_t tsidType,
uint16_t tsid,
uint16_t networkId);
/**
@brief Soft reset the ISDB-C channel bonding function.
@param pDemod The demod instance.
@return SONY_RESULT_OK if successfully reset.
*/
sony_result_t sony_demod_isdbc_chbond_SoftReset (sony_demod_t * pDemod);
/**
@brief Channel bonding status monitor (instant)
@param pDemod The demodulator instance
@param pState Channel bonding state
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_BondStat (sony_demod_t * pDemod,
sony_demod_isdbc_chbond_state_t * pState);
/**
@brief Channel bonding status monitor (hold type)
@note This API is used to know some bonding error occurred or not in long time region.
If a error is detected, member of sony_demod_isdbc_chbond_state_t become 0.
::sony_demod_isdbc_chbond_ClearBondStat can be used to clear error state.
@param pDemod The demodulator instance
@param pState Channel bonding state
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_BondStat_hold (sony_demod_t * pDemod,
sony_demod_isdbc_chbond_state_t * pState);
/**
@brief Clear the channel bonding status monitor (hold type).
@param pDemod The demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_ClearBondStat (sony_demod_t * pDemod);
/**
@brief TLV conversion error monitor. (hold type)
@param pDemod The demodulator instance.
@param pError If 1, TLV conversion error is detected.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_TLVConvError (sony_demod_t * pDemod,
uint8_t * pError);
/**
@brief Clear the TLV conversion error monitor.
@param pDemod The demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_ClearTLVConvError (sony_demod_t * pDemod);
/**
@brief Carrier delay monitor.
@param pDemod The demodulator instance.
@param pDelay Delay between valid input carriers. Please divide by 96 to convert us unit.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_CarrierDelay (sony_demod_t * pDemod,
uint32_t * pDelay);
/**
@brief Emergency Warning Broadcasting System(EWS) detection monitor. (hold type)
@param pDemod The demodulator instance.
@param pEWSChange EWS change detection flag.
Bit[0] : Stream from external demod 0
Bit[1] : Stream from external demod 1
Bit[2] : Stream from external demod 2
Bit[3] : Stream from internal demod
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_EWSChange (sony_demod_t * pDemod,
uint8_t * pEWSChange);
/**
@brief Clear the EWS detection flag.
@param pDemod The demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_ClearEWSChange (sony_demod_t * pDemod);
/**
@brief TSMF version number change monitor. (hold type)
@param pDemod The demodulator instance.
@param pVersionChange TSMF version change detection flag.
Bit[0] : Stream from external demod 0
Bit[1] : Stream from external demod 1
Bit[2] : Stream from external demod 2
Bit[3] : Stream from internal demod
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_VersionChange (sony_demod_t * pDemod,
uint8_t * pVersionChange);
/**
@brief Clear the TSMF version change detection flag.
@param pDemod The demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_ClearVersionChange (sony_demod_t * pDemod);
/**
@brief Stream type (TLV or TS) monitor.
@param pDemod The demodulator instance.
@param pStreamType Stream type.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_StreamType (sony_demod_t * pDemod,
sony_isdbc_chbond_stream_type_t * pStreamType);
/**
@brief TSMF header extension information monitor.
@note This API only convert "private data" in sony_isdbc_tsmf_header_t struct.
::sony_demod_isdbc_monitor_TSMFHeader should be called before this API
to get sony_isdbc_tsmf_header_t data.
@param pDemod The demodulator instance.
@param pTSMFHeader TSMF header information got by ::sony_demod_isdbc_monitor_TSMFHeader.
@param pTSMFHeaderExt Converted TSMF header extension information for channel bonding case.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_chbond_monitor_TSMFHeaderExt (sony_demod_t * pDemod,
sony_isdbc_tsmf_header_t * pTSMFHeader,
sony_isdbc_chbond_tsmf_header_ext_t * pTSMFHeaderExt);
#endif /* SONY_DEMOD_ISDBC_CHBOND_H */
File diff suppressed because it is too large Load Diff
+234
View File
@@ -0,0 +1,234 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/07/27
Modification ID : ff73ffebff57618d6a5aa6e2aa9eb009b86060d1
------------------------------------------------------------------------------*/
/**
@file sony_demod_isdbc_monitor.h
This file provides the ISDB-CC demodulator monitor interface.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_DEMOD_ISDBC_MONITOR_H
#define SONY_DEMOD_ISDBC_MONITOR_H
#include "../sony_demod.h"
#include "sony_isdbc.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Acquisition state monitor.
@note Note that early unlock condition should be used in tuning stage ONLY
to detect that there are no desired signal in current frequency quickly.
After tuning, early unlock condition should NOT be used to
know current demodulator lock status.
@param pDemod The demodulator instance.
@param pARLock The demodulator lock state.
- 0: AR not Locked,
- 1: AR Locked,
@param pTSLockStat Indicates the TS lock condition.
- 0: TS not locked.
- 1: TS locked.
@param pUnlockDetected Indicates the early unlock condition, only valid
when demodulator is set to ISDB-C scan mode enabled.
- 0: No early unlock.
- 1: Early unlock.
@return SONY_RESULT_OK on success and pARLock, pTSLockStat and pUnlockDetected are valid.
*/
sony_result_t sony_demod_isdbc_monitor_SyncStat (sony_demod_t * pDemod,
uint8_t * pARLock,
uint8_t * pTSLockStat,
uint8_t * pUnlockDetected);
/**
@brief Monitor the IFAGC value. The actual dB gain is dependent on the attached tuner.
@param pDemod The demodulator instance.
@param pIFAGCOut Value of IFAGC output register value. Unitless.
@return SONY_RESULT_OK if successful and pIFAGCOut valid.
*/
sony_result_t sony_demod_isdbc_monitor_IFAGCOut (sony_demod_t * pDemod,
uint32_t * pIFAGCOut);
/**
@brief Monitor the constellation of the currently tuned channel.
@param pDemod The demodulator instance.
@param pQAM The monitored constellation.
@return SONY_RESULT_OK if successful and pQAM valid.
*/
sony_result_t sony_demod_isdbc_monitor_QAM (sony_demod_t * pDemod,
sony_isdbc_constellation_t * pQAM);
/**
@brief Monitor the symbol rate of the currently tuned channel.
@param pDemod The demodulator instance.
@param pSymRate Symbol rate (Symbol/sec).
@return SONY_RESULT_OK if successful and pSymRate valid.
*/
sony_result_t sony_demod_isdbc_monitor_SymbolRate (sony_demod_t * pDemod,
uint32_t * pSymRate);
/**
@brief Monitors the detected carrier offset of the currently tuned channel.
To get the estimated center frequency of the current channel:
Freq_Est = Freq_Tune + pOffset;
This function will compensate for an inverting tuner architecture if the
demodulator has been configured accordignly using ::SONY_DEMOD_CONFIG_SPECTRUM_INV
config option for ::sony_demod_SetConfig.
@param pDemod The demodulator instance.
@param pOffset Carrier offset value(kHz).
@return SONY_RESULT_OK if successful and pOffset valid.
*/
sony_result_t sony_demod_isdbc_monitor_CarrierOffset (sony_demod_t * pDemod,
int32_t * pOffset);
/**
@brief Monitors the channel spectrum sense.
To ensure correct polarity detection
please use the ::SONY_DEMOD_CONFIG_SPECTRUM_INV config option in
::sony_demod_SetConfig to select the appropriate spectrum inversion
for the tuner output.
@param pDemod The demodulator instance.
@param pSense Indicates the spectrum sense.
@return SONY_RESULT_OK if successful and pSense valid.
*/
sony_result_t sony_demod_isdbc_monitor_SpectrumSense (sony_demod_t * pDemod,
sony_demod_terr_cable_spectrum_sense_t * pSense);
/**
@brief Monitors the estimated SNR register value, clipped to a
maximum of 50dB.
@param pDemod The demodulator instance.
@param pSNR The estimated SNR value in dB x 1000.
@return SONY_RESULT_OK if successful and pSNR valid.
*/
sony_result_t sony_demod_isdbc_monitor_SNR (sony_demod_t * pDemod,
int32_t * pSNR);
/**
@brief Monitor the Pre-RS BER.
@param pDemod The demodulator instance.
@param pBER BER value (Pre-Reed Solomon decoder) x 1e7.
@return SONY_RESULT_OK if successful and pBER valid.
*/
sony_result_t sony_demod_isdbc_monitor_PreRSBER (sony_demod_t * pDemod,
uint32_t * pBER);
/**
@brief Monitors the number RS (Reed-Solomon) errors detected by the
RS decoder over 1 second. Also known as the code word reject count.
@param pDemod The demodulator instance.
@param pPEN The number of RS errors detected over 1 second.
@return SONY_RESULT_OK if successful and pPEN valid.
*/
sony_result_t sony_demod_isdbc_monitor_PacketErrorNumber (sony_demod_t * pDemod,
uint32_t * pPEN);
/**
@brief Monitor the ISDB-C PER (Packet Error Rate).
@param pDemod The demod instance.
@param pPER The estimated PER x 1e6.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_monitor_PER (sony_demod_t * pDemod,
uint32_t * pPER);
/**
@brief Monitor TSMF Header lock status
@param pDemod The demod instance.
@param pTSMFLock Indicates the TSMF header lock status
- 0: TSMF header not locked.
- 1: TSMF locked.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_monitor_TSMFLock (sony_demod_t * pDemod, uint8_t * pTSMFLock);
/**
@brief Monitor the currently acquired TSMF Header information.
This will return SONY_RESULT_ERROR_HW_STATE if the register value is not valid.
@param pDemod The demod instance.
@param pTSMFHeader TSMF Header information.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_monitor_TSMFHeader (sony_demod_t * pDemod, sony_isdbc_tsmf_header_t * pTSMFHeader);
/**
@brief Monitor the version number change in TSMF header.
@note This API is supported in CXD2878 family only.
@param pDemod The demodulator instance.
@param pVersionChange The value of EWS change detection flag.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_monitor_VersionChange (sony_demod_t * pDemod,
uint8_t * pVersionChange);
/**
@brief Clear the version number change detection flag.
@note This API is supported in CXD2878 family only.
@param pDemod The demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_ClearVersionChange (sony_demod_t * pDemod);
/**
@brief Monitor the Emergency Warning Broadcasting System(EWS) detection flag in TSMF header.
@note This API is supported in CXD2878 family only.
@param pDemod The demodulator instance.
@param pEWSChange The value of EWS change detection flag.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_monitor_EWSChange (sony_demod_t * pDemod,
uint8_t * pEWSChange);
/**
@brief Clear the Emergency Warning Broadcasting System(EWS) detection flag.
@note This API is supported in CXD2878 family only.
@param pDemod The demodulator instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_demod_isdbc_ClearEWSChange (sony_demod_t * pDemod);
#endif /* SONY_DEMOD_ISDBC_MONITOR_H */
+213
View File
@@ -0,0 +1,213 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/07/05
Modification ID : c7c68d70868a4a9fb9e0f480d8b940e8a1e8f651
------------------------------------------------------------------------------*/
#include "../sony_integ.h"
#include "sony_integ_isdbc.h"
#include "../sony_demod.h"
#include "sony_demod_isdbc.h"
#include "sony_demod_isdbc_monitor.h"
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_integ_isdbc_Tune (sony_integ_t * pInteg,
sony_isdbc_tune_param_t * pTuneParam)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_integ_isdbc_Tune");
if ((!pInteg) || (!pTuneParam) || (!pInteg->pDemod)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if ((pInteg->pDemod->state != SONY_DEMOD_STATE_SLEEP) && (pInteg->pDemod->state != SONY_DEMOD_STATE_ACTIVE)) {
/* This api is accepted in Sleep and Active states only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Confirm Tune parameters */
if (0 == pTuneParam->centerFreqKHz){
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Tune the demodulator */
result = sony_demod_isdbc_Tune (pInteg->pDemod, pTuneParam);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
if ((pInteg->pTuner) && (pInteg->pTuner->TerrCableTune)) {
/* Enable the I2C repeater */
result = sony_demod_I2cRepeaterEnable (pInteg->pDemod, 0x01);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Tune the RF part */
result = pInteg->pTuner->TerrCableTune (pInteg->pTuner, pTuneParam->centerFreqKHz, SONY_DTV_SYSTEM_ISDBC, SONY_DTV_BW_6_MHZ);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Disable the I2C repeater */
result = sony_demod_I2cRepeaterEnable (pInteg->pDemod, 0x00);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
/* Reset the demod to enable acquisition */
result = sony_demod_TuneEnd (pInteg->pDemod);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Wait for demodulator (TS) lock */
result = sony_integ_isdbc_WaitTSLock (pInteg);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_integ_isdbc_WaitTSLock (sony_integ_t * pInteg)
{
sony_result_t result = SONY_RESULT_OK;
sony_demod_lock_result_t lock = SONY_DEMOD_LOCK_RESULT_NOTDETECT;
sony_stopwatch_t timer;
uint8_t continueWait = 1;
uint32_t elapsed = 0;
SONY_TRACE_ENTER ("sony_integ_isdbc_WaitTSLock");
if ((!pInteg) || (!pInteg->pDemod)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pInteg->pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
/* Wait for demod lock */
result = sony_stopwatch_start (&timer);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
for (;;) {
result = sony_stopwatch_elapsed(&timer, &elapsed);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
if (elapsed >= SONY_ISDBC_WAIT_DEMOD_LOCK) {
continueWait = 0;
}
result = sony_demod_isdbc_CheckTSLock (pInteg->pDemod, &lock);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
switch (lock) {
case SONY_DEMOD_LOCK_RESULT_LOCKED:
SONY_TRACE_RETURN (SONY_RESULT_OK);
case SONY_DEMOD_LOCK_RESULT_UNLOCKED:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_UNLOCK);
default:
/* continue waiting... */
break;
}
/* Check cancellation. */
result = sony_integ_CheckCancellation (pInteg);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
if (continueWait) {
result = sony_stopwatch_sleep (&timer, SONY_ISDBC_WAIT_LOCK_INTERVAL);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
}
else {
result = SONY_RESULT_ERROR_TIMEOUT;
break;
}
}
SONY_TRACE_RETURN (result);
}
sony_result_t sony_integ_isdbc_monitor_RFLevel (sony_integ_t * pInteg, int32_t * pRFLeveldB)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_integ_isdbc_monitor_RFLevel");
if ((!pInteg) || (!pInteg->pDemod) || (!pRFLeveldB)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (pInteg->pDemod->state != SONY_DEMOD_STATE_ACTIVE) {
/* This api is accepted in Active state only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if (pInteg->pDemod->system != SONY_DTV_SYSTEM_ISDBC) {
/* Not ISDB-C*/
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
if (!pInteg->pTuner) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
}
if (pInteg->pTuner->rfLevelFuncTerr == SONY_TUNER_RFLEVEL_FUNC_READ && pInteg->pTuner->ReadRFLevel) {
/* Enable the I2C repeater */
result = sony_demod_I2cRepeaterEnable (pInteg->pDemod, 0x01);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = pInteg->pTuner->ReadRFLevel (pInteg->pTuner, pRFLeveldB);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Disable the I2C repeater */
result = sony_demod_I2cRepeaterEnable (pInteg->pDemod, 0x00);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else if (pInteg->pTuner->rfLevelFuncTerr == SONY_TUNER_RFLEVEL_FUNC_CALCFROMAGC
&& pInteg->pTuner->CalcRFLevelFromAGC) {
uint32_t ifAgc;
result = sony_demod_isdbc_monitor_IFAGCOut(pInteg->pDemod, &ifAgc);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
result = pInteg->pTuner->CalcRFLevelFromAGC (pInteg->pTuner, ifAgc, pRFLeveldB);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
} else {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
}
/* dBm * 100 -> dBm * 1000 */
*pRFLeveldB *= 10;
SONY_TRACE_RETURN (SONY_RESULT_OK);
}
+69
View File
@@ -0,0 +1,69 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/07/27
Modification ID : ff73ffebff57618d6a5aa6e2aa9eb009b86060d1
------------------------------------------------------------------------------*/
/**
@file sony_integ_isdbc.h
This file provides the integration layer interface for ISDB-C specific
demodulator functions.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_INTEG_ISDBC_H
#define SONY_INTEG_ISDBC_H
#include "../sony_demod.h"
#include "../sony_integ.h"
#include "sony_demod_isdbc.h"
/*------------------------------------------------------------------------------
Defines
------------------------------------------------------------------------------*/
#define SONY_ISDBC_WAIT_DEMOD_LOCK 1000 /**< 1s timeout for wait demodulator lock */
#define SONY_ISDBC_WAIT_LOCK_INTERVAL 10 /**< 10ms interval for demodulator lock polls */
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Performs acquisition to the channel.
Blocks the calling thread until the TS has locked or has timed out.
Use ::sony_integ_Cancel to cancel the operation at any time.
@param pInteg The driver instance.
@param pTuneParam The parameters required for the tune.
@return SONY_RESULT_OK if tuned successfully to the channel.
*/
sony_result_t sony_integ_isdbc_Tune (sony_integ_t * pInteg,
sony_isdbc_tune_param_t * pTuneParam);
/**
@brief Polls the demodulator waiting for TS lock over a maximum of 1s at 10ms intervals
@param pInteg The driver instance
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_isdbc_WaitTSLock (sony_integ_t * pInteg);
/**
@brief RF level monitor function.
The RF Level monitor calculates an estimated RF level based on either the demodulator
IFAGC level or tuner internal RSSI monitor. If any compensation for external hardware
such as, LNA, attenuators is required, then the user should make adjustment in the
corresponding function.
@param pInteg The driver instance
@param pRFLeveldB The RF Level estimation in dB * 1000
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_integ_isdbc_monitor_RFLevel (sony_integ_t * pInteg, int32_t * pRFLeveldB);
#endif /* SONY_INTEG_ISDBC_H */
+78
View File
@@ -0,0 +1,78 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/08/30
Modification ID : 902dae58eb5249e028ccc5d7f60bb66cca9b43a9
------------------------------------------------------------------------------*/
/**
@file sony_isdbc.h
This file provides ISDB-C related type definitions.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_ISDBC_H
#define SONY_ISDBC_H
/*------------------------------------------------------------------------------
Enumerations
------------------------------------------------------------------------------*/
/**
@brief Type of TSID.
*/
typedef enum {
SONY_ISDBC_TSID_TYPE_TSID, /**< TSID(16bit) */
SONY_ISDBC_TSID_TYPE_RELATIVE_TS_NUMBER /**< Relative TS number */
} sony_isdbc_tsid_type_t;
/**
@brief ISDB-C constellation.
*/
typedef enum {
SONY_ISDBC_CONSTELLATION_RESERVED_0, /**< RESERVED */
SONY_ISDBC_CONSTELLATION_RESERVED_1, /**< RESERVED */
SONY_ISDBC_CONSTELLATION_64QAM, /**< 64-QAM */
SONY_ISDBC_CONSTELLATION_RESERVED_3, /**< RESERVED */
SONY_ISDBC_CONSTELLATION_256QAM /**< 256-QAM */
} sony_isdbc_constellation_t;
/**
@brief TSMF receive status
*/
typedef enum {
SONY_ISDBC_TSMF_RECEIVE_STATUS_GOOD, /**< Receive status is good */
SONY_ISDBC_TSMF_RECEIVE_STATUS_NORMAL, /**< Receive status is normal */
SONY_ISDBC_TSMF_RECEIVE_STATUS_BAD, /**< Receive status is bad */
SONY_ISDBC_TSMF_RECEIVE_STATUS_UNDEFINED /**< Receive status is undefined */
} sony_isdbc_tsmf_receive_status_t;
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief TSMF Header information structure.
*/
typedef struct sony_isdbc_tsmf_header_t {
/**
@brief TSMF Synchronization error.
The following cases, Synchronization error will occur.
- The header can not be detected after 53 slot from the previous header detected.
- If TSID, Network ID or Relative TS number specified in sony_demod_isdbc_Tune argument does not exist.
In this case, receiveStatusSelected will become SONY_ISDBC_TSMF_RECEIVE_STATUS_BAD.
*/
uint8_t syncError;
uint8_t versionNumber; /**< Version number */
uint8_t tsNumMode; /**< Relative TS number mode 0:Static assignment 1:Reserved */
uint8_t frameType; /**< Frame type */
uint8_t tsStatus[15]; /**< Status of each relative TS ID 0x01:Multiples 0x0F:Unused Others:Reserved */
sony_isdbc_tsmf_receive_status_t receiveStatusSelected; /**< Receive status of the selected relative TS number */
sony_isdbc_tsmf_receive_status_t receiveStatus[15]; /**< Receive status of each relative TS number */
uint16_t tsid[15]; /**< TS ID of each relative TS number */
uint16_t networkId[15]; /**< Network ID of each relative TS number */
uint8_t relativeTSNumForEachSlot[52]; /**< Relative TS number of each Slot number */
uint8_t emergency; /**< Emergency indicator 0:Emergency boot control is DISABLED 1:Emergency boot control is ENABLED */
uint8_t privateData[85]; /**< Private data */
} sony_isdbc_tsmf_header_t;
#endif /* SONY_ISDBC_H */
+44
View File
@@ -0,0 +1,44 @@
/*------------------------------------------------------------------------------
Copyright 2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/08/30
Modification ID : 902dae58eb5249e028ccc5d7f60bb66cca9b43a9
------------------------------------------------------------------------------*/
/**
@file sony_isdbc_chbond.h
This file provides ISDB-C channel bonding (J.183) related type definitions.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_ISDBC_CHBOND_H
#define SONY_ISDBC_CHBOND_H
/*------------------------------------------------------------------------------
Enumerations
------------------------------------------------------------------------------*/
/**
@brief Stream Type defined in TSMF header extension information.
*/
typedef enum sony_isdbc_chbond_stream_type_t {
SONY_ISDBC_CHBOND_STREAM_TYPE_TLV, /**< TLV */
SONY_ISDBC_CHBOND_STREAM_TYPE_TS_NONE /**< TS or no stream */
} sony_isdbc_chbond_stream_type_t;
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief TSMF Header extension information structure for channel bonding case.
*/
typedef struct sony_isdbc_chbond_tsmf_header_ext_t {
uint8_t aceewData[26]; /**< 204 bit ISDB-T AC carrier data including EEW information + 4'b0 */
sony_isdbc_chbond_stream_type_t streamType[15]; /**< Stream type (TLV or TS) */
uint8_t groupID; /**< Group ID */
uint8_t numCarriers; /**< Number of carriers for channel bonding (2 - 255) */
uint8_t carrierSequence; /**< Order of carrier to bond carriers correctly */
uint8_t numFrames; /**< Number of extension frames in super frame */
uint8_t framePosition; /**< Position of the extension frame in the super frame */
} sony_isdbc_chbond_tsmf_header_ext_t;
#endif /* SONY_ISDBC_CHBOND_H */