FreeCalypso > hg > freecalypso-citrine
diff g23m-gsm/alr/alr_trc.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m-gsm/alr/alr_trc.c Thu Jun 09 00:02:41 2016 +0000 @@ -0,0 +1,447 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS +| Modul : ALR_TRC ++----------------------------------------------------------------------------- +| 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 defines functions for the offline trace ++----------------------------------------------------------------------------- +*/ + +#ifndef ALR_TRC_C +#define ALR_TRC_C + +#include "config.h" +#include "fixedconf.h" +#include "condat-features.h" + +#define ENTITY_PL + +/*==== INCLUDES ===================================================*/ +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include "typedefs.h" +#include "pconst.cdg" +#include "mconst.cdg" +#include "message.h" +#include "ccdapi.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "cnf_alr.h" +#include "mon_alr.h" +#include "pei.h" +#include "tok.h" +#include "pcm.h" + +#ifdef GPRS +#include "alr_gprs.h" +#endif + +#include "alr.h" + +#if defined (ALR_TRACE_ENABLED) +/* + * The ALR Trace is a cyclic buffer for + * debugging ALR problems. + * + * The buffer will be initialized at startup and will + * be filled by the function alr_trc_dl_trace() until it is full. + * The size of the buffer is ALR_TRC_SIZE. + * + * The content is + * + * actual_channel + * State + * sysclock + * L2 data + * + * During IDLE mode (triggered by RX_PERIODIC_IND in ALR/TIL_main.c) + * an output is written to the _PL.dbg (ALR_TRC_MAX_READED traces each trigger) + */ + +/* prototypes */ +void alr_trc_clear (void); +#define ALR_TRC_SIZE 90 +#define ALR_TRC_MAX_READED 8 + +#if (((ALR_TRC_SIZE-1) & (~ALR_TRC_SIZE)) == (ALR_TRC_SIZE-1)) +#define POWER_OF_2 +#pragma message("ALR_TRC_SIZE is power of 2") +#else +#pragma message("ALR_TRC_SIZE is NOT power of 2") +#endif + +typedef struct +{ + UCHAR event; + UCHAR state; + UCHAR actual_channel; + USHORT sysclock; + UCHAR data [ALR_TRC_DATA_SIZE]; +} T_IDLE_TRACE_DATA; + +T_IDLE_TRACE_DATA alr_csIDLE_Trace_buffer [ALR_TRC_SIZE]; +USHORT alr_csIDLE_Trace_index = 0; +USHORT alr_csIDLE_Trace_read_index = 0; + +static T_HANDLE sem_ALR_TRC; + +#define ENTER_CRITICAL_SECTION(sem) if (alr_trc_enter_critical_section(sem))return; +#define LEAVE_CRITICAL_SECTION(sem) if (alr_trc_leave_critical_section(sem))return; + + +/* ++-----------------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_semaphore_err | ++-----------------------------------------------------------------------------+ + + PURPOSE : Handles semaphore error situation + +*/ + +static void alr_trc_semaphore_err (void) +{ + static UCHAR out = 0; + if (!out) + { + out = 1; + vsi_o_ttrace(VSI_CALLER TC_EVENT, "semaphore error"); + } +}//endfunc alr_trc_dl_trace_cs_err + + +/* ++-----------------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_enter_critical_section | ++-----------------------------------------------------------------------------+ + + PURPOSE : Enters critical section + +*/ + +static int alr_trc_enter_critical_section (T_HANDLE sem) +{ + if (vsi_s_get (VSI_CALLER sem) NEQ VSI_OK) + { + alr_trc_semaphore_err(); + return -1; + } + else + { + return 0; + } +}//endfunc alr_trc_enter_critical_section + + +/* ++-----------------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_leave_critical_section | ++-----------------------------------------------------------------------------+ + + PURPOSE : Leaves critical section + +*/ + +static int alr_trc_leave_critical_section (T_HANDLE sem) +{ + if (vsi_s_release (VSI_CALLER sem) NEQ VSI_OK) + { + alr_trc_semaphore_err(); + return -1; + } + else + { + return 0; + } +}//endfunc alr_trc_leave_critical_section + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_init | ++--------------------------------------------------------------------+ + + PURPOSE : Init tracing + +*/ + + +void alr_trc_init (void) +{ + sem_ALR_TRC = vsi_s_open (VSI_CALLER "ALR_IDLE_TRACE",1); + if (sem_ALR_TRC NEQ VSI_ERROR) + alr_trc_clear (); + else + vsi_o_ttrace(VSI_CALLER TC_EVENT, "can't open semaphore \"ALR_IDLE_TRACE\""); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_exit | ++--------------------------------------------------------------------+ + + PURPOSE : Close tracing + +*/ + +void alr_trc_exit (void) +{ + if (sem_ALR_TRC NEQ VSI_ERROR) + vsi_s_close (VSI_CALLER sem_ALR_TRC); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_clear | ++--------------------------------------------------------------------+ + + PURPOSE : Clears trace index + +*/ + + +void alr_trc_clear (void) +{ + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + alr_csIDLE_Trace_index = alr_csIDLE_Trace_read_index = 0; + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); + + vsi_o_ttrace(VSI_CALLER TC_EVENT, "IDLE_Trace_index reseted"); +} + +#if 0 +static void alr_trc_sleep_mode (void) +{ + static UCHAR sleep_mode_disabled = FALSE; + + if (!sleep_mode_disabled) + { + #define NO_SLEEP 0 + #define ARMIO_CLK 0x0001 + #define UWIRE_CLK 0x0020 + #define SIM_CLK 0x0040 + #define UART_CLK 0x0400 + + #if defined (_TARGET_) + #if !defined( GPRS ) + power_down_config(NO_SLEEP, ARMIO_CLK | UWIRE_CLK | SIM_CLK | UART_CLK); + #endif + #endif /* _TARGET_ */ + sleep_mode_disabled = TRUE; + } +}//endfunc alr_trc_sleep_mode +#endif /* 0|1 */ +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_store | ++--------------------------------------------------------------------+ + + PURPOSE : Fill in a trace. + +*/ + +void alr_trc_store (UCHAR event, UCHAR actual_channel, UCHAR state, void* data) +{ + T_IDLE_TRACE_DATA* trace_data; + USHORT write_index; + USHORT length; + T_TIME sysClock; + + +#if 0 + { + USHORT semCount; + + if (vsi_s_status (VSI_CALLER sem_ALR_TRC, &semCount) NEQ VSI_OK) + { + alr_trc_semaphore_err(); + return; + } + if (semCount EQ 0) + { + vsi_o_ttrace(VSI_CALLER TC_EVENT, "semCount == 0"); + return; + } + } +#endif /* 0|1 */ + + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + +#if defined(POWER_OF_2) + write_index = (alr_csIDLE_Trace_index + 1) & (ALR_TRC_SIZE - 1); /* if ALR_TRC_SIZE power of 2 */ +#else + write_index = (alr_csIDLE_Trace_index + 1) % ALR_TRC_SIZE; /* if ALR_TRC_SIZE not power of 2 */ +#endif /* POWER_OF_2 */ + if (write_index NEQ alr_csIDLE_Trace_read_index) + {/* buffer is not full */ + trace_data = &alr_csIDLE_Trace_buffer[alr_csIDLE_Trace_index]; + + trace_data->event = event; + if (actual_channel >= ALR_TRC_CH_UNKNOWN) + trace_data->actual_channel = ALR_TRC_CH_UNKNOWN; + else + trace_data->actual_channel = actual_channel; + trace_data->state = state; + vsi_t_time (VSI_CALLER &sysClock); + trace_data->sysclock = (USHORT)sysClock; + + if (event EQ ALR_TRC_DOWNLINK OR event EQ ALR_TRC_UPLINK) + length = 23; + else + length = ALR_TRC_DATA_SIZE; + + if (event EQ ALR_TRC_STRING) + strncpy ((char*)trace_data->data, (char*)data, length); + else + memcpy (trace_data->data, (UCHAR*)data, length); + + alr_csIDLE_Trace_index = write_index; + }/* endif buffer is not full */ + + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); +}/* endfunc alr_trc_store */ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : ALT_TRC | +| STATE : code ROUTINE : alr_trc_read | ++--------------------------------------------------------------------+ + + PURPOSE : Read and output stored trace. + +*/ + + +void alr_trc_read_all (void) +{ + USHORT write_index, read_index; + + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + write_index = alr_csIDLE_Trace_index; + read_index = alr_csIDLE_Trace_read_index; + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); + + while (read_index NEQ write_index) + { + alr_trc_read (20); + vsi_t_sleep(VSI_CALLER 0); + + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + write_index = alr_csIDLE_Trace_index; + read_index = alr_csIDLE_Trace_read_index; + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); + } +}/* endfunc alr_trc_dl_trace_read_all */ + +static const char * ALR_TRC_CHANNEL[7] = { " ", "Ff", "Fh", "S4", "S8", "SA", "??" }; +static const char * ALR_TRC_EVENTS[4] = { "UL", "DL", "Ev", "ev" }; + +void alr_trc_read (int count) +{ + T_IDLE_TRACE_DATA trace_data; + USHORT write_index, read_index; + static char buffer[ALR_TRC_DATA_SIZE*2+50]; + UCHAR j, o, readed = 0; + + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + write_index = alr_csIDLE_Trace_index; + read_index = alr_csIDLE_Trace_read_index; + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); + +#if 0 + if (read_index EQ write_index) + { + alr_trc_sleep_mode (); + return; + } +#endif /* 0|1 */ + + while (read_index NEQ write_index) + { + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + trace_data = alr_csIDLE_Trace_buffer[read_index]; + alr_csIDLE_Trace_buffer[read_index].sysclock = 0xffff; /* readed */ + alr_csIDLE_Trace_read_index++; +#if defined(POWER_OF_2) + alr_csIDLE_Trace_read_index&= (ALR_TRC_SIZE-1); /* if power of 2 */ +#else + alr_csIDLE_Trace_read_index%= ALR_TRC_SIZE; /* if not power of 2 */ +#endif /* POWER_OF_2 */ + read_index = alr_csIDLE_Trace_read_index; + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); + + sprintf (buffer, "[%03d]:%05d %d %s %s ", +#if defined(POWER_OF_2) + (write_index - read_index) & (ALR_TRC_SIZE-1), /* if ALR_TRC_SIZE power of 2 */ +#else + (ALR_TRC_SIZE + write_index - read_index) % ALR_TRC_SIZE, /* if ALR_TRC_SIZE not power of 2 */ +#endif /* POWER_OF_2 */ + trace_data.sysclock, + trace_data.state, + ALR_TRC_EVENTS[trace_data.event], + ALR_TRC_CHANNEL[trace_data.actual_channel]); + o = strlen (buffer); + + switch (trace_data.event) + { + case ALR_TRC_STRING: + strncpy (buffer+o, (char*)&trace_data.data[0], ALR_TRC_DATA_SIZE); + buffer[o+ALR_TRC_DATA_SIZE] = 0; + break; + case ALR_TRC_DOWNLINK: + case ALR_TRC_UPLINK: + for (j=0;j<23;j++, o+=2) + { + sprintf (buffer+o, "%02x", trace_data.data[j]); + } + break; + default: + for (j=0;j<ALR_TRC_DATA_SIZE;j++, o+=2) + { + sprintf (buffer+o, "%02x", trace_data.data[j]); + } + break; + } + + if (buffer[0]) + { + vsi_o_ttrace(VSI_CALLER TC_EVENT, buffer); + } + else + { + vsi_o_ttrace(VSI_CALLER TC_EVENT, "alr_trc_read() failed"); + } + + ENTER_CRITICAL_SECTION (sem_ALR_TRC); + write_index = (UCHAR)alr_csIDLE_Trace_index; + LEAVE_CRITICAL_SECTION (sem_ALR_TRC); + + if (++readed >= count) + break; + }/* endwhile */ + +}//endfunc alr_trc_read */ + +#else /* ALR_TRACE_ENABLED */ +#endif /* ALR_TRACE_ENABLED */ +#endif /* ALR_TRC_C */