提交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
@@ -0,0 +1,3 @@
VPATH += $(ROOT_DIR)/app/sonytuner/source/tuner/terr_cable_ascot3/refcode
C_SOURCE += sony_ascot3.c
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,445 @@
/*------------------------------------------------------------------------------
Copyright 2013-2019 Sony Semiconductor Solutions Corporation
Last Updated : 2019/06/28
File Revision : 2.1.3.0
------------------------------------------------------------------------------*/
/**
@file sony_ascot3.h
This file provides the ASCOT3 tuner control interface.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_ASCOT3_H
#define SONY_ASCOT3_H
#include "../../../sony_common.h"
#include "../../../sony_i2c.h"
/*------------------------------------------------------------------------------
Defines
------------------------------------------------------------------------------*/
/**
@brief Version of this driver.
*/
#define SONY_ASCOT3_VERSION "2.1.2.0"
/**
@brief Default I2C slave address of the ASCOT3 tuner.
*/
#define SONY_ASCOT3_ADDRESS 0xC0
/*------------------------------------------------------------------------------
Enums
------------------------------------------------------------------------------*/
/**
@brief ASCOT3 tuner state.
*/
typedef enum {
SONY_ASCOT3_STATE_UNKNOWN, /**< ASCOT3 state is Unknown */
SONY_ASCOT3_STATE_SLEEP, /**< ASCOT3 state is Sleep */
SONY_ASCOT3_STATE_ACTIVE /**< ASCOT3 state is Active */
} sony_ascot3_state_t;
/**
@brief ASCOT3 chip type.
*/
typedef enum {
SONY_ASCOT3_CHIP_ID_UNKNOWN, /**< Unknown */
SONY_ASCOT3_CHIP_ID_2871, /**< CXD2871 (for TV) */
SONY_ASCOT3_CHIP_ID_2872, /**< CXD2872 (for STB) */
SONY_ASCOT3_CHIP_ID_2871A, /**< CXD2871A (ASCOT3I) (for TV) */
SONY_ASCOT3_CHIP_ID_2875 /**< CXD2875 */
} sony_ascot3_chip_id_t;
/**
@brief Xtal frequencies supported by ASCOT3.
*/
typedef enum {
SONY_ASCOT3_XTAL_16000KHz, /**< 16 MHz */
SONY_ASCOT3_XTAL_20500KHz, /**< 20.5 MHz */
SONY_ASCOT3_XTAL_24000KHz, /**< 24 MHz */
SONY_ASCOT3_XTAL_41000KHz /**< 41 MHz */
} sony_ascot3_xtal_t;
/**
@brief Analog/Digital terrestrial broadcasting system definitions supported by ASCOT3.
Fc : Center Frequency, Fp : Picture Frequency
*/
typedef enum {
SONY_ASCOT3_TV_SYSTEM_UNKNOWN,
/* Analog */
SONY_ASCOT3_ATV_MN_EIAJ, /**< System-M (Japan) (IF: Fp=5.75MHz in default) */
SONY_ASCOT3_ATV_MN_SAP, /**< System-M (US) (IF: Fp=5.75MHz in default) */
SONY_ASCOT3_ATV_MN_A2, /**< System-M (Korea) (IF: Fp=5.9MHz in default) */
SONY_ASCOT3_ATV_BG, /**< System-B/G (IF: Fp=7.3MHz in default) */
SONY_ASCOT3_ATV_I, /**< System-I (IF: Fp=7.85MHz in default) */
SONY_ASCOT3_ATV_DK, /**< System-D/K (IF: Fp=7.85MHz in default) */
SONY_ASCOT3_ATV_L, /**< System-L (IF: Fp=7.85MHz in default) */
SONY_ASCOT3_ATV_L_DASH, /**< System-L DASH (IF: Fp=2.2MHz in default) */
/* Digital */
SONY_ASCOT3_DTV_8VSB, /**< ATSC 8VSB (IF: Fc=3.7MHz in default) */
SONY_ASCOT3_DTV_QAM, /**< US QAM (IF: Fc=3.7MHz in default) */
SONY_ASCOT3_DTV_ISDBT_6, /**< ISDB-T 6MHzBW (IF: Fc=3.55MHz in default) */
SONY_ASCOT3_DTV_ISDBT_7, /**< ISDB-T 7MHzBW (IF: Fc=4.15MHz in default) */
SONY_ASCOT3_DTV_ISDBT_8, /**< ISDB-T 8MHzBW (IF: Fc=4.75MHz in default) */
SONY_ASCOT3_DTV_DVBT_5, /**< DVB-T 5MHzBW (IF: Fc=3.6MHz in default) */
SONY_ASCOT3_DTV_DVBT_6, /**< DVB-T 6MHzBW (IF: Fc=3.6MHz in default) */
SONY_ASCOT3_DTV_DVBT_7, /**< DVB-T 7MHzBW (IF: Fc=4.2MHz in default) */
SONY_ASCOT3_DTV_DVBT_8, /**< DVB-T 8MHzBW (IF: Fc=4.8MHz in default) */
SONY_ASCOT3_DTV_DVBT2_1_7,/**< DVB-T2 1.7MHzBW (IF: Fc=3.5MHz in default) */
SONY_ASCOT3_DTV_DVBT2_5, /**< DVB-T2 5MHzBW (IF: Fc=3.6MHz in default) */
SONY_ASCOT3_DTV_DVBT2_6, /**< DVB-T2 6MHzBW (IF: Fc=3.6MHz in default) */
SONY_ASCOT3_DTV_DVBT2_7, /**< DVB-T2 7MHzBW (IF: Fc=4.2MHz in default) */
SONY_ASCOT3_DTV_DVBT2_8, /**< DVB-T2 8MHzBW (IF: Fc=4.8MHz in default) */
SONY_ASCOT3_DTV_DVBC_6, /**< DVB-C 6MHzBW (IF: Fc=3.7MHz in default) */
SONY_ASCOT3_DTV_DVBC_8, /**< DVB-C 8MHzBW (IF: Fc=4.9MHz in default) */
SONY_ASCOT3_DTV_DVBC2_6, /**< DVB-C2 6MHzBW (IF: Fc=3.7MHz in default) */
SONY_ASCOT3_DTV_DVBC2_8, /**< DVB-C2 8MHzBW (IF: Fc=4.9MHz in default) */
SONY_ASCOT3_DTV_ATSC3_6, /**< ATSC 3.0 6MHzBW (IF: Fc=3.6MHz in default) */
SONY_ASCOT3_DTV_ATSC3_7, /**< ATSC 3.0 7MHzBW (IF: Fc=4.2MHz in default) */
SONY_ASCOT3_DTV_ATSC3_8, /**< ATSC 3.0 8MHzBW (IF: Fc=4.8MHz in default) */
SONY_ASCOT3_DTV_J83B_5_6, /**< J.83B 5.6Msps (IF: Fc=3.75MHz in default) */
SONY_ASCOT3_DTV_DTMB, /**< DTMB (IF: Fc=5.1MHz in default) */
SONY_ASCOT3_ATV_MIN = SONY_ASCOT3_ATV_MN_EIAJ, /**< Minimum analog terrestrial system */
SONY_ASCOT3_ATV_MAX = SONY_ASCOT3_ATV_L_DASH, /**< Maximum analog terrestrial system */
SONY_ASCOT3_DTV_MIN = SONY_ASCOT3_DTV_8VSB, /**< Minimum digital terrestrial system */
SONY_ASCOT3_DTV_MAX = SONY_ASCOT3_DTV_DTMB, /**< Maximum digital terrestrial system */
SONY_ASCOT3_TV_SYSTEM_NUM /**< Number of supported broadcasting system */
} sony_ascot3_tv_system_t;
/**
@brief Macro to check that the system is analog terrestrial or not.
*/
#define SONY_ASCOT3_IS_ATV(tvSystem) (((tvSystem) >= SONY_ASCOT3_ATV_MIN) && ((tvSystem) <= SONY_ASCOT3_ATV_MAX))
/**
@brief Macro to check that the system is digital terrestrial or not.
*/
#define SONY_ASCOT3_IS_DTV(tvSystem) (((tvSystem) >= SONY_ASCOT3_DTV_MIN) && ((tvSystem) <= SONY_ASCOT3_DTV_MAX))
/*------------------------------------------------------------------------------
Structs
------------------------------------------------------------------------------*/
/**
@brief ASCOT3 settings that may need to change depend on customer's system.
*/
typedef struct sony_ascot3_adjust_param_t {
uint8_t OUTLMT; /**< Addr:0x68 Bit[1:0] : Maximum IF output. (0: 1.5Vp-p, 1: 1.2Vp-p) */
uint8_t RF_GAIN; /**< Addr:0x69 Bit[6:4] : RFVGA gain. 0xFF means Auto. (RF_GAIN_SEL = 1) */
uint8_t IF_BPF_GC; /**< Addr:0x69 Bit[3:0] : IF_BPF gain. */
uint8_t RFOVLD_DET_LV1_VL; /**< Addr:0x6B Bit[3:0] : RF overload RF input detect level. (FRF <= 172MHz) */
uint8_t RFOVLD_DET_LV1_VH; /**< Addr:0x6B Bit[3:0] : RF overload RF input detect level. (172MHz < FRF <= 464MHz) */
uint8_t RFOVLD_DET_LV1_U; /**< Addr:0x6B Bit[3:0] : RF overload RF input detect level. (FRF > 464MHz) */
uint8_t IFOVLD_DET_LV_VL; /**< Addr:0x6C Bit[2:0] : Internal RFAGC detect level. (FRF <= 172MHz) */
uint8_t IFOVLD_DET_LV_VH; /**< Addr:0x6C Bit[2:0] : Internal RFAGC detect level. (172MHz < FRF <= 464MHz) */
uint8_t IFOVLD_DET_LV_U; /**< Addr:0x6C Bit[2:0] : Internal RFAGC detect level. (FRF > 464MHz) */
uint8_t IF_BPF_F0; /**< Addr:0x6D Bit[5:4] : IF filter center offset. */
uint8_t BW; /**< Addr:0x6D Bit[1:0] : 6MHzBW(0x00) or 7MHzBW(0x01) or 8MHzBW(0x02) or 1.7MHzBW(0x03) */
uint8_t FIF_OFFSET; /**< Addr:0x6E Bit[4:0] : 5bit signed. IF offset (kHz) = FIF_OFFSET x 50 */
uint8_t BW_OFFSET; /**< Addr:0x6F Bit[4:0] : 5bit signed. BW offset (kHz) = BW_OFFSET x 50 (BW_OFFSET x 10 in 1.7MHzBW) */
uint8_t AGC_SEL; /**< Addr:0x74 Bit[5:4] : AGC pin select. (0: AGC1, 1: AGC2) 0xFF means Auto (by config flags) */
uint8_t IF_OUT_SEL; /**< Addr:0x74 Bit[1:0] : IFOUT pin select. (0: IFOUT1, 1: IFOUT2) 0xFF means Auto. (by config flags) */
uint8_t IS_LOWERLOCAL; /**< Addr:0x9C Bit[0] : Local polarity. (0: Upper Local, 1: Lower Local) */
} sony_ascot3_adjust_param_t;
/**
@brief The ASCOT3 tuner definition which allows control of the ASCOT3 tuner device
through the defined set of functions.
*/
typedef struct sony_ascot3_t {
sony_ascot3_xtal_t xtalFreq; /**< Xtal frequency for ASCOT3. */
uint8_t i2cAddress; /**< I2C slave address of the ASCOT3 tuner (8-bit form - 8'bxxxxxxx0) */
sony_i2c_t* pI2c; /**< I2C API instance. */
uint32_t flags; /**< ORed value of SONY_ASCOT3_CONFIG_XXXX */
/* For saving current setting */
sony_ascot3_state_t state; /**< The driver operating state. */
uint32_t frequencykHz; /**< Currently RF frequency(kHz) tuned. */
sony_ascot3_tv_system_t tvSystem; /**< Current broadcasting system tuned. */
sony_ascot3_chip_id_t chipId; /**< Auto detected chip ID at initialization */
/**
@brief Adjustment parameter table (SONY_ASCOT3_TV_SYSTEM_NUM size)
*/
const sony_ascot3_adjust_param_t *pParamTable;
/* Following Xtal related parameters can be changed if optimization is necessary. */
uint8_t xosc_sel; /**< Driver current setting for crystal oscillator. (Addr:0x82 Bit[4:0]) */
uint8_t xosc_cap_set; /**< Driver current setting for crystal oscillator. (Addr:0x83 Bit[6:0]) */
uint8_t isSiP; /**< SiP internal or not. Automatically detected in the reference code. */
void* user; /**< User defined data. */
} sony_ascot3_t;
/*
Config flag definitions. (ORed value should be set to flags argument of Create API.)
*/
/**
@brief Use external Xtal. (for CXD2871/2872/2871A)
Should be used for slave ASCOT3 in Xtal shared system.
*/
#define SONY_ASCOT3_CONFIG_EXT_REF 0x80000000
/**
@brief Disable Xtal in Sleep state. (for CXD2871/2872/2871A/2875)
Should NOT be used for Xtal shared system.
Not only for the master ASCOT3 which has Xtal, but also slave ASCOT3 which receive the clock signal.
Cannot be used with SONY_ASCOT3_CONFIG_EXT_REF.
*/
#define SONY_ASCOT3_CONFIG_SLEEP_DISABLEXTAL 0x40000000
/**
@brief Internal loop filter setting. (for CXD2871/2872/2871A)
If this is used, internal loop filter is used for
digital broadcasting system except for DVB-C/C2.
For analog and DVB-C/C2, external loop filter will be used.
*/
#define SONY_ASCOT3_CONFIG_LOOPFILTER_INTERNAL 0x10000000
/**
@brief Loop through enable. (for CXD2872)
*/
#define SONY_ASCOT3_CONFIG_LOOPTHRU_ENABLE 0x08000000
/**
@brief RFIN matching for Power Save state enable (for CXD2871/2872/2871A)
For CXD2872, this is automatically enabled if SONY_ASCOT3_CONFIG_LOOPTHRU_ENABLE is used.
*/
#define SONY_ASCOT3_CONFIG_RFIN_MATCHING_ENABLE 0x04000000
/**
@name IF/AGC pin individually setting. (for CXD2871/2871A)
Used if sony_ascot3_adjust_param_t::IFAGCSEL == 0xFF
Available CXD2871 only.
CXD2872/2875 only have IF2/AGC2.
*/
/**@{*/
#define SONY_ASCOT3_CONFIG_IF2_ATV 0x00100000 /**< IF2 is used for Analog. (Otherwise IF1 is used.) */
#define SONY_ASCOT3_CONFIG_AGC2_ATV 0x00200000 /**< AGC2 is used for Analog. (Otherwise AGC1 is used.) */
#define SONY_ASCOT3_CONFIG_IF2_DTV 0x00400000 /**< IF2 is used for Digital. (Otherwise IF1 is used.) */
#define SONY_ASCOT3_CONFIG_AGC2_DTV 0x00800000 /**< AGC2 is used for Digital. (Otherwise AGC1 is used.) */
/**@}*/
/**
@name IF/AGC pin setting for normal cases. (for CXD2871/2871A)
Used if sony_ascot3_adjust_param_t::IFAGCSEL == 0xFF
Available CXD2871 only.
CXD2872/2875 only have IF2/AGC2.
*/
/**@{*/
/**
@brief IF/AGC 1 is used for both Analog and Digital
*/
#define SONY_ASCOT3_CONFIG_IFAGCSEL_ALL1 0x00000000
/**
@brief IF/AGC 2 is used for both Analog and Digital
*/
#define SONY_ASCOT3_CONFIG_IFAGCSEL_ALL2 (SONY_ASCOT3_CONFIG_IF2_ATV | SONY_ASCOT3_CONFIG_AGC2_ATV | \
SONY_ASCOT3_CONFIG_IF2_DTV | SONY_ASCOT3_CONFIG_AGC2_DTV)
/**
@brief IF/AGC 1 is used for Analog, 2 is used for Digital
*/
#define SONY_ASCOT3_CONFIG_IFAGCSEL_A1D2 (SONY_ASCOT3_CONFIG_IF2_DTV | SONY_ASCOT3_CONFIG_AGC2_DTV)
/**
@brief IF/AGC 1 is used for Digital, 2 is used for Analog
*/
#define SONY_ASCOT3_CONFIG_IFAGCSEL_D1A2 (SONY_ASCOT3_CONFIG_IF2_ATV | SONY_ASCOT3_CONFIG_AGC2_ATV)
/**@}*/
/**
@name REFOUT setting related macros. (for CXD2871/2872/2871A/2875)
If following values are not used, REFOUT output is disabled.
*/
/**@{*/
/**
@brief REFOUT enable, output level is 500mVp-p.
*/
#define SONY_ASCOT3_CONFIG_REFOUT_500mVpp 0x00001000
/**
@brief REFOUT enable, output level is 400mVp-p.
*/
#define SONY_ASCOT3_CONFIG_REFOUT_400mVpp 0x00002000
/**
@brief REFOUT enable, output level is 600mVp-p.
*/
#define SONY_ASCOT3_CONFIG_REFOUT_600mVpp 0x00003000
/**
@brief REFOUT enable, output level is 800mVp-p.
*/
#define SONY_ASCOT3_CONFIG_REFOUT_800mVpp 0x00004000
/**
@brief Internal use only. Do not use this value.
*/
#define SONY_ASCOT3_CONFIG_REFOUT_MASK 0x00007000
/**@}*/
/*------------------------------------------------------------------------------
APIs
------------------------------------------------------------------------------*/
/**
@brief Set up the ASCOT3 tuner driver.
This MUST be called before calling sony_ascot3_Initialize.
@param pTuner Reference to memory allocated for the ASCOT3 instance.
The create function will setup this ASCOT3 instance.
@param xtalFreq The frequency of the ASCOT3 crystal.
@param i2cAddress The ASCOT3 tuner I2C slave address in 8-bit form.
@param pI2c The I2C APIs that the ASCOT3 driver will use as the I2C interface.
@param flags Configuration flags. It should be ORed value of SONY_ASCOT3_CONFIG_XXXX.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_Create(sony_ascot3_t *pTuner, sony_ascot3_xtal_t xtalFreq,
uint8_t i2cAddress, sony_i2c_t *pI2c, uint32_t flags);
/**
@brief Set up the ASCOT3 tuner driver for CXD2875 (ASCOT3R).
This is the special create function for CXD2875.
@param pTuner Reference to memory allocated for the ASCOT3 instance.
The create function will setup this ASCOT3 instance.
@param i2cAddress The ASCOT3 tuner I2C slave address in 8-bit form.
@param pI2c The I2C APIs that the ASCOT3 driver will use as the I2C interface.
@param flags Configuration flags. It should be ORed value of SONY_ASCOT3_CONFIG_XXXX.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_2875_Create(sony_ascot3_t *pTuner,
uint8_t i2cAddress, sony_i2c_t *pI2c, uint32_t flags);
/**
@brief Initialize the ASCOT3 tuner.
This MUST be called before calling sony_ascot3_Tune.
@param pTuner The ASCOT3 tuner instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_Initialize(sony_ascot3_t *pTuner);
/**
@brief Tune to a given RF frequency with broadcasting system.
To complete tuning, sony_ascot3_TuneEnd should be called after waiting 50ms.
@param pTuner The ASCOT3 tuner instance.
@param frequencykHz RF frequency to tune. (kHz)
@param tvSystem The type of broadcasting system to tune.
@return SONY_RESULT_OK if tuner successfully tuned.
*/
sony_result_t sony_ascot3_Tune(sony_ascot3_t *pTuner, uint32_t frequencykHz, sony_ascot3_tv_system_t tvSystem);
/**
@brief Completes the ASCOT3 tuning sequence.
This MUST be called after calling sony_ascot3_Tune and 50ms wait.
@param pTuner The ASCOT3 tuner instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_TuneEnd(sony_ascot3_t *pTuner);
/**
@brief Shift RF frequency.
This API shift RF frequency without VCO calibration.
This API is normally useful for analog TV "fine tuning" that
shift RF frequency without picture distortion.
@note Please check the frequency range that VCO calibration is unnecessary.
(See hardware specification sheet.)
@param pTuner The ASCOT3 tuner instance.
@param frequencykHz RF frequency to tune. (kHz)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_ShiftFRF(sony_ascot3_t *pTuner, uint32_t frequencykHz);
/**
@brief Put the ASCOT3 tuner into Sleep state.
From this state the tuner can be directly tuned by calling sony_ascot3_Tune.
@param pTuner The ASCOT3 tuner instance.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_Sleep(sony_ascot3_t *pTuner);
/**
@brief Write to GPO0 or GPO1. (for CXD2871/2872/2871A)
@param pTuner The ASCOT3 tuner instance.
@param id Pin ID 0 = GPO0, 1 = GPO1
@param val Output logic level, 0 = Low, 1 = High
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_SetGPO(sony_ascot3_t *pTuner, uint8_t id, uint8_t val);
/**
@brief Set the RF external circuit control pin. (for CXD2871/2871A)
(Set RF_EXT_EN register.)
@param pTuner The ASCOT3 tuner instance.
@param enable The value to set. (Enable(1) or Disable(0))
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_SetRfExtCtrl(sony_ascot3_t *pTuner, uint8_t enable);
/**
@brief Read the RSSI in dBm from the tuner.
@note Target level of IF signal output (depend on demodulator)
is not added in default.
(RSSI_IFOUT_TGT(0x79) is not set in sony_ascot3.c.)
sony_ascot3_ReadRssi_CPU is legacy function only for CXD2871/2872/2875.
The difference is that sony_ascot3_ReadRssi_CPU uses chip internal CPU.
@param pTuner The ASCOT3 tuner instance.
@param pRssi RSSI in dBm * 100
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_ReadRssi(sony_ascot3_t *pTuner, int32_t *pRssi);
sony_result_t sony_ascot3_ReadRssi_CPU(sony_ascot3_t *pTuner, int32_t *pRssi);
/**
@brief RF filter compensation setting for VHF-L band. (for CXD2871/2872)
(Please see RFVGA Description of datasheet.)
New setting will become effective after next tuning.
mult = coeff / 128
(compensated value) = (original value) * mult + offset
@param pTuner The ASCOT3 tuner instance.
@param coeff Multiplier value. (8bit unsigned)
@param offset Additional term. (8bit 2s complement)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_ascot3_RFFilterConfig(sony_ascot3_t *pTuner, uint8_t coeff, uint8_t offset);
#endif /* SONY_ASCOT3_H */
@@ -0,0 +1,459 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/07/27
Modification ID : ff73ffebff57618d6a5aa6e2aa9eb009b86060d1
------------------------------------------------------------------------------*/
#include "sony_tuner_ascot3.h"
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
/*------------------------------------------------------------------------------
Driver Version
------------------------------------------------------------------------------*/
const char* sony_tuner_ascot3_version = SONY_ASCOT3_VERSION;
/*------------------------------------------------------------------------------
Static Function Prototypes
------------------------------------------------------------------------------*/
static sony_result_t sony_tuner_ascot3_Initialize (sony_tuner_t * pTuner);
static sony_result_t sony_tuner_ascot3_Tune (sony_tuner_t * pTuner,
uint32_t frequencyKHz,
sony_dtv_system_t system,
sony_dtv_bandwidth_t bandwidth);
static sony_result_t sony_tuner_ascot3_Sleep (sony_tuner_t * pTuner);
static sony_result_t sony_tuner_ascot3_Shutdown (sony_tuner_t * pTuner);
static sony_result_t sony_tuner_ascot3_ReadRFLevel (sony_tuner_t * pTuner, int32_t * pRFLevel);
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
sony_result_t sony_tuner_ascot3_Create (sony_tuner_t * pTuner,
sony_ascot3_xtal_t xtalFreq,
uint8_t i2cAddress,
sony_i2c_t * pI2c,
uint32_t configFlags,
sony_ascot3_t * pAscot3Tuner)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_Create");
if ((!pI2c) || (!pAscot3Tuner) || (!pTuner)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
memset (pTuner, 0, sizeof (sony_tuner_t)); /* Zero filled */
/* Create the underlying Ascot3 reference driver. */
result = sony_ascot3_Create (pAscot3Tuner, xtalFreq, i2cAddress, pI2c, configFlags);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Populate / Initialize the sony_tuner_t structure */
pTuner->i2cAddress = i2cAddress;
pTuner->pI2c = pI2c;
pTuner->flags = configFlags;
pTuner->symbolRateKSpsForSpectrum = 0;
pTuner->rfLevelFuncTerr = SONY_TUNER_RFLEVEL_FUNC_READ; /* Use ReadRFLevel function for terrestrial */
pTuner->rfLevelFuncSat = SONY_TUNER_RFLEVEL_FUNC_NOSUPPORT; /* Not supported for satellite */
pTuner->user = pAscot3Tuner;
pTuner->Initialize = sony_tuner_ascot3_Initialize;
pTuner->TerrCableTune = sony_tuner_ascot3_Tune;
pTuner->SatTune = NULL;
pTuner->Sleep = sony_tuner_ascot3_Sleep;
pTuner->Shutdown = sony_tuner_ascot3_Shutdown;
pTuner->ReadRFLevel = sony_tuner_ascot3_ReadRFLevel;
pTuner->CalcRFLevelFromAGC = NULL;
SONY_TRACE_RETURN (result);
}
sony_result_t sony_tuner_ascot3_2875_Create (sony_tuner_t * pTuner,
uint8_t i2cAddress,
sony_i2c_t * pI2c,
uint32_t configFlags,
sony_ascot3_t * pAscot3Tuner)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_2875_Create");
if ((!pI2c) || (!pAscot3Tuner) || (!pTuner)) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
memset (pTuner, 0, sizeof (sony_tuner_t)); /* Zero filled */
/* Create the underlying Ascot3R reference driver. */
result = sony_ascot3_2875_Create(pAscot3Tuner, i2cAddress, pI2c, configFlags);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Populate / Initialize the sony_tuner_t structure */
pTuner->i2cAddress = i2cAddress;
pTuner->pI2c = pI2c;
pTuner->flags = configFlags;
pTuner->symbolRateKSpsForSpectrum = 0;
pTuner->rfLevelFuncTerr = SONY_TUNER_RFLEVEL_FUNC_READ; /* Use ReadRFLevel function for terrestrial */
pTuner->rfLevelFuncSat = SONY_TUNER_RFLEVEL_FUNC_NOSUPPORT; /* Not supported for satellite */
pTuner->user = pAscot3Tuner;
pTuner->Initialize = sony_tuner_ascot3_Initialize;
pTuner->TerrCableTune = sony_tuner_ascot3_Tune;
pTuner->SatTune = NULL;
pTuner->Sleep = sony_tuner_ascot3_Sleep;
pTuner->Shutdown = sony_tuner_ascot3_Shutdown;
pTuner->ReadRFLevel = sony_tuner_ascot3_ReadRFLevel;
pTuner->CalcRFLevelFromAGC = NULL;
SONY_TRACE_RETURN (result);
}
sony_result_t sony_tuner_ascot3_RFFilterConfig (sony_tuner_t * pTuner, uint8_t coeff, uint8_t offset)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_RFFilterConfig");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
result = sony_ascot3_RFFilterConfig (((sony_ascot3_t *) pTuner->user), coeff, offset);
SONY_TRACE_RETURN (result);
}
sony_result_t sony_tuner_ascot3_SetGPO (sony_tuner_t * pTuner, uint8_t id, uint8_t value)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_Write_GPIO");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
result = sony_ascot3_SetGPO (((sony_ascot3_t *) pTuner->user), id, value);
SONY_TRACE_RETURN (result);
}
sony_result_t sony_tuner_ascot3_ReadRssi (sony_tuner_t * pTuner, int32_t * pRssi)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_ReadRssi");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
result = sony_ascot3_ReadRssi (((sony_ascot3_t *) pTuner->user), pRssi);
SONY_TRACE_RETURN (result);
}
/*------------------------------------------------------------------------------
Static Functions
------------------------------------------------------------------------------*/
static sony_result_t sony_tuner_ascot3_Initialize (sony_tuner_t * pTuner)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_Initialize");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Call into underlying driver. */
result = sony_ascot3_Initialize (((sony_ascot3_t *) pTuner->user));
/* Device is in "Power Save" state. */
pTuner->frequencyKHz = 0;
pTuner->system = SONY_DTV_SYSTEM_UNKNOWN;
pTuner->bandwidth = SONY_DTV_BW_UNKNOWN;
pTuner->symbolRateKSps = 0;
//printf("dbg_pr sony_tuner_ascot3_Initialize ret = %d\n", result);
SONY_TRACE_RETURN (result);
}
static sony_result_t sony_tuner_ascot3_Tune (sony_tuner_t * pTuner,
uint32_t frequencyKHz,
sony_dtv_system_t system,
sony_dtv_bandwidth_t bandwidth)
{
sony_result_t result = SONY_RESULT_OK;
sony_ascot3_tv_system_t aSystem;
//SONY_TRACE_ENTER ("sony_tuner_ascot3_Tune");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
//printf("[%s,%d] system=%d\n",__FUNCTION__,__LINE__, system);
/* Convert system, bandwidth into dtv system. */
switch (system) {
case SONY_DTV_SYSTEM_DVBC:
switch (bandwidth) {
case SONY_DTV_BW_6_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBC_6;
break;
case SONY_DTV_BW_7_MHZ:
/* 7MHZ BW setting is the same as 8MHz BW */
case SONY_DTV_BW_8_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBC_8;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
case SONY_DTV_SYSTEM_DVBT:
switch (bandwidth) {
case SONY_DTV_BW_5_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT_5;
break;
case SONY_DTV_BW_6_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT_6;
break;
case SONY_DTV_BW_7_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT_7;
break;
case SONY_DTV_BW_8_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT_8;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
case SONY_DTV_SYSTEM_DVBT2:
switch (bandwidth) {
case SONY_DTV_BW_1_7_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT2_1_7;
break;
case SONY_DTV_BW_5_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT2_5;
break;
case SONY_DTV_BW_6_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT2_6;
break;
case SONY_DTV_BW_7_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT2_7;
break;
case SONY_DTV_BW_8_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBT2_8;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
case SONY_DTV_SYSTEM_DVBC2:
switch (bandwidth) {
case SONY_DTV_BW_6_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBC2_6;
break;
case SONY_DTV_BW_8_MHZ:
aSystem = SONY_ASCOT3_DTV_DVBC2_8;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
case SONY_DTV_SYSTEM_ISDBT:
switch (bandwidth) {
case SONY_DTV_BW_6_MHZ:
aSystem = SONY_ASCOT3_DTV_ISDBT_6;
break;
case SONY_DTV_BW_7_MHZ:
aSystem = SONY_ASCOT3_DTV_ISDBT_7;
break;
case SONY_DTV_BW_8_MHZ:
aSystem = SONY_ASCOT3_DTV_ISDBT_8;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
case SONY_DTV_SYSTEM_ISDBC:
aSystem = SONY_ASCOT3_DTV_DVBC_6; /* ISDB-C uses DVB-C 6MHz BW setting */
break;
case SONY_DTV_SYSTEM_ATSC: // [oneshu note] do this case
aSystem = SONY_ASCOT3_DTV_8VSB;
break;
case SONY_DTV_SYSTEM_ATSC3:
switch (bandwidth) {
case SONY_DTV_BW_6_MHZ:
aSystem = SONY_ASCOT3_DTV_ATSC3_6;
break;
case SONY_DTV_BW_7_MHZ:
aSystem = SONY_ASCOT3_DTV_ATSC3_7;
break;
case SONY_DTV_BW_8_MHZ:
aSystem = SONY_ASCOT3_DTV_ATSC3_8;
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
case SONY_DTV_SYSTEM_J83B:
switch (bandwidth) {
case SONY_DTV_BW_J83B_5_06_5_36_MSPS:
aSystem = SONY_ASCOT3_DTV_DVBC_6; /* J.83B (5.057, 5.361Msps commonly used in US) uses DVB-C 6MHz BW setting */
break;
case SONY_DTV_BW_J83B_5_60_MSPS:
aSystem = SONY_ASCOT3_DTV_J83B_5_6; /* J.83B (5.6Msps used in Japan) uses special setting */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
break;
/* Intentional fall-through */
case SONY_DTV_SYSTEM_UNKNOWN:
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Call into underlying driver. */
result = sony_ascot3_Tune(((sony_ascot3_t *) pTuner->user), frequencyKHz, aSystem);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Allow the tuner time to settle */
printf("Allow the tuner time to settle, wait about 50 ms\n");
SONY_SLEEP(50);
result = sony_ascot3_TuneEnd((sony_ascot3_t *) pTuner->user);
printf("sony ascot3 tune, tunnd ret = %d\n", result);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Assign current values. */
pTuner->frequencyKHz = ((sony_ascot3_t *) pTuner->user)->frequencykHz;
pTuner->system = system;
pTuner->bandwidth = bandwidth;
pTuner->symbolRateKSps = 0;
SONY_TRACE_RETURN (result);
}
static sony_result_t sony_tuner_ascot3_Sleep (sony_tuner_t * pTuner)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_Sleep");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Call into underlying driver. */
result = sony_ascot3_Sleep (((sony_ascot3_t *) pTuner->user));
/* Device is in "Power Save" state. */
pTuner->frequencyKHz = 0;
pTuner->system = SONY_DTV_SYSTEM_UNKNOWN;
pTuner->bandwidth = SONY_DTV_BW_UNKNOWN;
pTuner->symbolRateKSps = 0;
SONY_TRACE_RETURN (result);
}
static sony_result_t sony_tuner_ascot3_Shutdown (sony_tuner_t * pTuner)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_Shutdown");
if (!pTuner || !pTuner->user) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
/* Call into underlying driver. */
result = sony_ascot3_Sleep (((sony_ascot3_t *) pTuner->user));
/* Device is in "Power Save" state. */
pTuner->frequencyKHz = 0;
pTuner->system = SONY_DTV_SYSTEM_UNKNOWN;
pTuner->bandwidth = SONY_DTV_BW_UNKNOWN;
pTuner->symbolRateKSps = 0;
printf("sony ascot3 Shutdown, ret = %d\n", result);
SONY_TRACE_RETURN (result);
}
static sony_result_t sony_tuner_ascot3_ReadRFLevel (sony_tuner_t * pTuner, int32_t * pRFLevel)
{
sony_result_t result = SONY_RESULT_OK;
SONY_TRACE_ENTER ("sony_tuner_ascot3_ReadRFLevel");
if (!pTuner || !pTuner->user || !pRFLevel) {
SONY_TRACE_RETURN (SONY_RESULT_ERROR_ARG);
}
if (!SONY_DTV_SYSTEM_IS_TERR_CABLE (pTuner->system)) {
/* Terrestrial/Cable Only */
SONY_TRACE_RETURN (SONY_RESULT_ERROR_SW_STATE);
}
result = sony_ascot3_ReadRssi (((sony_ascot3_t *) pTuner->user), pRFLevel);
if (result != SONY_RESULT_OK) {
SONY_TRACE_RETURN (result);
}
/* Add IFOUT value */
switch (pTuner->system) {
case SONY_DTV_SYSTEM_DVBT:
case SONY_DTV_SYSTEM_DVBT2:
case SONY_DTV_SYSTEM_DVBC2:
case SONY_DTV_SYSTEM_ATSC3:
*pRFLevel -= 400; /* -4.0dBm */
break;
case SONY_DTV_SYSTEM_DVBC:
case SONY_DTV_SYSTEM_ISDBC:
case SONY_DTV_SYSTEM_J83B:
*pRFLevel -= 150; /* -1.5dBm */
break;
case SONY_DTV_SYSTEM_ISDBT:
*pRFLevel -= 450; /* -4.5dBm */
break;
case SONY_DTV_SYSTEM_ATSC:
*pRFLevel -= 500; /* -5.0dBm */
break;
default:
SONY_TRACE_RETURN (SONY_RESULT_ERROR_NOSUPPORT);
}
//PR_TUN("dbg_pr sony_tuner_ascot3_ReadRFLevel sys=%d RRLvl=%d ret=%d\n", pTuner->system, *pRFLevel,result);
SONY_TRACE_RETURN (result);
}
@@ -0,0 +1,136 @@
/*------------------------------------------------------------------------------
Copyright 2016-2018 Sony Semiconductor Solutions Corporation
Last Updated : 2018/07/05
Modification ID : c7c68d70868a4a9fb9e0f480d8b940e8a1e8f651
------------------------------------------------------------------------------*/
/**
@file sony_tuner_ascot3.h
This file provides the DVB port of the Sony ASCOT3 tuner driver.
This driver wraps around the Ascot3 driver provided by
sony_ascot3.h by using an instance of the Ascot3 (sony_ascot3_t)
driver in the ::sony_tuner_t::user pointer.
*/
/*----------------------------------------------------------------------------*/
#ifndef SONY_TUNER_ASCOT3_H
#define SONY_TUNER_ASCOT3_H
/*------------------------------------------------------------------------------
Includes
------------------------------------------------------------------------------*/
#include "../sony_tuner.h"
#include "refcode/sony_ascot3.h"
/*------------------------------------------------------------------------------
Driver Version
------------------------------------------------------------------------------*/
extern const char* sony_tuner_ascot3_version; /**< ASCOT3 driver version */
/*------------------------------------------------------------------------------
Defines
------------------------------------------------------------------------------*/
#define SONY_TUNER_ASCOT3_OFFSET_CUTOFF_HZ 50000 /**< Maximum carrier offset frequency before requiring a retune */
/*------------------------------------------------------------------------------
Functions
------------------------------------------------------------------------------*/
/**
@brief Creates an instance of the ASCOT3 tuner driver
@param pTuner The tuner driver instance to create. Memory
must have been allocated for this instance before
creation.
@param xtalFreq The crystal frequency of the tuner.
@param i2cAddress The I2C address of the ASCOT3 device.
Typically 0xC0.
@param pI2c The I2C driver that the tuner driver will use for
communication.
@param configFlags See "#define" ::SONY_ASCOT3_CONFIG_SLEEP_DISABLEXTAL,
::SONY_ASCOT3_CONFIG_LOOPFILTER_INTERNAL,
::SONY_ASCOT3_CONFIG_LOOPTHRU_ENABLE,
::SONY_ASCOT3_CONFIG_RFIN_MATCHING_ENABLE,
::SONY_ASCOT3_CONFIG_IF2_ATV,
::SONY_ASCOT3_CONFIG_AGC2_ATV,
::SONY_ASCOT3_CONFIG_IF2_DTV,
::SONY_ASCOT3_CONFIG_AGC2_DTV,
::SONY_ASCOT3_CONFIG_IFAGCSEL_ALL1,
::SONY_ASCOT3_CONFIG_IFAGCSEL_ALL2,
::SONY_ASCOT3_CONFIG_IFAGCSEL_A1D2,
::SONY_ASCOT3_CONFIG_IFAGCSEL_D1A2,
::SONY_ASCOT3_CONFIG_REFOUT_500mVpp
::SONY_ASCOT3_CONFIG_REFOUT_400mVpp
::SONY_ASCOT3_CONFIG_REFOUT_600mVpp
::SONY_ASCOT3_CONFIG_REFOUT_800mVpp defined in
\link sony_ascot3.h \endlink
@param pAscot3Tuner The Ascot3 tuner driver pointer to use.
Memory must have been allocated for the Ascot3 driver structure.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_tuner_ascot3_Create (sony_tuner_t * pTuner,
sony_ascot3_xtal_t xtalFreq,
uint8_t i2cAddress,
sony_i2c_t * pI2c,
uint32_t configFlags,
sony_ascot3_t * pAscot3Tuner);
/**
@brief Creates an instance of the ASCOT3R (CXD2875) tuner driver
@param pTuner The tuner driver instance to create. Memory
must have been allocated for this instance before
creation.
@param i2cAddress The I2C address of the ASCOT3R (CXD2875) device.
Typically 0xC0.
@param pI2c The I2C driver that the tuner driver will use for
communication.
@param configFlags See "#define" ::SONY_ASCOT3_CONFIG_SLEEP_DISABLEXTAL,
::SONY_ASCOT3_CONFIG_REFOUT_500mVpp
::SONY_ASCOT3_CONFIG_REFOUT_400mVpp
::SONY_ASCOT3_CONFIG_REFOUT_600mVpp
::SONY_ASCOT3_CONFIG_REFOUT_800mVpp defined in
\link sony_ascot3.h \endlink
@param pAscot3Tuner The Ascot3 tuner driver pointer to use.
Memory must have been allocated for the Ascot3 driver structure.
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_tuner_ascot3_2875_Create (sony_tuner_t * pTuner,
uint8_t i2cAddress,
sony_i2c_t * pI2c,
uint32_t configFlags,
sony_ascot3_t * pAscot3Tuner);
/**
@brief RF filter compensation setting for VHF-L band.
(Please see RFVGA Description of datasheet.)
New setting will become effective after next tuning.
mult = VL_TRCKOUT_COEFF(8bit unsigned) / 128
ofs = VL_TRCKOUT_OFS(8bit 2s complement)
(compensated value) = (original value) * mult + ofs
@param pTuner Instance of the tuner driver.
@param coeff VL_TRCKOUT_COEFF (multiplier)
@param offset VL_TRCKOUT_OFS (additional term)
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_tuner_ascot3_RFFilterConfig (sony_tuner_t * pTuner, uint8_t coeff, uint8_t offset);
/**
@brief Write to GPIO0 or GPIO1.
@param pTuner Instance of the tuner driver.
@param id Pin ID 0 = GPIO0, 1 = GPIO1
@param value Output logic level, 0 = Low, 1 = High
@return SONY_RESULT_OK if successful.
*/
sony_result_t sony_tuner_ascot3_SetGPO (sony_tuner_t * pTuner, uint8_t id, uint8_t value);
#endif /* SONY_TUNER_ASCOT3_H */
@@ -0,0 +1,4 @@
VPATH += $(ROOT_DIR)/app/sonytuner/source/tuner/terr_cable_ascot3
C_SOURCE += sony_tuner_ascot3.c