/* **************************************************** */ /*! @file MN_DMD_driver.c @brief Panasonic Demodulator Driver @author R.Mori @date 2011/6/30 @param (c) Panasonic */ /* **************************************************** */ #include "../../inc/config.h" #if USE_TUNER_88436 #include "../include/MN_DMD_types.h" #include "../include/MN_DMD_driver.h" #include "../include/MN_DMD_device.h" #include "../include/MN_DMD_common.h" #include "../include/MN_I2C.h" #include "../include/MN_Tuner.h" /* **************************************************** */ /* Local Functions */ /* **************************************************** */ /* **************************************************** */ /* Definition of Constant Strings */ /* **************************************************** */ /* **************************************************** */ /* Public Functions */ /* **************************************************** */ /*! Demodulator set device ID */ static DMD_PARAMETER mn_param; DMD_u32_t DMD_set_devid( DMD_PARAMETER* param , DMD_u32_t id ) { param->devid = id; return DMD_E_OK; } /*! Demodulator API Initialize & Open */ /*! *initialize parameter variable (DMD_PARAMETER* param) *open & connect to USB Device for I2C communication (for WINDOWS API only) */ DMD_u32_t DMD_open( DMD_PARAMETER* param) { int i; param->devid = 0; param->system= DMD_E_NOT_DEFINED; /* Initialize Parameter Variable */ for(i=0;iinfo[i] = 0; //NOT_DEFINED } param->bw = DMD_E_BW_NOT_SPECIFIED; param->freq = 666000; param->funit = DMD_E_KHZ; //troy.wang, 20120801, for customer to pass test in lab.( SPEC : A74-2010 ) param->echo_set = DMD_E_ENHANCE_MINUS_ECHO_DELAY_NO_SIDEEFFECT; if( DMD_device_open( param ) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: DMD open" ); return DMD_E_ERROR; } if( DMD_I2C_open() == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: I2C open" ); return DMD_E_ERROR; } return DMD_E_OK; } /*! Demodulator LSI Initialize */ /*! *release power down *Tuner Initialize *transfer common register settings via I2C *transfer auto countrol sequence via I2C */ DMD_u32_t DMD_init(DMD_u32_t freq) { /*IF use DMD to repeat I2C cmd, firstly initializing DMD is better. Troy.wangyx, 120801*/ /* Demodulator LSI Initialize */ mn_param.freq = freq; mn_param.devid = 0; mn_param.system = DMD_E_ATSC; mn_param.ts_out = DMD_E_TSOUT_PARALLEL_FIXED_CLOCK; mn_param.bw = DMD_E_BW_6MHZ; mn_param.funit = DMD_E_HZ; mn_param.echo_set = DMD_E_ENHANCE_MINUS_ECHO_DELAY_DEFAULT; if( DMD_device_init( &mn_param ) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: DMD Initialize" ); return DMD_E_ERROR; } /* Auto Control Sequence Transfer */ if( DMD_device_load_pseq(&mn_param ) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: DMD Load Autocontrol" ); return DMD_E_ERROR; } /* 20120801, troy, set TCB control mode : Through mode */ if (DMD_device_set_TCB_mode( &mn_param ) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: DMD set tcb I2C mode" ); return DMD_E_ERROR; } if( DMD_Tuner_init(mn_param.freq) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: Tuner Initialize" ); return DMD_E_ERROR; } DMD_set_system(&mn_param); //DMD_scan(&mn_param); //DMD_device_scan(&mn_param); return DMD_E_OK; } /*! Select Broadcast Sytem */ /*! *Transfer register settings for each system */ DMD_u32_t DMD_set_system( DMD_PARAMETER* param ) { if( DMD_device_set_system( param ) == DMD_E_ERROR ) { DMD_DBG_TRACE("ERROR:device set system"); return DMD_E_ERROR; } /* '11/08/29 : OKAMOTO Select TS output. */ if( DMD_set_ts_output(param, param->ts_out ) == DMD_E_ERROR ){ DMD_DBG_TRACE("ERROR:set ts output"); return DMD_E_ERROR; } //DMD_device_set_system 将tcb 重置了,必须再重新调用TCB_mode函数 /* 20120801, troy, set TCB control mode : Through mode */ if (DMD_device_set_TCB_mode( param ) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: DMD set tcb I2C mode" ); return DMD_E_ERROR; } /* 20120801, troy, set echo performance */ if (DMD_device_set_echo_enhance( param, param->echo_set) == DMD_E_ERROR ) { DMD_DBG_TRACE( "ERROR: DMD set echo performace" ); return DMD_E_ERROR; } if( DMD_Tuner_set_system( param ) == DMD_E_ERROR ) { DMD_DBG_TRACE("===== ERROR:Tuner set system =====\r\n"); return DMD_E_ERROR; } return DMD_E_OK; } /*! Tune */ DMD_u32_t DMD_tune( DMD_PARAMETER* param ) { DMD_ERROR_t ret; /* Call pre tune process */ ret = (DMD_ERROR_t)DMD_device_pre_tune( param ); /* Tuner */ ret |= DMD_Tuner_tune( param ); /* Call post tune process */ ret |= DMD_device_post_tune( param ); return ret; } /*! scan */ DMD_u32_t DMD_scan( DMD_PARAMETER* param ) { /* Call pre tune process */ DMD_device_pre_tune( param ); //default empty /* Tuner: RF and BW input*/ DMD_Tuner_tune( param ); /* DMD software reset */ DMD_device_post_tune( param ); /* Call Lock/SYNC Status Judgement */ DMD_device_scan( param ); return 0; } /*! term */ DMD_u32_t DMD_term( DMD_PARAMETER* param ) { DMD_ERROR_t ret; ret = (DMD_ERROR_t)DMD_device_term(param); ret |= DMD_Tuner_term(); return ret; } /*! close */ DMD_u32_t DMD_close( DMD_PARAMETER* param ) { DMD_ERROR_t ret; ret = (DMD_ERROR_t)DMD_device_close(param); return ret; } /* **************************************************** */ /* Set Information */ /* **************************************************** */ DMD_u32_t DMD_set_info( DMD_PARAMETER* param , DMD_u32_t id , DMD_u32_t val){ return DMD_device_set_info( param , id , val ); } /* **************************************************** */ /* Get Information */ /* **************************************************** */ DMD_u32_t DMD_get_info( DMD_PARAMETER* param , DMD_u32_t id ){ return DMD_device_get_info( param , id ); } DMD_text_t DMD_info_title( DMD_SYSTEM_t sys ,DMD_u32_t id ) { if( id < DMD_E_INFO_COMMON_END_OF_INFORMATION ) { return DMD_INFO_TITLE_COMMON[id]; } else switch( sys ) { case DMD_E_DVBT: if( id < DMD_E_INFO_DVBT_END_OF_INFORMATION ){ id -= DMD_E_INFO_COMMON_END_OF_INFORMATION; return DMD_INFO_TITLE_DVBT[id]; } else { return "Not Defined"; } case DMD_E_DVBT2: if( id < DMD_E_INFO_DVBT2_END_OF_INFORMATION ){ id -= DMD_E_INFO_COMMON_END_OF_INFORMATION; return DMD_INFO_TITLE_DVBT2[id]; } else { return "Not Defined"; } case DMD_E_DVBC: if( id < DMD_E_INFO_DVBC_END_OF_INFORMATION ){ id -= DMD_E_INFO_COMMON_END_OF_INFORMATION; return DMD_INFO_TITLE_DVBC[id]; } else { return "Not Defined"; } #ifndef DMD_DISABLE_ISDB case DMD_E_ISDBT: case DMD_E_ISDBT_BRAZIL: if( id < DMD_E_INFO_ISDBT_END_OF_INFORMATION ){ id -= DMD_E_INFO_COMMON_END_OF_INFORMATION; return DMD_INFO_TITLE_ISDBT[id]; } else { return "Not Defined"; } case DMD_E_ISDBS: if( id < DMD_E_INFO_ISDBS_END_OF_INFORMATION ){ id -= DMD_E_INFO_COMMON_END_OF_INFORMATION; return DMD_INFO_TITLE_ISDBS[id]; } else { return "Not Defined"; } #endif default: break; } return "Not Defined"; } DMD_text_t DMD_info_value( DMD_SYSTEM_t sys ,DMD_u32_t id , DMD_u32_t val ) { if( id < DMD_E_INFO_COMMON_END_OF_INFORMATION && id != DMD_E_INFO_STATUS ) { return DMD_info_value_common( id ,val ); } else { switch( sys ) { case DMD_E_DVBT2: return DMD_info_value_dvbt2( id , val ); case DMD_E_DVBT: return DMD_info_value_dvbt( id , val ); #ifndef DMD_DISABLE_ISDB case DMD_E_ISDBT: case DMD_E_ISDBT_BRAZIL: return DMD_info_value_isdbt( id , val ); case DMD_E_ISDBS: return DMD_info_value_isdbs( id , val ); #endif case DMD_E_ATSC: case DMD_E_QAMB_256QAM: case DMD_E_QAMB_64QAM: case DMD_E_QAMC_256QAM: case DMD_E_QAMC_64QAM: return DMD_info_value_vq( id , val ); case DMD_E_DVBC: return DMD_info_value_dvbc( id , val ); default: break; } } return "Not Defined"; } DMD_text_t DMD_value_text( DMD_PARAMETER* param , DMD_u32_t id ) { return DMD_info_value( param->system , id , param->info[id] ); } /* **************************************************** */ /* Floating Functions */ /* **************************************************** */ // Get BER DMD_float_t DMD_get_ber(void) { DMD_float_t ret; DMD_get_info(&mn_param , DMD_E_INFO_BERRNUM ); if(mn_param.info[DMD_E_INFO_BITNUM] == 0 ) { ret = 1.0; } else { ret = (DMD_float_t) mn_param.info[DMD_E_INFO_BERRNUM] / (DMD_float_t) mn_param.info[DMD_E_INFO_BITNUM]; } return ret; } DMD_float_t DMD_get_per(void) { DMD_float_t ret; DMD_get_info( &mn_param , DMD_E_INFO_PACKETNUM ); if( mn_param.info[DMD_E_INFO_PACKETNUM] == 0 ) { ret = 1.0; } else { ret = (DMD_float_t) mn_param.info[DMD_E_INFO_PERRNUM]/(DMD_float_t) mn_param.info[DMD_E_INFO_PACKETNUM]; } return ret; } //Get CNR DMD_float_t DMD_get_cnr(void) { DMD_float_t ret; DMD_get_info( &mn_param , DMD_E_INFO_CNR_INT ); ret = (DMD_float_t) mn_param.info[DMD_E_INFO_CNR_INT] + (DMD_float_t) mn_param.info[DMD_E_INFO_CNR_DEC] / ( (DMD_float_t) 100.0 ); return ret; } DMD_u32_t DMD_get_lock(void) { DMD_get_info( &mn_param , DMD_E_INFO_LOCK ); if(mn_param.info[DMD_E_INFO_LOCK]==DMD_E_LOCKED) { return 1; } else { return 0; } } #endif