FreeCalypso > hg > freecalypso-sw
view gsm-fw/comlib/cl_shrd.c @ 867:c4da570dca83
int_osx_receive_prim() in gsm-fw/gpf/osx/osx.c: there was an error in the
reconstruction of this function from disassembly in the logic that implements
special handling for MPHC_RXLEV_REQ messages.
The code is now fixed to properly match what the binary object version does;
with this fix the firmware now performs the power measurement phase correctly
and the initial network registration succeeds.
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Sat, 16 May 2015 06:34:09 +0000 |
parents | f8175b92d0f7 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : COMLIB | Modul : cl_shrd.c +----------------------------------------------------------------------------- | 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 : Definitions of common library functions: Implementation of creation of Semaphores and usage of it by any entity in PS +----------------------------------------------------------------------------- */ /* * Version 1.0 */ /**********************************************************************************/ /* NOTE: */ /**********************************************************************************/ #ifndef CL_SHRD_C #define CL_SHRD_C /*==== INCLUDES ===================================================*/ #include "config.h" #include "fixedconf.h" #include <string.h> #include <stdio.h> #include "typedefs.h" #include "vsi.h" #include "cl_shrd.h" /*==== VARIABLES ==================================================*/ static T_HANDLE cl_handle; #ifdef OPTION_MULTITHREAD #define VSI_CALLER cl_handle, #else #define VSI_CALLER #endif /* Pointer is used for faster memory access */ static T_SHRD_DATA shrd_data_base; T_SHRD_DATA *shared_data = &shrd_data_base; static T_HANDLE sem_SHARED = VSI_ERROR; static BOOL is_initialized = FALSE; /*==== FUNCTIONS ==================================================*/ /* +--------------------------------------------------------------------------------- | Function : cl_shrd_init +--------------------------------------------------------------------------------- | Description : Opens counting semaphore specified by its name. | If semaphore doesnot exists, creates semaphore with count given. | | Parameters : T_HANDLE | | Return : void | +--------------------------------------------------------------------------------- */ GLOBAL void cl_shrd_init (T_HANDLE handle) { TRACE_FUNCTION ("cl_shrd_init()"); if(is_initialized NEQ TRUE) { cl_handle = handle; memset(shared_data, 0, sizeof(T_SHRD_DATA)); sem_SHARED = vsi_s_open (VSI_CALLER "SHARED_SEM",1); if (sem_SHARED NEQ VSI_ERROR) { TRACE_EVENT ("Semaphore opened successfully \"SHARED_SEM\""); is_initialized = TRUE; #ifdef TI_PS_FF_AT_P_CMD_CTREG /* * Initialize the Two tables with the default values */ memcpy(shared_data->no_serv_mod_time,&no_service_mode_time, sizeof(no_service_mode_time)); memcpy(shared_data->lim_serv_mod_time,&lim_service_mode_time, sizeof(lim_service_mode_time)); #endif /* TI_PS_FF_AT_P_CMD_CTREG */ } else TRACE_EVENT ("Cant open semaphore \"SHARED_SEM\""); } } /* +------------------------------------------------------------------------------ | Function : cl_shrd_exit +------------------------------------------------------------------------------ | Description : Close the semaphore. | | Parameters : void | | Return : void | +------------------------------------------------------------------------------ */ GLOBAL void cl_shrd_exit (void) { TRACE_FUNCTION ("cl_shrd_exit()"); if(is_initialized EQ TRUE) { if (sem_SHARED NEQ VSI_ERROR) vsi_s_close (VSI_CALLER sem_SHARED); memset(shared_data, 0, sizeof(T_SHRD_DATA)); is_initialized = FALSE; } } /* +------------------------------------------------------------------------------ | Function : cl_shrd_get_loc +------------------------------------------------------------------------------ | Description : Copies the content from global T_LOC_INFO to the | passed parameter | | Parameters : <loc_info>: Location information | | Return : void | +------------------------------------------------------------------------------ */ GLOBAL BOOL cl_shrd_get_loc (T_LOC_INFO *loc_info) { BOOL ret = FALSE; TRACE_FUNCTION ("cl_shrd_get_loc()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { if ( loc_info NEQ NULL ) memcpy(loc_info, &shared_data->location_info, sizeof(T_LOC_INFO)); vsi_s_release (VSI_CALLER sem_SHARED); ret = TRUE; } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); return(ret); } } return(ret); } /* +------------------------------------------------------------------------------ | Function : cl_shrd_set_loc +------------------------------------------------------------------------------ | Description : Copies the content from passed parameter to the | global structure | | Parameters : <loc_info>: Location information | | Return : void | +------------------------------------------------------------------------------ */ GLOBAL void cl_shrd_set_loc (T_LOC_INFO *loc_info) { TRACE_FUNCTION ("cl_shrd_set_loc()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { if ( loc_info NEQ NULL ) memcpy(&shared_data->location_info, loc_info, sizeof(T_LOC_INFO)); vsi_s_release (VSI_CALLER sem_SHARED); } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); } } } /* +------------------------------------------------------------------------------ | Function : cl_shrd_get_tim_adv +------------------------------------------------------------------------------ | Description : Copies the content from global T_TIM_ADV to the | passed parameter | | Parameters : <tim_adv>: Timing Advance and ME status. | | Return : void | +------------------------------------------------------------------------------ */ GLOBAL BOOL cl_shrd_get_tim_adv (T_TIM_ADV *tim_adv) { BOOL ret = FALSE; TRACE_FUNCTION ("cl_shrd_get_tim_adv()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { if ( tim_adv NEQ NULL ) memcpy(tim_adv, &shared_data->timing_advance, sizeof(T_TIM_ADV)); vsi_s_release (VSI_CALLER sem_SHARED); ret = TRUE; } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); return(ret); } } return(ret); } /* +------------------------------------------------------------------------------ | Function : cl_shrd_set_tim_adv +------------------------------------------------------------------------------ | Description : Copies the content from passed parameter to the | global structure | | Parameters : <tim_adv>: Timing Advance and ME status. | | Return : void | +------------------------------------------------------------------------------ */ GLOBAL void cl_shrd_set_tim_adv (T_TIM_ADV *tim_adv) { TRACE_FUNCTION ("cl_shrd_set_tim_adv()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { if ( tim_adv NEQ NULL ) memcpy(&shared_data->timing_advance, tim_adv, sizeof(T_TIM_ADV)); vsi_s_release (VSI_CALLER sem_SHARED); } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); } } } #ifdef TI_PS_FF_AT_P_CMD_CTREG /* +------------------------------------------------------------------------------ | Function : cl_shrd_set_treg_val +------------------------------------------------------------------------------ | Description : Copies the content from passed parameter to the | global structure Used for %CTREG setting the values. | | Parameters : <mode> : Selects the mode of operation read or write | <tab_id> : Selects either no_service_mode_time or | lim_service_mode_time for updating. | <tab_val>: Table values to be updated in the selcted table. | | Return : BOOL | +------------------------------------------------------------------------------ */ GLOBAL BOOL cl_shrd_set_treg_val ( T_TREG *treg ) { UBYTE i; BOOL ret = FALSE; TRACE_FUNCTION ("cl_shrd_set_treg_val()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { if ( treg NEQ NULL ) { switch(treg->tab_id) { case NOSERVICE_MODE_TIME: memcpy(shared_data->no_serv_mod_time, treg->tab_val, MAX_CTREG_TAB_LEN); break; case LIMSERVICE_MODE_TIME: memcpy(shared_data->lim_serv_mod_time, treg->tab_val, MAX_CTREG_TAB_LEN); break; default: break; } ret = TRUE; } vsi_s_release (VSI_CALLER sem_SHARED); } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); } } return(ret); } /* +------------------------------------------------------------------------------ | Function : cl_shrd_get_treg_val +------------------------------------------------------------------------------ | Description : Reads the content from passed parameter to the | global structure. | | Parameters : <mode> : Selects the mode of operation read or write | <tab_id> : Selects either no_service_mode_time or | lim_service_mode_time for updating. | <tab_val>: Table values to be read from the selected table. | | Return : BOOL | +------------------------------------------------------------------------------ */ GLOBAL BOOL cl_shrd_get_treg_val ( T_TREG *treg ) { UBYTE i; BOOL ret = FALSE; TRACE_FUNCTION ("cl_shrd_get_treg_val()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { if ( treg NEQ NULL ) { switch(treg->tab_id) { case NOSERVICE_MODE_TIME: memcpy(treg->tab_val, shared_data->no_serv_mod_time, MAX_CTREG_TAB_LEN); break; case LIMSERVICE_MODE_TIME: memcpy(treg->tab_val, shared_data->lim_serv_mod_time, MAX_CTREG_TAB_LEN); break; default: break; } ret = TRUE; } vsi_s_release (VSI_CALLER sem_SHARED); } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); } } return(ret); } /* +------------------------------------------------------------------------------ | Function : cl_shrd_get_treg +------------------------------------------------------------------------------ | Description : Reads the TREG Timer value from the selected Table and | returns the data to called Entity (RR) | | Parameters : <tab_id> : Selects either no_service_mode_time or | lim_service_mode_time for getting TREG value. | <offset> : Offset value to point at exact position in the | selected Table for getting TREG value. | <tab_val>: Table value in the selcted table. | | Return : BOOL | +------------------------------------------------------------------------------ */ GLOBAL BOOL cl_shrd_get_treg (UBYTE tab_id, UBYTE offset, UBYTE *tab_val) { BOOL ret = FALSE; TRACE_FUNCTION ("cl_shrd_get_treg()"); if (sem_SHARED NEQ VSI_ERROR) { if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK) { /* Check for the proper value of offset, it should be between 0 to 24 */ if(offset > (MAX_CTREG_TAB_LEN - 1)) { return(ret); } switch(tab_id) { case NOSERVICE_MODE_TIME: *tab_val = shared_data->no_serv_mod_time[offset]; break; case LIMSERVICE_MODE_TIME: *tab_val = shared_data->lim_serv_mod_time[offset]; break; default: break; } ret = TRUE; vsi_s_release (VSI_CALLER sem_SHARED); } else { TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\""); } } return(ret); } #endif /* TI_PS_FF_AT_P_CMD_CTREG */ #endif /* CL_SHRD_C */