⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l1tm_cust.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/************* Revision Controle System Header *************
 *                  GSM Layer 1 software
 * L1TM_CUST.C
 *
 *        Filename %M%
 *        Version  %I%
 *        Date     %G%
 * 
 ************* Revision Controle System Header *************/

#include "l1_confg.h"
#if TESTMODE

#include "tm_defs.h"
#include "l1_const.h"
#include "l1_types.h"

#include "l1tm_defty.h"
#include "l1tm_cust.h"

#if (AUDIO_TASK == 1)
  #include "l1audio_const.h"
  #include "l1audio_cust.h"
  #include "l1audio_defty.h"
#endif
  
#if (L1_GTT == 1)
  #include "l1gtt_const.h"
  #include "l1gtt_defty.h"
#endif
#include "l1_defty.h"
#include "l1_msgty.h"
#include "l1_tabs.h"

#include "l1tm_msgty.h"
#include "l1tm_varex.h"

#include "abb.h"

#if (RF==35)
  #include "tpudrv35.h"
  #include "l1_rf35.h"
#endif

#if (RF==12)
  #include "tpudrv12.h"
  #include "l1_rf12.h"
#endif

#if (RF==10)
  #include "tpudrv10.h"
  #include "l1_rf10.h"
#endif

#if (RF==8)
  #include "tpudrv8.h"
  #include "l1_rf8.h"
#endif

#if (RF==2)
  #include "l1_rf2.h"
#endif

#include <string.h>

#include "rvf_api.h"
#include "Rtc_api.h"

API voice_a_fir31_downlink[31]={0x4000,
	0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0000,0x0000,0x0000,0x0000,0x0000};

API melody_a_fir31_downlink_shipping[31]={0x01BC,
	0xFF96, 0x0271, 0xFEFB, 0xFEB5, 0xFD9D,
	0x054B, 0x00CF, 0xFF48, 0xF6A1, 0x0357,
	0x0761, 0x0C20, 0xEE2D, 0xD721, 0x7620,
	0xD721, 0xEE2D, 0x0C20, 0x0761, 0x0357, 
	0xF6A1, 0xFF48, 0x00CF, 0x054B, 0xFD9D, 
	0xFEB5, 0xFEFB, 0x0271, 0xFF96, 0x01BC};

API melody_a_fir31_downlink_4000[31]={0x4000, 
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
	0x0000};


// Import band configuration from Flash module (need to replace by an access function)
//extern UWORD8       std;
extern T_L1_CONFIG  l1_config;
extern T_RF rf;
extern T_RF_BAND rf_band[GSM_BANDS];
extern UWORD16 AGC_TABLE[AGC_TABLE_SIZE];
extern T_ADC adc;
extern T_ADCCAL adc_cal;
extern UWORD16 TM_ul_data[16]; //Uplink data to be stored into ABB Uplink buffer
extern T_STD_CONFIG std_config[];
static UWORD8 tm_band = 0;

//glowing,2004-06-17,import from M188
extern unsigned char g_pcsyncstatus;
const char * CmdPW = "123456";// must be 1-16 byte,when user use the stw 60 password,we check it,if it is equal with this element, set OpenCmd=1
unsigned char OpenCmd=0;//when it is 1,we can use those write phone command
//glowing,2004-06-17,end of import

// External function prototypes
void get_cal_from_nvmem (UWORD8 *ptr, UWORD16 len, UWORD8 id);
UWORD8 save_cal_in_nvmem (UWORD8 *ptr, UWORD16 len, UWORD8 id);
void Cust_init_std(void);
void l1_tpu_init_light(void);

enum {
  TM_RF_ID        = 0,
  TM_ADC_ID       = 1
};

typedef signed char effs_t;
// external FFS function prototypes
effs_t ffs_mkdir(const char *pathname);
void config_ffs_write(char type);
									   
/***********************************************************************/
/*                           TESTMODE 4.X                              */
/***********************************************************************/


/*----------------------------------------------------------*/
/* Cust_tm_init()                                           */
/*----------------------------------------------------------*/
/* Parameters :                                             */
/* Return     :                                             */
/* Functionality : Init default configuration for TM params */
/*----------------------------------------------------------*/

