📄 cst_pei.c
字号:
/*
+--------------------------------------------------------------------+
/*
+-------------------------------------------------------------------+
| PROJECT: GSM-F&D (8411) $Workfile:: cst_pei.c $|
| $Author: zhenggl $ CONDAT GmbH $Revision: 1.2 $|
| CREATED: 01.02.99 $Modtime:: 14.02.00 12:14 $|
| STATE : code |
+--------------------------------------------------------------------+
MODULE : CST_PEI
PURPOSE : This Modul defines the process body interface for the
component CST of the mobile station.
EXPORT : pei_create - Create the Protocol Stack Entity
pei_init - Initialize Protocol Stack Entity
pei_primitive - Process Primitive
pei_timeout - Process Timeout
pei_exit - Close resources and terminate
pei_run - Process Primitive
pei_config - Dynamic Configuration
pei_monitor - Monitoring of physical Parameters
*/
#ifndef CST_PEI_C
#define CST_PEI_C
#endif
#include "swconfig.cfg"
#include "chipset.cfg"
#define ENTITY_CST
/*==== INCLUDES ===================================================*/
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "typedefs.h"
#include "vsi.h"
#include "custom.h"
#include "gsm.h"
#include "prim.h"
#include "cnf_cst.h"
#include "cus_cst.h"
#include "mon_cst.h"
#include "tok.h"
#include "p_cst.h"
#include "cst.h"
#include "rx.h"
#include "audio.h"
/*==== CONSTANTS ==================================================*/
// token processing
#define ERROR -1
#define EOS 1
#define COMMA 2
#define EQUAL 3
#define IDENT 4
#define STRING 5
#define LBRACK 6
#define RBRACK 7
/*==== EXPORT =====================================================*/
extern void CST_stack_trace(void);
int cst_gsm_parameters(TOK_DCB *dcb);
extern void l1_cst_l1_parameters(char*);
extern void csf_adc_start (UBYTE tx_flag, UBYTE traffic_period, UBYTE idle_period);
extern void spi_adc_on (void);
GLOBAL T_HANDLE t_adc_timer = VSI_ERROR;
GLOBAL T_HANDLE hCommPL = VSI_ERROR; /* PL Communication */
GLOBAL T_HANDLE hCommL1 = VSI_ERROR; /* L1 Communication */
T_HANDLE cst_handle;
//GLOBAL UBYTE extDisplay = 0;
EXTERN UBYTE extDisplay ;
EXTERN UBYTE audio_is_free;
/*==== PRIVATE ====================================================*/
LOCAL const void pei_not_supported (void *data);
#ifdef OPTION_RELATIVE
LOCAL ULONG offset;
#endif
/*==== VARIABLES ==================================================*/
LOCAL USHORT t_flag = 0;
LOCAL BOOL exit_flag = FALSE;
LOCAL BOOL first_access = TRUE;
LOCAL T_MONITOR cst_mon;
/*==== FUNCTIONS ==================================================*/
LOCAL const T_FUNC cst_table[] =
{
MAK_FUNC_0 ( csf_adc_process , CST_ADC_IND )
};
/*==== PROTOTYPES==================================================*/
#if defined (_TMS470)
static SHORT cst_tok_gettok (TOK_DCB *dcb, char ** token);
static SHORT cst_tok_value (TOK_DCB *dcb, char * value []);
static int cst_tokenizer_has_more_data(const TOK_DCB *dcb);
static SHORT cst_tok_issep (char c);
static void cst_tok_init (char * s, TOK_DCB *dcb, char *buf, int buf_len);
static SHORT cst_get_values(TOK_DCB *dcb, char *value[]);
static int cst_getbyte(TOK_DCB *dcb);
#endif
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_primitive |
+--------------------------------------------------------------------+
PURPOSE : This function processes protocol specific primitives.
*/
LOCAL SHORT pei_primitive (void * ptr)
{
T_PRIM *prim = ptr;
if (prim NEQ NULL)
{
USHORT opc = prim->custom.opc;
USHORT n;
const T_FUNC *table;
VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);
switch (opc & OPC_MASK)
{
case CST_DL: table = cst_table; n = TAB_SIZE (cst_table); break;
default : table = NULL; n = 0; break;
}
if (table != NULL )
{
if ((opc & PRM_MASK) < n)
{
table += opc & PRM_MASK;
#ifdef PALLOC_TRANSITION
P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
#endif
JUMP (table->func) (P2D(prim));
}
else
{
pei_not_supported (P2D(prim));
}
return PEI_OK;
}
#ifdef GSM_ONLY
PFREE (P2D(prim))
return PEI_ERROR;
#else
if (opc & SYS_MASK)
{
vsi_c_primitive (VSI_CALLER prim);
}
else
{
PFREE (P2D(prim))
return PEI_ERROR;
}
#endif
}
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_not_supported |
+--------------------------------------------------------------------+
PURPOSE : This function handles an unsupported primitive.
*/
LOCAL const void pei_not_supported (void *data)
{
TRACE_FUNCTION ("pei_not_supported()");
PFREE (data);
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_init |
+--------------------------------------------------------------------+
PURPOSE : This function initializes the protocol stack entity
*/
LOCAL SHORT pei_init (T_HANDLE handle)
{
cst_handle = handle;
TRACE_FUNCTION ("pei_init()")
exit_flag = FALSE;
if (hCommPL < VSI_OK)
{
if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK)
{
return PEI_ERROR;
}
}
if (hCommL1 < VSI_OK)
{
if ((hCommL1 = vsi_c_open (VSI_CALLER L1_NAME)) < VSI_OK)
{
return PEI_ERROR;
}
}
vsi_t_start (VSI_CALLER CST_ADC_TIMER, 230); // equal to 50 TDMA frames
#if defined (_TMS470)
// Set the sleep mode authorized for the layer1 synchronous.
// Possible modes are :
// for CHIPSET = 0 : NO_SLEEP, SMALL_SLEEP, BIG_SLEEP.
// It is necessary to indicate in the prototype of power_down_config()
// function which clocks (amongst ARMIO_CLK, UWIRE_CLK, SIM_CLK and UART_CLK)
// to be stopped in case of BIG_SLEEP mode.
// With this default init, ARMIO_CLK, UWIRE_CLK, SIM_CLK and UART_CLK will be stopped
// in case of BIG_SLEEP mode, but it can be changed here.
// other CHIPSETs : NO_SLEEP, SMALL_SLEEP, BIG_SLEEP, DEEP_SLEEP, ALL_SLEEP.
// It is necessary to indicate in the prototype of power_down_config()
// function which clocks to be stopped in case of BIG_SLEEP mode,
// amongst ARMIO and UWIRE clocks.
// With this default init, UWIRE_CLK will always be stopped
// in case of BIG_SLEEP mode, but it can be changed here.
// The default configuration is ALL SLEEP. It can be changed in this init.
// WARNING !! THE SLEEP MODE SHOULD NOT BE MODIFIED ONCE THE SYSTEM INIT IS FINISHED !!
#if !defined (TI_VERSION)
#if (CHIPSET == 0)
power_down_config(NO_SLEEP, ARMIO_CLK | UWIRE_CLK | SIM_CLK | UART_CLK);
#elif ((CHIPSET == 2) || (CHIPSET == 3) || \
(CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10))
power_down_config(ALL_SLEEP, UWIRE_CLK_CUT);
#elif ((CHIPSET == 4) || (CHIPSET == 9) || (CHIPSET == 11))
power_down_config(NO_SLEEP, UWIRE_CLK_CUT);
#endif
#endif
#endif
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_timeout |
+--------------------------------------------------------------------+
PURPOSE : This function processes timeouts.
*/
LOCAL SHORT pei_timeout (USHORT index)
{
rx_timeout (index);
audio_timeout (index);
if (index EQ CST_ADC_TIMER)
{
// start the AD conversions in layer1 synchronous
// this function will send MMI_ADC_REQ primitive to L1A for test reason.
// The user has to implement it by himself in the MMI.
// The parameters are : tx_flag, traffic_period, idle_period.
// Please refer to the ADC specification for details.
// WCS Patch : Schedule ADC on RX and TX
#if (OP_WCP == 1)
csf_adc_start(1, 10, 1);
#else
csf_adc_start(0, 10, 1);
#endif
spi_adc_on();
}
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_exit |
+--------------------------------------------------------------------+
PURPOSE : This function closes all resources and terminates.
*/
LOCAL SHORT pei_exit (void)
{
TRACE_FUNCTION ("pei_exit()")
/*
* clean up communication
*/
vsi_c_close (VSI_CALLER hCommPL);
hCommPL = VSI_ERROR;
vsi_c_close (VSI_CALLER hCommL1);
hCommL1 = VSI_ERROR;
exit_flag = TRUE;
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_config |
+--------------------------------------------------------------------+
PURPOSE : Dynamic Configuration
*/
#if !defined (NCONFIG)
LOCAL KW_DATA kwtab[] = {
CST_CONFIG, ID_CONFIG,
CST_MUTE, ID_MUTE,
CST_GSM_PARAMETERS, ID_GSM_PARAMETERS,
CST_L1_PARAMETERS, ID_L1_PARAMETERS,
"", 0
};
GLOBAL KW_DATA partab[] = {
"", 0
};
#endif
GLOBAL SHORT pei_config (T_PEI_CONFIG inString)
{
#if !defined (NCONFIG)
char * s = inString;
SHORT valno;
USHORT keyno;
char * keyw;
char * val [10];
TOK_DCB tokenizer;
char token_buf[80];
SHORT token_type;
int error; /* terminate processing */
TRACE_FUNCTION ("pei_config()")
TRACE_FUNCTION (s);
cst_tok_init(s, &tokenizer, &token_buf[0], sizeof(token_buf));
/*
* Parse next keyword and number of variables
*/
error = 0;
while (!error && cst_tokenizer_has_more_data(&tokenizer))
{
token_type = cst_tok_gettok(&tokenizer, &keyw);
if (token_type != IDENT)
{
error = 1;
}
else
{
switch ((keyno = tok_key((KW_DATA *)kwtab, keyw)))
{
case ID_CONFIG:
valno = cst_get_values(&tokenizer, val);
if (valno EQ 3)
{
extDisplay = 1;
}
break;
case ID_MUTE:
valno = cst_get_values(&tokenizer, val); /* eat up rest of line */
/*
* FTA testcase 26.6.3.4 needs the the MS is in audio free
* environment. This config disables opening of the audio
* path.
*/
audio_is_free = FALSE;
break;
case ID_GSM_PARAMETERS:
cst_gsm_parameters(&tokenizer);
break;
case ID_L1_PARAMETERS:
/* pass parameters to L1 function for further process */
#if( TRACE_TYPE== 4 ) //glowing,2004-06-25, for no trace version
l1_cst_l1_parameters(s);
valno = cst_get_values(&tokenizer, val); /* eat up rest of line */
#endif
break;
default:
TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword");
break;
}
}
}
#endif
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CST_PEI |
| STATE : code ROUTINE : cst_pei_config |
+--------------------------------------------------------------------+
PURPOSE : Dynamic Configuration
*/
GLOBAL SHORT cst_pei_config ( char * inString, char * dummy )
{
pei_config ( inString );
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_monitor |
+--------------------------------------------------------------------+
PURPOSE : This function monitors physical parameters.
*/
LOCAL SHORT pei_monitor (void ** monitor)
{
TRACE_FUNCTION ("pei_monitor()")
cst_mon.version = VERSION_CST;
*monitor = &cst_mon;
return PEI_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT : XXX MODULE : CST_PEI |
| STATE : code ROUTINE : pei_create |
+--------------------------------------------------------------------+
PURPOSE : This function creates the protocol stack entity.
*/
GLOBAL SHORT cst_pei_create (T_PEI_INFO **info)
{
static const T_PEI_INFO pei_info =
{
"CST",
{
pei_init,
pei_exit,
pei_primitive,
pei_timeout,
NULL, /* no signal function */
NULL, /* no run function */
pei_config,
pei_monitor,
},
1536, /* Stack Size */
10, /* Queue Entries */
55, /* Priority */
MAX_CST_TIMER, /* number of timer */
0x03 /* flags */
};
TRACE_FUNCTION ("pei_create()")
/*
* Close Resources if open
*/
if (first_access)
first_access = FALSE;
else
pei_exit ();
/*
* Export startup configuration data
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -