diff src/g23m-gprs/grlc/grlc_func.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/grlc/grlc_func.c	Thu Oct 13 04:24:13 2016 +0000
@@ -0,0 +1,289 @@
+/*
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  GRLC
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  This modul is part of the entity GRLC and implements all
+|             functions according to 921bis.doc
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GRLC_FUNC_C
+#define GRLC_FUNC_C
+#endif
+
+
+#define ENTITY_GRLC
+
+
+/*==== INCLUDES =============================================================*/
+
+
+#include <string.h>
+#include "typedefs.h"   /* to get Condat data types */
+#include "vsi.h"        /* to get a lot of macros */
+#include "macdef.h"
+#include "gprs.h"
+#include "gsm.h"        /* to get a lot of macros */
+#include "ccdapi.h"     /* to get CCD API */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "message.h"    /* to get air message definitions */
+#include "grlc.h"        /* to get the global entity definitions */
+#include "grlc_func.h"   /* to check the function */
+#include "grlc_f.h"      /* to get the global entity definitions */
+#include "grlc_tpcs.h"
+
+/* patch to avoid overwriting of primitives in global variable QueueMsg[] */
+#undef VSI_CALLER_SINGLE
+#define VSI_CALLER_SINGLE 0
+  
+
+/*==== CONST ================================================================*/
+
+/*==== DIAGNOSTICS ==========================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+/*
++------------------------------------------------------------------------------
+| Function    : maca_power_control
++------------------------------------------------------------------------------
+| Description : The function maca_power_control() is described in 921bis.doc
+|
+| Parameters  : see 921bis.doc
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void maca_power_control ( UWORD8  assignment_id,
+                                 BOOL    crc_error,
+                                 WORD8   bcch_level,
+                                 UWORD16 radio_freq[MAC_BURST_PER_BLOCK],
+                                 WORD8   burst_level[MAC_BURST_PER_BLOCK],
+                                 UWORD8 *pch )
+{
+  UBYTE i; /* used for counting */
+
+  tpc_get_pch( pch );
+
+  grlc_data->func.mac_pwr_ctrl_ind.assignment_id = assignment_id;
+  grlc_data->func.mac_pwr_ctrl_ind.crc_error     = ( crc_error ? GRLC_CRC_FAIL : GRLC_CRC_PASS );
+  grlc_data->func.mac_pwr_ctrl_ind.bcch_level    = bcch_level;
+
+  for( i = 0; i < MAC_BURST_PER_BLOCK; i++ )
+  {
+    grlc_data->func.mac_pwr_ctrl_ind.burst_level[i] = burst_level[i];
+    grlc_data->func.mac_pwr_ctrl_ind.radio_freq [i] = radio_freq[i];
+  }
+
+  PSIGNAL( hCommGRLC, MAC_PWR_CTRL_IND, &grlc_data->func.mac_pwr_ctrl_ind );
+
+  return;
+} /* maca_power_control() */
+
+#ifdef _TARGET_
+
+UWORD32 lst_dl_frame_nr;
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : rlc_uplink
++------------------------------------------------------------------------------
+| Description : The function rlc_uplink() is described in 921bis.doc
+|
+| Parameters  : see 921bis.doc
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void rlc_uplink ( UWORD8   assignment_id,
+                         UWORD8   tx_data_no,
+                         UWORD32  fn,
+                         UWORD8   timing_advance_value,
+                         T_ul_poll_resp    * ul_poll_response,
+                         T_ul_data         * ul_data, 
+                         BOOL      allocation_exhausted)
+{
+  UWORD8 i;
+  API *pollptr = (API*)ul_poll_response;
+  API *outptr = (API*)ul_data;
+
+
+  grlc_data->last_ul_fn = fn;
+  grlc_data->ul_fn_store[(grlc_data->ul_cnt_syn%CALL_ERROR_NR_OF_ST_FN)] = fn;
+
+  if(grlc_data->ul_cnt_syn NEQ grlc_data->ul_cnt_asyn)
+  {
+    grlc_data->ul_fn_errors[(grlc_data->ul_cnt_syn%CALL_ERROR_NR_OF_ST_FN)] = fn;
+    grlc_data->ul_fn_errors[(grlc_data->ul_call_errors%CALL_ERROR_NR_OF_ST_FN)] = fn;
+    
+    /* Increment the Call_Error and wraparrond if it exceed CALL_ERROR_NR_OF_ST_FN */
+    grlc_data->ul_call_errors = ((grlc_data->ul_call_errors%CALL_ERROR_NR_OF_ST_FN)+1);    
+  }
+  
+  grlc_data->func.mac_ready_ind.nts      = tx_data_no;
+  grlc_data->func.mac_ready_ind.ta_value = timing_advance_value;
+
+  /*****copy Poll blocks**************************************************/
+  if(fn EQ grlc_data->next_poll_fn)
+  {
+    i=0;
+    while(grlc_data->ul_poll_resp[i].block_status)
+    {
+      pollptr[i*15] = grlc_data->ul_poll_resp[i].block_status;    
+      pollptr[i*15+1] = grlc_data->ul_poll_resp[i].tn;    
+      memcpy( (UBYTE*)&pollptr[i*15+2],
+              (UBYTE*)grlc_data->ul_poll_resp[i].ul_block,
+              12 * sizeof(API) );                               /*lint !e419*/
+      pollptr[15*(i+1)] = 0x0000; /* Poll None*/
+      i++;
+    }
+    grlc_data->ul_poll_resp[0].block_status = 0;
+    grlc_data->next_poll_fn = 2;
+  }
+  else
+  {
+    pollptr[0] = 0x0000; /* Poll None*/
+  }
+
+  
+  /*****copy data blocks**************************************************/
+  
+  outptr[0] = 0;
+  if(grlc_data->ta_value NEQ 0xFF)
+  {
+    for(i=0;i<tx_data_no;i++)
+    {
+      outptr[i*29] = grlc_data->ru.ul_data[i].block_status;
+      memcpy( (UBYTE*)&outptr[1+(i*29)],
+              (UBYTE*)grlc_data->ru.ul_data[i].ul_block,
+              28 * sizeof(API) );                           /*lint !e419*/
+      outptr[(i+1)*29] = 0;
+    }   
+  }
+
+  /*call control of syn part*/
+  grlc_data->ul_cnt_syn++;  
+
+  return;
+} /* rlc_uplink() */
+ 
+
+/*
++------------------------------------------------------------------------------
+| Function    : rlc_downlink
++------------------------------------------------------------------------------
+| Description : The function rlc_downlink() is described in 921bis.doc
+|
+| Parameters  : see 921bis.doc
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void rlc_downlink ( UWORD8        assignment_id,
+                           UWORD32       fn,
+                           T_dl_struct   *data_ptr,
+                           UWORD8        rlc_blocks_sent,
+                           UWORD8        last_poll_response)
+{
+  API * in_ptr = (API*) (data_ptr);
+  BOOL send_psginal;
+  UBYTE i,pos = 0, call_err = 0, crc_cnt=0;
+
+
+  grlc_data->last_dl_fn = lst_dl_frame_nr; 
+  lst_dl_frame_nr = fn;
+  grlc_data->dl_fn_store[(grlc_data->dl_cnt_syn%CALL_ERROR_NR_OF_ST_FN)] = fn-4;
+
+  if(grlc_data->dl_cnt_syn NEQ grlc_data->dl_cnt_asyn)
+  {
+    grlc_data->dl_fn_errors[(grlc_data->dl_cnt_syn%CALL_ERROR_NR_OF_ST_FN)] = fn-4;
+    grlc_data->dl_call_errors++;    
+  }
+
+  grlc_data->dl_fn                           = fn-4;
+  grlc_data->func.dl_blocks.fn               = fn-4;
+  grlc_data->func.dl_blocks.data_ptr.rx_no   = 0;
+  send_psginal = FALSE;
+  if(grlc_data->dl_cnt_syn EQ grlc_data->dl_cnt_asyn)
+  {
+    for (i = 0; i < data_ptr->rx_no; i++) 
+    {
+      /* 
+       * In Test mode B,if there is CRC error on the payload data the MS will,
+       * where required by the USF, transmit the decoded payload data. The block
+       * transmitted will be a valid uplink block format.
+       */
+      
+      if(((in_ptr[31 * i + 1] & 0x0100) EQ 0x0000) OR (grlc_data->testmode.mode EQ CGRLC_LOOP) ) 
+      {
+        send_psginal = TRUE;
+        grlc_data->func.dl_blocks.data_ptr.rx_no++;
+#ifdef TI_PS_16BIT_CPY
+        api_memcpy(&grlc_data->func.dl_blocks.data_ptr.dl_data[pos],
+               &in_ptr[31 * i + 1],
+               31 * sizeof(API) );                                  /*lint !e420*/
+#else
+        memcpy(&grlc_data->func.dl_blocks.data_ptr.dl_data[pos],
+               &in_ptr[31 * i + 1],
+               31 * sizeof(API) );                                  /*lint !e420*/
+#endif
+        pos++;
+      }
+      else        
+      { /* CRC error */
+        grlc_data->nr_of_crc_errors++;
+        crc_cnt++;
+      }
+    }
+  } 
+  else
+  { /* call error */
+    grlc_data->dl_cnt_asyn = grlc_data->dl_cnt_syn;  
+    call_err = 0xFF;
+    TRACE_ERROR("DL CALL ERROR");
+  }
+
+  grlc_data->dl_cnt_syn++;
+  
+  if(send_psginal)
+  { 
+    PSIGNAL(hCommGRLC,MAC_DATA_IND,  (&grlc_data->func.mac_data_ind) ); 
+  }
+  else
+  {
+    grlc_data->dl_cnt_asyn++; /*no signal to GFF, inc asynchronus counter*/ 
+    if(data_ptr->rx_no NEQ  crc_cnt)
+    {
+      TRACE_EVENT_P3("NO DL DATA:  rx_no= %d   crc_err=%d  call_err= %d",data_ptr->rx_no, crc_cnt,call_err);
+    }
+  }
+
+  /* new interface */
+  grlc_data->func.mac_ready_ind.rlc_blocks_sent  = rlc_blocks_sent;
+  grlc_data->func.mac_ready_ind.last_poll_resp   = last_poll_response;
+  grlc_data->func.mac_ready_ind.fn               = fn;
+  grlc_data->ul_fn                               = fn; 
+
+  /* adapte uplink framenumber from downlink framenumber */
+    if((grlc_data->ul_fn % 13) EQ 12)
+      grlc_data->ul_fn++;
+    grlc_data->ul_fn %= FN_MAX;    
+
+  PSIGNAL(hCommGRLC, MAC_READY_IND, &(grlc_data->func.mac_ready_ind));
+
+  return;
+} /* rlc_downlink() */
+
+
+#endif /* _TARGET_ */