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

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) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *   rf_agc.cpp
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui META APP
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *   RF AGC source
  48.  *
  49.  * Author:
  50.  * -------
  51.  *  Andy Ueng (mtk00490)
  52.  *
  53.  *============================================================================
  54.  *             HISTORY
  55.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  56.  *------------------------------------------------------------------------------
  57.  * $Revision$
  58.  * $Modtime$
  59.  * $Log$
  60.  * 
  61.  *------------------------------------------------------------------------------
  62.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  63.  *============================================================================
  64. ****************************************************************************/
  65. #include <IniFiles.hpp>
  66. #pragma hdrstop
  67. #ifndef _FORM_MAIN_H_
  68. #include "form_Main.h"
  69. #endif
  70. #ifndef  _RF_AGC_H_
  71. #include "rf_agc.h"
  72. #endif
  73. #ifndef  _MAN_FDM_H_
  74. #include "man_fdm.h"
  75. #endif
  76. #ifndef  _MAN_ACTIVE_H_
  77. #include "man_active.h"
  78. #endif
  79. // misc
  80. #ifndef  _MISC_H_
  81. #include "misc.h"
  82. #endif
  83. #ifndef  _FT_UTILS_H_
  84. #include "ft_utils.h"
  85. #endif
  86. // NVRAM
  87. #ifndef  _NVRAM_VER_H_
  88. #include "nvram_ver.h"
  89. #endif
  90. //===========================================================================
  91. static CRFAGC*  g_rf_agc_ptr;
  92. static bool g_bIsRunning = false;
  93. extern TfrmMainSel *frmMainSel;
  94. //===========================================================================
  95. static void  CNF_ReadFromNVRAM( void )
  96. {
  97.     g_rf_agc_ptr->CNF_ReadFromNVRAM( );
  98. }
  99. //-------------------------------------------------------------------------
  100. static  void  CNF_WriteToNVRAM( void )
  101. {
  102.    g_rf_agc_ptr->CNF_WriteToNVRAM( );
  103. }
  104. //-------------------------------------------------------------------------
  105. static  void  CNF_ResetNVRAMData( void )
  106. {
  107.    g_rf_agc_ptr->CNF_ResetNVRAMData( );
  108. }
  109. //-------------------------------------------------------------------------
  110. static void  REQ_TimeOut( void )
  111. {  g_rf_agc_ptr->REQ_TimeOut();
  112. }
  113. //-------------------------------------------------------------------------
  114. static void  REQ_Finish( void )
  115. {  g_rf_agc_ptr->REQ_Finish();
  116. }
  117. //===========================================================================
  118. CRFAGC::CRFAGC( void )
  119. {
  120.    g_bIsRunning = false;
  121.    ConfirmCallback = NULL;
  122.    m_uiAgcBufSize = NULL;
  123.    m_cAgcBuf = NULL;
  124. }
  125. //---------------------------------------------------------------------------
  126. CRFAGC::~CRFAGC()
  127. {
  128.    g_bIsRunning = false;
  129.    ConfirmCallback = 0;
  130.    if(m_cAgcBuf)
  131.    {
  132.       delete [] m_cAgcBuf;
  133.       m_cAgcBuf = NULL;
  134.    }
  135. }
  136. //---------------------------------------------------------------------------
  137. void  CRFAGC::REQ_Finish( void )
  138. {
  139.    if(!g_bIsRunning)  return;
  140.    Confirm( METAAPP_SUCCESS );
  141.    g_bIsRunning = false;
  142. }
  143. //---------------------------------------------------------------------------
  144. void  CRFAGC::REQ_Stop( void )
  145. {
  146.    if(!g_bIsRunning)  return;
  147.    NVRAMMan->REQ_Stop();
  148.    Confirm( METAAPP_STOP );
  149.    g_bIsRunning = false;
  150. }
  151. //---------------------------------------------------------------------------
  152. void  CRFAGC::REQ_TimeOut( void )
  153. {
  154.    if(!g_bIsRunning)  return;
  155.    NVRAMMan->REQ_Stop();
  156.    Confirm( METAAPP_TIMEOUT );
  157.    g_bIsRunning = false;
  158. }
  159. //---------------------------------------------------------------------------
  160. void  CRFAGC::Confirm(E_METAAPP_RESULT_T confirm_state)
  161. {
  162.     if (!g_bIsRunning)
  163.     {
  164.         return;
  165.     }
  166.     if (NULL == ConfirmCallback)
  167.     {
  168.         return;
  169.     }
  170.     m_eConfirmState = confirm_state;
  171.     ActiveMan->SetActiveFunction(ConfirmCallback);
  172. }
  173. //===========================================================================
  174. void CRFAGC::REQ_Read_From_NVRAM_Start(void)
  175. {
  176.     g_rf_agc_ptr = this;
  177.     g_bIsRunning = true;
  178.     m_bDownloadTrigger = false;
  179.     REQ_Read_From_NVRAM();
  180. }
  181. //---------------------------------------------------------------------------
  182. void CRFAGC::REQ_Read_From_NVRAM(void)
  183. {
  184.     if (!g_bIsRunning)
  185.     {
  186.         return;
  187.     }
  188.     if (NULL == m_cAgcBuf)
  189.     {
  190.         META_RESULT MetaResult = META_NVRAM_GetRecLen("NVRAM_EF_L1_AGCPATHLOSS_LID", (int *) &m_uiAgcBufSize);
  191.         if (MetaResult != META_SUCCESS)
  192.         {
  193.             Confirm(METAAPP_FAIL);
  194.             return;
  195.         }
  196.         m_cAgcBuf = new  char[m_uiAgcBufSize];
  197.     }
  198.     NVRAMMan->ConfirmCallback = ::CNF_ReadFromNVRAM;
  199.     NVRAMMan->REQ_ReadNVRAM_Start( "NVRAM_EF_L1_AGCPATHLOSS_LID",
  200.                                    1,
  201.                                    m_uiAgcBufSize,
  202.                                    m_cAgcBuf
  203.                                  );
  204. }
  205. //-------------------------------------
  206. void CRFAGC::CNF_ReadFromNVRAM(void)
  207. {
  208.     if (!g_bIsRunning)
  209.     {
  210.         return;
  211.     }
  212.     E_METAAPP_RESULT_T state = NVRAMMan->Get_ConfirmState();
  213.     switch (state)
  214.     {
  215.         case METAAPP_SUCCESS:
  216.         {
  217.             if (m_bDownloadTrigger)
  218.             {
  219.                 REQ_Write_To_NVRAM();
  220.             }
  221.             else
  222.             {
  223.                 META_RESULT MetaResult = META_NVRAM_Decompose_agcPathLoss(&m_sAgcPathLoss,
  224.                                                           m_cAgcBuf,
  225.                                                           m_uiAgcBufSize);
  226.                 if (MetaResult != META_SUCCESS)
  227.                 {
  228.                     Confirm(METAAPP_FAIL);
  229.                     return;
  230.                 }
  231.                 ActiveMan->SetActiveFunction(::REQ_Finish);
  232.             }
  233.         }
  234.         break;
  235.         default:
  236.         {
  237.             Confirm(state);
  238.         }
  239.         break;
  240.     }
  241. }
  242. //===========================================================================
  243. void CRFAGC::REQ_Write_To_NVRAM_Start(void)
  244. {
  245.     g_rf_agc_ptr = this;
  246.     g_bIsRunning = true;
  247.     m_bDownloadTrigger = true;
  248.     REQ_Write_To_NVRAM();
  249. }
  250. //---------------------------------------------------------------------------
  251. void CRFAGC::REQ_Write_To_NVRAM(void)
  252. {
  253.     if (!g_bIsRunning)
  254.     {
  255.         return;
  256.     }
  257.     META_RESULT MetaResult;
  258.     unsigned short lid_ver;
  259.     MetaResult = META_NVRAM_GetLIDVersion("NVRAM_EF_L1_AGCPATHLOSS_LID", &lid_ver);
  260.     if (lid_ver > NVRAM_EF_L1_AGCPATHLOSS_LID_VERNO)
  261.     {
  262.         Confirm(METAAPP_NVRAM_LID_VER_NOT_SUPPORT);
  263.         return;
  264.     }
  265.     if (NULL == m_cAgcBuf)
  266.     {
  267.         MetaResult = META_NVRAM_GetRecLen("NVRAM_EF_L1_AGCPATHLOSS_LID", (int *) &m_uiAgcBufSize);
  268.         if (MetaResult != META_SUCCESS)
  269.         {
  270.             Confirm(METAAPP_FAIL);
  271.             return;
  272.         }
  273.         m_cAgcBuf = new char[m_uiAgcBufSize];
  274.     }
  275.     MetaResult = META_NVRAM_Compose_agcPathLoss( &m_sAgcPathLoss,
  276.                                                  m_cAgcBuf,
  277.                                                  m_uiAgcBufSize );
  278.     if (MetaResult != META_SUCCESS)
  279.     {
  280.         Confirm(METAAPP_FAIL);
  281.         return;
  282.     }
  283.     NVRAMMan->ConfirmCallback = ::CNF_WriteToNVRAM;
  284.     NVRAMMan->REQ_WriteNVRAM_Start("NVRAM_EF_L1_AGCPATHLOSS_LID",
  285.                                  1, // only 1 record
  286.                                    m_uiAgcBufSize,
  287.                                    m_cAgcBuf);
  288. }
  289. //-------------------------------------
  290. void CRFAGC::CNF_WriteToNVRAM(void)
  291. {
  292.     if (!g_bIsRunning)
  293.     {
  294.         return;
  295.     }
  296.     E_METAAPP_RESULT_T state = NVRAMMan->Get_ConfirmState();
  297.     Confirm(state);
  298. }
  299. //===========================================================================
  300. void  CRFAGC::REQ_Reset_NVRAM_Data( void )
  301. {
  302.     g_rf_agc_ptr = this;
  303.     g_bIsRunning = true;
  304.     NVRAMMan->ConfirmCallback = ::CNF_ResetNVRAMData;
  305.     NVRAMMan->REQ_ResetNVRAMData_Start("NVRAM_EF_L1_AGCPATHLOSS_LID");
  306. }
  307. //-------------------------------------
  308. void  CRFAGC::CNF_ResetNVRAMData( void )
  309. {
  310.     if(!g_bIsRunning)  return;
  311.     E_METAAPP_RESULT_T  state = NVRAMMan->Get_ConfirmState();
  312.     Confirm(state);
  313. }
  314. //==============================================================================
  315. static const char  SUBBAND_NAME[][32] =
  316. {
  317.     "GSM400 Sub band, RX loss",
  318.     "GSM850 Sub band, RX loss",
  319.     "GSM900 Sub band, RX loss",
  320.     "DCS1800 Sub band, RX loss",
  321.     "PCS1900 Sub band, RX loss",
  322. };
  323. //--------------------------------------------------------------------------
  324. static const char  BAND_NAME[5][12] =
  325. {  "GSM400",
  326.    "GSM850",
  327.    "GSM900",
  328.    "DCS1800",
  329.    "PCS1900"
  330. };
  331. //--------------------------------------------------------------------------
  332. bool CRFAGC::RxLossSectionExist(char *filename, FrequencyBand freqband)
  333. {
  334.     TIniFile   *ini_file;
  335.     ini_file = new TIniFile(filename);
  336.     if (NULL == ini_file)
  337.     {
  338.         return false;
  339.     }
  340.     if (!ini_file->SectionExists((AnsiString) SUBBAND_NAME[freqband]))
  341.     {
  342.         delete ini_file;
  343.         return false;
  344.     }
  345.     delete ini_file;
  346.     return true;
  347. }
  348. //--------------------------------------------------------------------------
  349. bool CRFAGC::AnyRxLossSectionExist(char *filename)
  350. {
  351.     int         FrequencyBandStart;
  352.     TIniFile   *ini_file;
  353.     ini_file = new TIniFile(filename);
  354.     if (NULL == ini_file)
  355.     {
  356.         return false;
  357.     }
  358.     if (frmMainSel->cbGSM850->Checked)
  359.     {
  360.         FrequencyBandStart = FrequencyBand850;
  361.     }
  362.     else
  363.     {   FrequencyBandStart = FrequencyBand900;
  364.     }
  365.     for(int band = FrequencyBandStart; band<=FrequencyBand1900; band++)
  366.     {
  367.         if( ini_file->SectionExists((AnsiString) SUBBAND_NAME[band]))
  368.         {
  369.             delete ini_file;
  370.             return true;
  371.         }
  372.     }
  373.     delete ini_file;
  374.     return false;
  375. }
  376. //==============================================================================
  377. bool CRFAGC::REQ_Read_From_File(char *filename)
  378. {
  379.     FrequencyBand FrequencyBandStart;
  380.     if (frmMainSel->cbGSM850->Checked)
  381.     {
  382.         FrequencyBandStart = FrequencyBand850;
  383.     }
  384.     else
  385.     {   FrequencyBandStart = FrequencyBand900;
  386.     }
  387.     for (FrequencyBand freqband = FrequencyBandStart; freqband<=FrequencyBand1900; freqband++)
  388.     {
  389.         if (!REQ_Read_From_File_Single_Band(filename, freqband))
  390.         {
  391.             return false;
  392.         }
  393.     }
  394.     return true;
  395. }
  396. //----------------------------------------------------------------------------
  397. bool CRFAGC::REQ_Read_From_File_Single_Band(char *filename, FrequencyBand freqband)
  398. {
  399.     TIniFile   *ini_file;
  400.     AnsiString  data;
  401.     char        str[2048];
  402.     int         idata[PLTABLE_SIZE];
  403.     float       fdata[PLTABLE_SIZE];
  404.     ini_file = new TIniFile(filename);
  405.     if (NULL == ini_file)
  406.     {
  407.         return false;
  408.     }
  409.     data = ini_file->ReadString(SUBBAND_NAME[freqband],
  410.                                      "Max ARFCN",
  411.                                      "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1");
  412.     strcpy(str, data.c_str());
  413.     String_To_Array_int(str, idata, PLTABLE_SIZE);
  414.     idata[ PLTABLE_SIZE-1 ] = -1;
  415.     for (int i=0; i<PLTABLE_SIZE; i++)
  416.     {
  417.         m_sAgcPathLoss.agcPathLoss[freqband][i].max_arfcn = idata[i];
  418.     }
  419.     data = ini_file->ReadString(SUBBAND_NAME[freqband],
  420.                                      "RX loss",
  421.                                      "0,0,0,0,0,0,0,0,0,0,0,0");
  422.                                      strcpy( str, data.c_str()
  423.                                    );
  424.     String_To_Array_float(str, fdata, PLTABLE_SIZE);
  425.     fdata[PLTABLE_SIZE-1] = 0;
  426.     for (int i=0; i<PLTABLE_SIZE; i++)
  427.     {
  428.         m_sAgcPathLoss.agcPathLoss[freqband][i].gain_offset = (int)(fdata[i]*GAIN_SCALE);
  429.     }
  430.     delete  ini_file;
  431.     return true;
  432. }
  433. //===========================================================================
  434. bool  CRFAGC::REQ_Write_To_File(char *filename)
  435. {
  436.     FrequencyBand FrequencyBandStart;
  437.     if(frmMainSel->cbGSM850->Checked)
  438.     {
  439.         FrequencyBandStart = FrequencyBand850;
  440.     }
  441.     else
  442.     {
  443.         FrequencyBandStart = FrequencyBand900;
  444.     }
  445.     for (FrequencyBand freqband = FrequencyBandStart; freqband<=FrequencyBand1900; freqband++)
  446.     {
  447.         if (!REQ_Write_To_File_Single_Band(filename, freqband))
  448.         {
  449.             return false;
  450.         }
  451.     }
  452.     return  true;
  453. }
  454. //---------------------------------------------------------------------------
  455. bool CRFAGC::REQ_Write_To_File_Single_Band(char *filename, FrequencyBand freqband)
  456. {
  457.     TIniFile   *ini_file;
  458.     char        str[2048];
  459.     int         idata[PLTABLE_SIZE];
  460.     float       fdata[PLTABLE_SIZE];
  461.     int i;
  462.     ini_file = new TIniFile( filename );
  463.     if( ini_file == NULL )  return  false;
  464.     if( ini_file != NULL )
  465.     {
  466.         for(i=0; i<PLTABLE_SIZE; i++)
  467.         {  idata[i] = m_sAgcPathLoss.agcPathLoss[freqband][i].max_arfcn;
  468.         }
  469.         Array_To_String_int( str, idata, PLTABLE_SIZE-1, ',' );
  470.         ini_file->WriteString( SUBBAND_NAME[freqband],
  471.                                  "Max ARFCN",
  472.                                  str );
  473.         for(i=0; i<PLTABLE_SIZE; i++)
  474.         {  fdata[i] = m_sAgcPathLoss.agcPathLoss[freqband][i].gain_offset*1.0/GAIN_SCALE;
  475.         }
  476.         Array_To_String_float( str, fdata, PLTABLE_SIZE-1, ',' );
  477.         ini_file->WriteString( SUBBAND_NAME[freqband],
  478.                                  "RX loss",
  479.                                  str);
  480.         delete  ini_file;
  481.    }
  482.    return  true;
  483. }
  484. //-------------------------------------------------------------------------
  485. bool  CRFAGC::REQ_Write_To_M12193( char *filename )
  486. {
  487.    FILE *fs;
  488.    int  arfcn, loss;
  489.    int  band, i;
  490.    fs = fopen( filename, "a+t" );
  491.    if(fs==0)  return(false);
  492.    fprintf( fs, "/*----------------------------------------*/n");
  493.    fprintf( fs, "/* Calibration data for path loss of gain */n");
  494.    fprintf( fs, "/*----------------------------------------*/n");
  495.    fprintf( fs, "n");
  496.    for(band=2; band<5; band++)
  497.    {
  498.       fprintf( fs, "/* %s....................................................................*/n", BAND_NAME[band] );
  499.       fprintf( fs, "n");
  500.       fprintf( fs, "sAGCGAINOFFSET  AGC_PATHLOSS_%s[ PLTABLE_SIZE ] =n", BAND_NAME[band] );
  501.       fprintf( fs, "{n");
  502.       for( i=0; i<PLTABLE_SIZE-1; i++ )
  503.       {  arfcn = m_sAgcPathLoss.agcPathLoss[band][i].max_arfcn;
  504.          loss  = m_sAgcPathLoss.agcPathLoss[band][i].gain_offset;
  505.          if( (arfcn<0)||(arfcn>1023) )    break;
  506.          fprintf( fs, "    {   %4d, GAINLOSS( %.3f ) },n", arfcn , (float)loss*1.0/GAIN_SCALE );
  507.       }
  508.       fprintf( fs, "    /*-------------------------*/n");
  509.       fprintf( fs, "    { TABLE_END }n");
  510.       fprintf( fs, "};n");
  511.       fprintf( fs, "n");
  512.    }
  513.    fprintf( fs, "/*...........................................................................*/n");
  514.    fprintf( fs, "n");
  515.    fprintf( fs, "sAGCGAINOFFSET*  AGC_PATHLOSS_TABLE[] =n");
  516.    fprintf( fs, "{  0,                                 /*#FrequencyBand400  */n");
  517.    fprintf( fs, "   0,                                 /*#FrequencyBand850  */n");
  518.    fprintf( fs, "   AGC_PATHLOSS_GSM900,               /* FrequencyBand900  */n");
  519.    fprintf( fs, "   AGC_PATHLOSS_DCS1800,              /* FrequencyBand1800 */n");
  520.    fprintf( fs, "   AGC_PATHLOSS_PCS1900,              /* FrequencyBand1900 */n");
  521.    fprintf( fs, "};n");
  522.    fprintf( fs, "n");
  523.    fclose(fs);
  524.    return(true);
  525. }
  526. //===========================================================================
  527. /////////////////////////  Global information  //////////////////////////////
  528. //===========================================================================
  529. E_METAAPP_RESULT_T CRFAGC::Get_ConfirmState(void)
  530. {
  531.     return  m_eConfirmState;
  532. }
  533. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  534. l1cal_agcPathLoss_T* CRFAGC::Get_PathLoss(void)
  535. {
  536.     return &m_sAgcPathLoss;
  537. }
  538. //---------------------------------------------------------------------------
  539. void CRFAGC::Set_PathLoss(l1cal_agcPathLoss_T path_loss)
  540. {
  541.     m_sAgcPathLoss = path_loss;
  542. }