T_TxIqImbalance.cpp
上传用户:gelin96
上传日期:2017-01-08
资源大小:20993k
文件大小:12k
源码类别:

MTK

开发平台:

C++ Builder

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2001
  8. *
  9. *****************************************************************************/
  10. /*****************************************************************************
  11.  *
  12.  * Filename:
  13.  * ---------
  14.  *   T_PhaseError.cpp
  15.  *
  16.  * Project:
  17.  * --------
  18.  *   Maui META APP
  19.  *
  20.  * Description:
  21.  * ------------
  22.  *  Phase error calibration source
  23.  *
  24.  * Author:
  25.  * -------
  26.  *  Andy Ueng (mtk00490)
  27.  *
  28.  *============================================================================
  29.  *             HISTORY
  30.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  31.  *------------------------------------------------------------------------------
  32.  * $Revision$
  33.  * $Modtime$
  34.  * $Log$
  35.  *
  36.  *------------------------------------------------------------------------------
  37.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  38.  *============================================================================
  39. ****************************************************************************/
  40. #include <assert.h>
  41. #include <math.h>
  42. #pragma hdrstop
  43. #ifndef _T_META_FACTORY_CALIBRATION_H_
  44. #include "T_META_factory_calibration.H"
  45. #endif
  46. #ifndef _CAL_COMMON_H_
  47. #include "cal_common.h"
  48. #endif
  49. // misc
  50. #ifndef  _BAND_UTILS_H_
  51. #include "band_utils.h"
  52. #endif
  53. #ifndef  _MATH_UTILS_H_
  54. #include "math_utils.h"
  55. #endif
  56. #ifndef  _AGE_MISC_H_
  57. #include "age_misc.h"
  58. #endif
  59. #ifndef  _GSM_UTILS_H_
  60. #include "gsm_utils.h"
  61. #endif
  62. #ifndef  _TIME_UTILS_H_
  63. #include "time_utils.h"
  64. #endif
  65. // equipment
  66. #ifndef _AGECOMMON_H_
  67. #include "agecommon.h"
  68. #endif
  69. // TX phase error calibration
  70. #ifndef _RF_OFFSET_IQ_SWEEP_INIT_AGE8960_H_
  71. #include "rf_offset_iq_sweep_init_age8960.h"
  72. #endif
  73. #ifndef  _RF_TXIQ_H_
  74. #include "rf_txiq.h"
  75. #endif
  76. // form
  77. #ifndef _META_FACTORY_H_
  78. #include "META_Factory.h"
  79. #endif
  80. // call back
  81. #ifndef _META_FACTORY_NVRAM_CB_H_
  82. #include "meta_factory_nvram_cb.h"
  83. #endif
  84. #ifndef _META_FACTORY_RF_CB_H_
  85. #include "meta_factory_rf_cb.h"
  86. #endif
  87. //----------------------------------------------------------------------------
  88. // phase error
  89. extern RfNbtx_Req *MF_rf_tx_level_req;
  90. extern CRFTXIQ*  MF_rf_txiq_ptr;
  91. // Tthread
  92. extern T_META_factory_calibration* pt_calibration;
  93. extern bool  is_suspend_cal; // in T_META_factory_calibration.cpp
  94. //------------------------------------------------------------------------------
  95. bool __fastcall T_META_factory_calibration::TXIQGainImbalanceCal( void )
  96. {
  97.     sIQ  TrimIQ[] =
  98.     {
  99.         {  0,   0},
  100.         {  7,  -7},
  101.         { -7,   7},
  102.     };
  103.     sIQ  IQt;
  104.     ViReal64 Xt;
  105.     PostMessage(
  106.                      ctrl.hPostMsgDestHandle,
  107.                      WM_MF_RF_TX_IQ_GAIN_IMBALANCE_BEGIN,
  108.                      0,
  109.                      0
  110.                     );
  111.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  112.              " ============== TX IQ gain imbalance calibration begin ================== "
  113.            );
  114.     if( ! TrimOffIQCalCommon() )
  115.     {
  116.         return false;
  117.     }
  118.     // get OOS
  119.    // RFReq_BBTXCFG.TxOffsetI = 0;
  120.    // RFReq_BBTXCFG.TxOffsetQ = 0;
  121.     for(int i=0; i<3; i++)
  122.     {
  123.         rf_bb_tx_cfg2_req.TxTrimI = TrimIQ[i].I;
  124.         rf_bb_tx_cfg2_req.TxTrimQ = TrimIQ[i].Q;
  125.         if( META_Rf_SetBBTxCfg2_r(5000, &rf_bb_tx_cfg2_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  126.         {
  127.             CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  128.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  129.                           " FAIL: RF set BB TX config fail."
  130.                         );
  131.             return false;
  132.         }
  133.         
  134.         CheckTerminateByUser
  135.         Sleep(50);
  136.         MF_rf_tx_level_req->arfcn = m_sTX_IQ_IMBALANCE_ARFCN;
  137.         MF_rf_tx_level_req->bsic  =  m_cTSC;
  138.         MF_rf_tx_level_req->power    = i_TX_IQ_IMBALANCE_PCL;
  139.         MF_rf_tx_level_req->frames   = 1000;
  140.         MF_rf_tx_level_req->dacValue = m_sDefault_value;
  141.         if( Form_META_Factory->rbAgilent8960->Checked )
  142.         {
  143.             MF_rf_tx_level_req->burstTypeNB = NB_TX_ALL_ONES_WITHOUT_TSC;
  144.         }
  145.         else
  146.         {   MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;
  147.         }
  148.         if ( META_Rf_NB_TX_r(
  149.                     MF_rf_tx_level_req,
  150.                     ::ccb_MF_rf_tx_level_TrOff,
  151.                     &MF_rf_tx_level_token,
  152.                                     NULL
  153.                           ) != META_SUCCESS)
  154.         {
  155.             CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  156.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  157.                       " FAIL : Target< ARFCN = " + IntToStr( m_sTX_IQ_IMBALANCE_ARFCN ) +
  158.                       ", TSC = " + IntToStr( m_cTSC ) +
  159.                       ", power = " + IntToStr( i_TX_IQ_IMBALANCE_PCL ) +
  160.                       ", frames = " + IntToStr(i_N_TX) +
  161.                       ", dac value = " + IntToStr( m_sDefault_value )
  162.                     );
  163.             return false;
  164.         }
  165.         SUSPEND_CAL_THREAD
  166.         if( age1960_initMeasFcn(
  167.                                       ctrl.vi,
  168.                                       age1960_IQTUNING
  169.                                    ) != VI_SUCCESS )
  170.         {
  171.                 CalErrorHandler( WM_MF_AGE8960_SET_MESA_FUNC_IQ_TUNNING_FAIL );
  172.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  173.                       " FAIL : Agilent 8960< Initialize TX IQ tunning mesaurement function fail."
  174.                     );
  175.                 return false;
  176.         }
  177.         if( age1960_fetchIQTuning_Q (
  178.                                            ctrl.vi,
  179.                                            age1960_IQ_ARRAY_MIN,
  180.                                            &IQTIntegrity,
  181.                                            &IQTSpurFreq,
  182.                                            &IQTSpurLevel,
  183.                                            IQTResultsArray,
  184.                                            IQTFreqsArray,
  185.                                            &IQTTuningCount
  186.                                         ) != VI_SUCCESS )
  187.         {
  188.                 CalErrorHandler( WM_MF_AGE8960_SET_MESA_FUNC_IQ_TUNNING_FAIL );
  189.                 log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  190.                       " FAIL : Agilent 8960> Read TX IQ tunning fail."
  191.                     );
  192.                 return false;
  193.         }
  194.         d_SBS[i] = get_TX_IQ_Imbalance(IQTFreqsArray, IQTResultsArray, IQTTuningCount);
  195.         if( NAN == d_SBS[i] )
  196.         {
  197.             CalErrorHandler( WM_MF_RF_TX_DC_OFFSET_FAIL );
  198.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  199.                       " FAIL :  Get TX IQ imbalance fail."
  200.                     );
  201.             return false;
  202.         }
  203.         d_PSBS[i] = pow(10.0, d_SBS[i]/10.0);
  204.         STOP_RF
  205.     }
  206.     Xt = 14*(d_PSBS[2]-d_PSBS[1]) / (2*(d_PSBS[2]+d_PSBS[1]-2*d_PSBS[0]));
  207.     IQt.I = Xt /2;
  208.     IQt.Q = Xt - IQt.I;
  209.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  210.              " ============== TX IQ gain imbalance calibration end ================== "
  211.            );
  212.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  213.              " ============== TX IQ gain imbalance check begin ================== "
  214.            );
  215.     // set BBTxCfg2
  216.     rf_bb_tx_cfg2_req.TxTrimI = IQt.I;
  217.     rf_bb_tx_cfg2_req.TxTrimQ = IQt.Q;
  218.     if( META_Rf_SetBBTxCfg2_r(5000, &rf_bb_tx_cfg2_req, &rf_bb_tx_cfg2_cnf) != META_SUCCESS )
  219.     {
  220.         CalErrorHandler( WM_MF_RF_SET_BB_TX_CFG_FAIL );
  221.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  222.                   " FAIL: RF set BB TX config fail."
  223.         );
  224.         return false;
  225.     }
  226.     Sleep(50);
  227.         MF_rf_tx_level_req->arfcn = m_sTX_IQ_IMBALANCE_ARFCN;
  228.         MF_rf_tx_level_req->bsic  =  m_cTSC;
  229.         MF_rf_tx_level_req->power    = i_TX_IQ_IMBALANCE_PCL;
  230.         MF_rf_tx_level_req->frames   = 1000;
  231.         MF_rf_tx_level_req->dacValue = m_sDefault_value;
  232.         MF_rf_tx_level_req->burstTypeNB = NB_TX_RANDOM_WITH_TSC;;
  233.         if ( META_Rf_NB_TX_r(
  234.                     MF_rf_tx_level_req,
  235.                     ::ccb_MF_rf_tx_level_TrOff,
  236.                     &MF_rf_tx_level_token,
  237.                                     NULL
  238.                           ) != META_SUCCESS)
  239.         {
  240.             CalErrorHandler( WM_MF_RF_TX_LEVEL_FAIL );
  241.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  242.                       " FAIL : Target< ARFCN = " + IntToStr( m_sTX_IQ_IMBALANCE_ARFCN ) +
  243.                       ", TSC = " + IntToStr( m_cTSC ) +
  244.                       ", power = " + IntToStr( i_TX_IQ_IMBALANCE_PCL ) +
  245.                       ", frames = " + IntToStr(i_N_TX) +
  246.                       ", dac value = " + IntToStr( m_sDefault_value )
  247.                     );
  248.             return false;
  249.         }
  250.         SUSPEND_CAL_THREAD
  251.     if( ! FetchRMSPhaseErr( &CheckPhaseErr )  )
  252.     {
  253.         return false;
  254.     }
  255.     // read TXIQ from NVRAM
  256.     MF_rf_txiq_ptr->ConfirmCallback = ccb_read_txiq_from_nvram;
  257.     MF_rf_txiq_ptr->REQ_Read_From_NVRAM_Start(m_pCal->rf_id);
  258.     RestartTimerCal ( WM_MF_FDM_TXIQ_READ_FAIL );
  259.     SUSPEND_CAL_THREAD
  260.     if (MF_rf_txiq_ptr->Get_ConfirmState() != STATE_TXIQ_OK)
  261.     {
  262.             CalErrorHandler( WM_MF_FDM_TXIQ_READ_FAIL );
  263.             pt_calibration->log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  264.                                       " FAIL:  Target< Read txiq value from NVRAM fail "
  265.                                      );
  266.             return false;
  267.     }
  268.     MF_rf_txiq_ptr->Set_BBTxParametersFromAutoK( &rf_bb_tx_cfg2_req );
  269.     if( d_PHASE_ERROR_RMS_ERROR < CheckPhaseErr )
  270.     {
  271.         MF_rf_txiq_ptr->Set_BBTx_isCalibrated(0);
  272.     }
  273.     else
  274.     {
  275.         MF_rf_txiq_ptr->Set_BBTx_isCalibrated(BBTX_CALIBRATED_SCALE);
  276.     }
  277.     
  278.     MF_rf_txiq_ptr->ConfirmCallback = ::ccb_write_txiq_to_nvram;
  279.     MF_rf_txiq_ptr->REQ_Write_To_NVRAM_Start(m_pCal->rf_id);
  280.     RestartTimerCal ( WM_MF_FDM_TXIQ_WRITE_FAIL );
  281.     SUSPEND_CAL_THREAD
  282.     if (MF_rf_txiq_ptr->Get_ConfirmState() != STATE_TXIQ_OK)
  283.     {
  284.             CalErrorHandler( WM_MF_FDM_TXIQ_WRITE_FAIL );
  285.             log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  286.                                       " FAIL:  Target< Write txiq value to NVRAM fail "
  287.                                      );
  288.             return false;
  289.     }
  290.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  291.                   " Target< Write TXIQ value to NVRAM"
  292.                 );
  293.     if( d_PHASE_ERROR_RMS_ERROR < CheckPhaseErr )
  294.     {
  295.         CalErrorHandler( WM_MF_RF_TX_IQ_GAIN_IMBALANCE_CHECK_FAIL );
  296.         log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  297.                               " FAIL: TX IQ gain imbalance calibration."
  298.                 );
  299.         return false;
  300.     }
  301.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  302.                               " PASS: TX IQ gain imbalance calibration."
  303.                 );
  304.     PostMessage(
  305.                      ctrl.hPostMsgDestHandle,
  306.                      WM_MF_RF_TX_IQ_GAIN_IMBALANCE_CALIBRATION_DONE,
  307.                      0,
  308.                      0
  309.                     );
  310.     log->Add( DateToStr(Date()) +  " " + CurrentTimeStr() +
  311.              " ============== TX IQ gain imbalance check end ================== "
  312.            );
  313. }
  314. //------------------------------------------------------------------------------
  315. ViReal64 __fastcall T_META_factory_calibration::get_TX_IQ_Imbalance(ViReal64  *p_IQTFreqs, ViReal64 *p_IQTResults, ViInt32   IQTTuningCount)
  316. {
  317.     for(int i=0; i<IQTTuningCount; i++)
  318.     {
  319.         if( *(p_IQTFreqs+i) == IQT_IQ_IMBALANCE_FREQ )
  320.         {
  321.             return *(p_IQTResults+i);
  322.         }
  323.     }
  324.     return NAN;
  325. }