void Cust_tm_init(void)
{
  UWORD32 i;

  l1_config.adc_enable                             = ADC_ENABLE; // ADC readings enabled
  l1_config.agc_enable                             = AGC_ENABLE; // AGC algo enabled
  l1_config.afc_enable                             = AFC_ENABLE; // AFC algo enabled
  l1_config.tmode.rf_params.bcch_arfcn             = TM_BCCH_ARFCN;
  l1_config.tmode.rf_params.tch_arfcn              = TM_TCH_ARFCN;
  l1_config.tmode.rf_params.mon_arfcn              = TM_MON_ARFCN;
  l1_config.tmode.rf_params.channel_type           = TM_CHAN_TYPE; // TCH_F
  l1_config.tmode.rf_params.subchannel             = TM_SUB_CHAN;
  l1_config.tmode.rf_params.reload_ramps_flag      = 0;
  l1_config.tmode.rf_params.tmode_continuous       = TM_NO_CONTINUOUS;
  l1_config.tmode.rx_params.slot_num               = TM_SLOT_NUM; // Time Slot
  l1_config.tmode.rx_params.agc                    = TM_AGC_VALUE; //This may be outside the range of the RF chip used
  l1_config.tmode.rx_params.pm_enable              = TM_PM_ENABLE;
  l1_config.tmode.rx_params.lna_off                = TM_LNA_OFF;
  l1_config.tmode.rx_params.number_of_measurements = TM_NUM_MEAS;  
  l1_config.tmode.rx_params.place_of_measurement   = TM_WIN_MEAS;
  l1_config.tmode.tx_params.txpwr                  = TM_TXPWR; // Min power level for GSM900
  l1_config.tmode.tx_params.txpwr_skip             = TM_TXPWR_SKIP;
  l1_config.tmode.tx_params.timing_advance         = TM_TA;
  l1_config.tmode.tx_params.burst_type             = TM_BURST_TYPE; // default is normal up-link burst
  l1_config.tmode.tx_params.burst_data             = TM_BURST_DATA; // default is all zeros
  l1_config.tmode.tx_params.tsc                    = TM_TSC; // Training Sequence ("BCC" on BSS)
  #if (CODE_VERSION != SIMULATION)
    l1_config.tmode.stats_config.num_loops         = TM_NUM_LOOPS; // 0 actually means infinite
  #else
    l1_config.tmode.stats_config.num_loops         = 4; // 0 actually means infinite
  #endif
  l1_config.tmode.stats_config.auto_result_loops   = TM_AUTO_RESULT_LOOPS; // 0 actually means infinite
  l1_config.tmode.stats_config.auto_reset_loops    = TM_AUTO_RESET_LOOPS; // 0 actually means infinite
  l1_config.tmode.stats_config.stat_type           = TM_STAT_TYPE;
  l1_config.tmode.stats_config.stat_bitmask        = TM_STAT_BITMASK;

  #if (CODE_VERSION != SIMULATION)
    // Initialize APCDEL1 register of Omega
    ABB_Write_Register_on_page(PAGE0, APCDEL1, (C_APCDEL - 0x0004) >> 6);
  #endif

  l1tm.tm_msg_received                       = FALSE;

  for (i=0;i<16;i++)
    TM_ul_data[i]=0;

  #if L1_GPRS
    l1_config.tmode.rf_params.pdtch_arfcn          = TM_PDTCH_ARFCN;
    l1_config.tmode.rf_params.multislot_class      = TM_MULTISLOT_CLASS;
    l1_config.tmode.stats_config.stat_gprs_slots   = TM_STAT_GPRS_SLOTS;
    l1_config.tmode.rx_params.timeslot_alloc       = TM_RX_ALLOCATION;
    l1_config.tmode.rx_params.coding_scheme        = TM_RX_CODING_SCHEME;
    l1_config.tmode.tx_params.timeslot_alloc       = TM_TX_ALLOCATION;
    l1_config.tmode.tx_params.coding_scheme        = TM_TX_CODING_SCHEME;
    for (i=0; i<8; i++)
      l1_config.tmode.tx_params.txpwr_gprs[i]      = TM_TXPWR_GPRS;

    for (i=0; i<27; i++)
      l1_config.tmode.tx_params.rlc_buffer[i] = 0;
  #endif
}


/**********************************************************************/
/* Test mode functions used for RF calibration                        */
/**********************************************************************/

void Cust_tm_rf_param_write(T_TM_RETURN *tm_return, WORD16 index, UWORD16 value)
{
  switch (index)
  {
    case STD_BAND_FLAG:
    {
      UWORD8 std_temp, band_temp;

      std_temp  = value & 0xff;  // tm_band = b7..0 of value
      band_temp = value >> 8;    // band    = b15..8 of value
          // get define 
      //if (sizeof(std_config)/sizeof(T_STD_CONFIG) <= std_temp)
      if (9 <= std_temp)  // std max
      {
        tm_return->status = E_BADINDEX;
        break;
      }
      else if ( GSM_BANDS <= band_temp)
      {
        tm_return->status = E_BADINDEX;
        break;
      }
      else if ( BAND_NONE == std_config[std_temp].band[band_temp])
      {
        tm_return->status = E_BADINDEX;
        break;
      } 
      else
      {
        l1_config.std.id = std_temp;  
        tm_band = band_temp; 
        // update RAM struct with either default or ffs
        Cust_init_std();
        l1_tpu_init_light();
        tm_return->status = E_OK;
        break;
      }
    }
    
    case INITIAL_AFC_DAC:
    {
      rf.afc.eeprom_afc = (WORD16) value << 3; // shift to put into F13.3 format
      l1_config.params.eeprom_afc = rf.afc.eeprom_afc;

      tm_return->status = E_OK;
      break;
    }
    default:
    {
      tm_return->status = E_BADINDEX;
      break;
    }
  } // end switch
}

void Cust_tm_rf_param_read(T_TM_RETURN *tm_return, WORD16 index)
{
  volatile UWORD16 value;

  switch (index)
  {
    case STD_BAND_FLAG:
    {
       value = ((tm_band << 8) | (l1_config.std.id) ); // return global std, tm_band (intel format)
      break;
    }
    case INITIAL_AFC_DAC:
    {
      value = rf.afc.eeprom_afc >> 3; // returned as F13.3
      break;
    }
    default:
    {
      tm_return->size = 0;
      tm_return->status = E_BADINDEX;
      return;
    }
  } // end switch

  memcpy(tm_return->result, (UWORD8 *)&value, 2);
  tm_return->size = 2;
  tm_return->status = E_OK;
}

void Cust_tm_rf_table_write(T_TM_RETURN *tm_return, WORD8 index, UWORD8 size, UWORD8 table[])
{
  UWORD8 band=0;

  tm_return->index = index;  // store index before it gets modified
  tm_return->size = 0;

  switch (index)
  {
    case RX_AGC_TABLE:
    {
      if (size != sizeof(AGC_TABLE))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&AGC_TABLE[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case AFC_PARAMS:
    {

      #if (VCXO_ALGO == 1)
        if (size != 24)  //  4 UWORD32 + 4 WORD16 values
      #else
        if (size != 16)  // 4 UWORD32 values
      #endif
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf.afc.psi_sta_inv, table, size);
      l1_config.params.psi_sta_inv  = rf.afc.psi_sta_inv;
      l1_config.params.psi_st       = rf.afc.psi_st;
      l1_config.params.psi_st_32    = rf.afc.psi_st_32;
      l1_config.params.psi_st_inv   = rf.afc.psi_st_inv;

   #if (CODE_VERSION == NOT_SIMULATION)
      #if (VCXO_ALGO == 1)
        l1_config.params.afc_dac_center = rf.afc.dac_center;
        l1_config.params.afc_dac_min    = rf.afc.dac_min;   
        l1_config.params.afc_dac_max    = rf.afc.dac_max;   
        l1_config.params.afc_snr_thr    = rf.afc.snr_thr;   
      #endif
      #endif

      tm_return->status = E_OK;
      break;
    }
    case RX_AGC_GLOBAL_PARAMS:
    {
      if (size != 10)  // 5 UWORD16 values
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf.rx.agc.low_agc_noise_thr, table, size);
      l1_config.params.low_agc_noise_thr  = rf.rx.agc.low_agc_noise_thr;
      l1_config.params.high_agc_sat_thr   = rf.rx.agc.high_agc_sat_thr;
      l1_config.params.low_agc            = rf.rx.agc.low_agc;
      l1_config.params.high_agc           = rf.rx.agc.high_agc;

      tm_return->status = E_OK;
      break;
    }
    case RX_IL_2_AGC_MAX:
    {
      if (size != sizeof(rf.rx.agc.il2agc_max))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf.rx.agc.il2agc_max[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case RX_IL_2_AGC_PWR:
    {
      if (size != sizeof(rf.rx.agc.il2agc_pwr))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf.rx.agc.il2agc_pwr[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case RX_IL_2_AGC_AV:
    {
      if (size != sizeof(rf.rx.agc.il2agc_av))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf.rx.agc.il2agc_av[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case TX_LEVELS:
    {
      if (size != sizeof(rf_band[tm_band].tx.levels))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf_band[tm_band].tx.levels[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case TX_CAL_CHAN: // generic for all bands
    {
      if (size != sizeof(rf_band[tm_band].tx.chan_cal_table))
      {
        tm_return->status = E_BADSIZE;
        break;
      }
      
      memcpy(&rf_band[tm_band].tx.chan_cal_table[0][0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case TX_CAL_TEMP: // generic for all bands
    {
      if (size != sizeof(rf_band[tm_band].tx.temp))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf_band[tm_band].tx.temp[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case RX_CAL_CHAN:  // generic for all bands
    {
      if (size != sizeof(rf_band[tm_band].rx.agc_bands))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf_band[tm_band].rx.agc_bands[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case RX_CAL_TEMP:  // generic for all bands
    {
      if (size != sizeof(rf_band[tm_band].rx.temp))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf_band[tm_band].rx.temp[0], table, size);
      tm_return->status = E_OK;
      break;
    }
    case RX_AGC_PARAMS:
    {
      if (size != sizeof(rf_band[tm_band].rx.rx_cal_params))
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&rf_band[tm_band].rx.rx_cal_params, table, size);
      if (tm_band == 0)
      {
          l1_config.std.g_magic_band1             = rf_band[tm_band].rx.rx_cal_params.g_magic;
          l1_config.std.lna_att_band1             = rf_band[tm_band].rx.rx_cal_params.lna_att;
          l1_config.std.lna_switch_thr_low_band1  = rf_band[tm_band].rx.rx_cal_params.lna_switch_thr_low;
          l1_config.std.lna_switch_thr_high_band1 = rf_band[tm_band].rx.rx_cal_params.lna_switch_thr_high;
        }
      else if (tm_band == 1)
        {
          l1_config.std.g_magic_band2             = rf_band[tm_band].rx.rx_cal_params.g_magic;
          l1_config.std.lna_att_band2             = rf_band[tm_band].rx.rx_cal_params.lna_att;
          l1_config.std.lna_switch_thr_low_band2  = rf_band[tm_band].rx.rx_cal_params.lna_switch_thr_low;
          l1_config.std.lna_switch_thr_high_band2 = rf_band[tm_band].rx.rx_cal_params.lna_switch_thr_high;
        }
        else
        {
          tm_return->status = E_INVAL;
          break;
        }

      tm_return->status = E_OK;
      break;
    }
    case TX_CAL_EXTREME:
    case RX_CAL_LEVEL:
    {
      tm_return->status = E_NOSUBSYS;
      break;
    }
    #if L1_GPRS
      case RLC_TX_BUFFER_CS1:
      case RLC_TX_BUFFER_CS2:
      case RLC_TX_BUFFER_CS3:
      case RLC_TX_BUFFER_CS4:
      {
        UWORD8 i, buffer_size;

        tm_return->index = index;  // store index before it gets modified
        tm_return->size  = 0;

        buffer_size = size/2 + size%2;  // bytes will be concatenated into UWORD16

        if (buffer_size > 27)  //max. number of data bytes
        {
          tm_return->status = E_BADSIZE;
          break;
        }

        // make sure that last byte is zero in case of odd number of bytes
        table[size] = 0; 
 
        // init the whole buffer before downloading new data
        for (i=0; i<27; i++)
          l1_config.tmode.tx_params.rlc_buffer[i] = 0;

        for (i=0; i<buffer_size; i++)
        {
          l1_config.tmode.tx_params.rlc_buffer[i] = (table[2*i+1] << 8) | table[2*i];
        }
        l1_config.tmode.tx_params.rlc_buffer_size = buffer_size;

        tm_return->status = E_OK;
        break;
      }
    #endif
    case TX_DATA_BUFFER:
    {
      UWORD8 i;

      tm_return->index = index;  // store index before it gets modified
      tm_return->size  = 0;

      if (size != 32)  // 16 UWORD16 (containing 10 data bits each)
      {
        tm_return->status = E_BADSIZE;
        break;
      }

      memcpy(&TM_ul_data, table, size);

      for (i=0; i<16; i++)
      {
        TM_ul_data[i] = TM_ul_data[i] << 6;
      }        	    

      tm_return->status = E_OK;
      break;
    }  
    default:
    {
      tm_return->status = E_BADINDEX;
      break;
    }
  } // end switch
}

void Cust_tm_rf_table_read(T_TM_RETURN *tm_return, WORD8 index)
{
  switch (index)
  {
    case RX_AGC_TABLE:
    {
      tm_return->size = sizeof(AGC_TABLE);
      memcpy(tm_return->result, &AGC_TABLE[0], tm_return->size);
      break;
    }
    case AFC_PARAMS:
    {
      #if (VCXO_ALGO == 1)
      tm_return->size = 24;  // 4 UWORD32's + 4 WORD16
      #else
      tm_return->size = 16;  // 4 UWORD32's
      #endif
      memcpy(tm_return->result, &rf.afc.psi_sta_inv, tm_return->size);
      break;
    }
    case RX_AGC_GLOBAL_PARAMS:
    {

      tm_return->size = 10;  // 5 UWORD16's
      memcpy(tm_return->result, &rf.rx.agc.low_agc_noise_thr, tm_return->size);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -