FreeCalypso > hg > freecalypso-citrine
diff gpf/frame/vsi_tim.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/gpf/frame/vsi_tim.c Thu Jun 09 00:02:41 2016 +0000 @@ -0,0 +1,486 @@ +/* ++------------------------------------------------------------------------------ +| File: vsi_tim.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 : This Module defines the virtual system interface part +| for the timer handling. ++----------------------------------------------------------------------------- +*/ + +#ifndef __VSI_TIM_C__ +#define __VSI_TIM_C__ +#endif + +/*==== INCLUDES ===================================================*/ + +#include <string.h> + +#include "gpfconf.h" +#include "typedefs.h" + +#include "vsi.h" +#include "os.h" +#include "tools.h" +#include "frm_defs.h" +#include "frm_types.h" +#include "frm_glob.h" +#include "frame.h" + +/*==== TYPES ======================================================*/ + +typedef struct _T_TIMER_CONFIG_ENTRY +{ + T_HANDLE entity; + T_TIME value; + USHORT index; + USHORT mode; + struct _T_TIMER_CONFIG_ENTRY *next; +} T_TIMER_CONFIG_ENTRY; + +/*==== CONSTANTS ==================================================*/ + +LOCAL const T_STR_IND StrInd[] = +{ + "TIMER_SET", TIMER_SET, + "TIMER_RESET", TIMER_RESET, + "TIMER_SPEED_UP", TIMER_SPEED_UP, + "TIMER_SLOW_DOWN", TIMER_SLOW_DOWN, + "TIMER_SUPPRESS", TIMER_SUPPRESS, + "TIMER_CLEAN", TIMER_CLEAN, + NULL, 0 +}; + +/*==== EXTERNALS ==================================================*/ +/* -------------- S H A R E D - BEGIN ---------------- */ +#ifdef _TOOLS_ +#pragma data_seg("FRAME_SHARED") +#endif + +extern OS_HANDLE ext_data_pool_handle; +extern T_HANDLE TimerHandleField[]; + +/*==== VARIABLES ==================================================*/ + +#ifndef RUN_INT_RAM +char timer_configured; +T_TIMER_CONFIG_ENTRY *t_config; +#else +extern char timer_configured; +extern T_TIMER_CONFIG_ENTRY *t_config; +#endif + +#ifdef _TOOLS_ +#pragma data_seg() +#endif +/* -------------- S H A R E D - END ---------------- */ + +/*==== FUNCTIONS ==================================================*/ + +int GetTimerStartValue ( T_HANDLE Caller, USHORT TimerIndex, T_TIME OrgValue, T_TIME *NewValue ); + +#ifndef RUN_FLASH +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : GetTimerStartValue | ++--------------------------------------------------------------------+ + + PURPOSE : get start time modified by dynamic configuration + +*/ + +int GetTimerStartValue ( T_HANDLE caller, USHORT index, T_TIME org_value, T_TIME *new_value ) +{ +T_TIMER_CONFIG_ENTRY *t_config_entry; +int found; + + if ( t_config != NULL ) + { + found = FALSE; + t_config_entry = t_config; + while ( found == FALSE && t_config_entry != NULL ) + { + if ( t_config_entry->entity == caller + && t_config_entry->index == index ) + { + found = TRUE; + switch (t_config_entry->mode) + { + case TIMER_SET: + *new_value = t_config_entry->value; + break; + + case TIMER_RESET: + *new_value = org_value; + break; + + case TIMER_SPEED_UP: + *new_value = org_value / t_config_entry->value; + break; + + case TIMER_SLOW_DOWN: + *new_value = org_value * t_config_entry->value; + break; + + default: + return VSI_ERROR; + } + vsi_o_ttrace ( caller, TC_TIMER, "Timerstart: Index %d, Time %d -> %d",index, org_value, *new_value ); + } + t_config_entry = t_config_entry->next; + } + if ( found == FALSE ) + { + *new_value = org_value; + } + } + else + { + *new_value = org_value; + } + if (*new_value == 0) + { + *new_value = 1; + } + return VSI_OK; +} +#endif + +#ifndef RUN_FLASH +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : vsi_t_start | ++--------------------------------------------------------------------+ + + PURPOSE : start timer that expires only once + +*/ + +int vsi_t_start (T_HANDLE Caller, USHORT TimerIndex, T_TIME Value) +{ +OS_HANDLE TimerHandle; + + vsi_o_ttrace ( Caller, TC_TIMER, "Timerstart: Index %d, Time %d",TimerIndex, Value) ; + + if ( TimerIndex >= pf_TaskTable[Caller].NumOfTimers ) + vsi_o_assert( NO_TASK, OS_SYST_ERR_TASK_TIMER, __FILE__, __LINE__, + "TimerIndex > NumOfTimers for entity %s", pf_TaskTable[Caller].Name ); + + TimerHandle = (*(pf_TaskTable[Caller].FirstTimerEntry + TimerIndex) & TIMER_HANDLE_MASK); + + if ( !TimerHandle ) + { + if ( os_CreateTimer ( Caller, pf_Timeout, &TimerHandle, pf_TaskTable[Caller].MemPoolHandle ) == OS_ERROR ) + vsi_o_assert( Caller, OS_SYST_ERR_SIMUL_TIMER, __FILE__, __LINE__, + "Number of started timers > MAX_SIMULTANEOUS_TIMER" ); + } + if ( timer_configured && GetTimerStartValue ( Caller, TimerIndex, Value, &Value ) == VSI_ERROR ) + return VSI_ERROR; + + *(pf_TaskTable[Caller].FirstTimerEntry + TimerIndex) = TimerHandle; + + if ( os_StartTimer ( Caller, TimerHandle, TimerIndex, Value, 0 ) == OS_ERROR ) + return VSI_ERROR; + + return VSI_OK; +} +#endif + +#ifndef RUN_INT_RAM +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : vsi_t_pstart | ++--------------------------------------------------------------------+ + + PURPOSE : start periodic timer + +*/ + +int vsi_t_pstart (T_HANDLE Caller, USHORT TimerIndex, T_TIME Value1, T_TIME Value2 ) +{ +OS_HANDLE TimerHandle; + + vsi_o_ttrace ( Caller, TC_TIMER, "Timerstart: Index %d, ITime %d PTime %d",TimerIndex, Value1, Value2) ; + + if ( TimerIndex >= pf_TaskTable[Caller].NumOfTimers ) + vsi_o_assert( NO_TASK, OS_SYST_ERR_TASK_TIMER, __FILE__, __LINE__, + "TimerIndex > NumOfTimers for entity %s", pf_TaskTable[Caller].Name ); + + TimerHandle = (*(pf_TaskTable[Caller].FirstTimerEntry + TimerIndex) & TIMER_HANDLE_MASK); + + if ( !TimerHandle ) + { + if ( os_CreateTimer ( Caller, pf_Timeout, &TimerHandle, pf_TaskTable[Caller].MemPoolHandle ) == OS_ERROR ) + vsi_o_assert( Caller, OS_SYST_ERR_SIMUL_TIMER, __FILE__, __LINE__, + "Number of started timers > MAX_SIMULTANEOUS_TIMER" ); + } + + if ( timer_configured && GetTimerStartValue ( Caller, TimerIndex, Value1, &Value1 ) == VSI_ERROR ) + return VSI_ERROR; + + if ( timer_configured && GetTimerStartValue ( Caller, TimerIndex, Value2, &Value2 ) == VSI_ERROR ) + return VSI_ERROR; + + *(pf_TaskTable[Caller].FirstTimerEntry + TimerIndex) = TimerHandle | PERIODIC_TIMER; + + if ( os_StartTimer ( Caller, TimerHandle, TimerIndex, Value1, Value2 ) == OS_ERROR ) + return VSI_ERROR; + + return VSI_OK; +} +#endif + +#ifndef RUN_FLASH +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : vsi_t_stop | ++--------------------------------------------------------------------+ + + PURPOSE : stop timer + +*/ + +int vsi_t_stop (T_HANDLE Caller, USHORT TimerIndex ) +{ +OS_HANDLE TimerHandle; + + vsi_o_ttrace ( Caller, TC_TIMER, "Timerstop: Index %d",TimerIndex) ; + TimerHandle = (*(pf_TaskTable[Caller].FirstTimerEntry + TimerIndex) & TIMER_HANDLE_MASK); + if ( TimerHandle && ( (TimerHandle & TIMER_HANDLE_MASK) < MaxTimer ) ) + { +/* + if ( os_StopTimer ( Caller, TimerHandle ) == OS_ERROR ) + return VSI_ERROR; + + if ( os_DestroyTimer ( Caller, TimerHandle ) == OS_ERROR ) + return VSI_ERROR; +*/ + os_StopTimer ( Caller, TimerHandle ); + os_DestroyTimer ( Caller, TimerHandle ); + + *(pf_TaskTable[Caller].FirstTimerEntry + TimerIndex) = 0; + return VSI_OK; + } + return VSI_ERROR; + +} +#endif + +#ifndef RUN_INT_RAM +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : vsi_t_status | ++--------------------------------------------------------------------+ + + PURPOSE : request remaining time + +*/ + +int vsi_t_status (T_HANDLE Caller, USHORT Index, T_TIME *Value ) +{ +OS_HANDLE TimerHandle; + + if ( (TimerHandle = (*(pf_TaskTable[Caller].FirstTimerEntry + Index) & TIMER_HANDLE_MASK) ) < MaxTimer ) + { + if ( TimerHandle == 0 || (*(pf_TaskTable[Caller].FirstTimerEntry + Index) & TIMEOUT_OCCURRED) ) + { + *Value = 0; + vsi_o_ttrace ( Caller, TC_TIMER, "Timerstatus: Index %d, Remaining_time %d",Index, *Value) ; + return VSI_OK; + } + /* + In case the timer interrupt occurrs just after the check 5 lines above, this will be handled by + os_QueryTimer() returning a Value of 0 because thew expired timer can no longer be found in the list. + */ + if ( os_QueryTimer ( Caller, TimerHandle, Value ) == OS_ERROR ) + { + *Value = 0; + return VSI_ERROR; + } + vsi_o_ttrace ( Caller, TC_TIMER, "Timerstatus: Index %d, Remaining time %d",Index, *Value) ; + return VSI_OK; + } + vsi_o_ttrace ( Caller, TC_TIMER, "TimerHandle out of range: Index %d, TimerHandle %d",Index, TimerHandle ) ; + return VSI_ERROR; + +} +#endif + +#ifndef RUN_INT_RAM +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : vsi_t_config | ++--------------------------------------------------------------------+ + + PURPOSE : timer configuration + +*/ +int vsi_t_config (T_HANDLE caller, USHORT index, UBYTE mode, ULONG value ) +{ +T_TIMER_CONFIG_ENTRY *t_config_entry = NULL; +T_TIMER_CONFIG_ENTRY *t_next_entry; +T_TIMER_CONFIG_ENTRY *t_new_entry = NULL; +int found = FALSE; + + if ( index < pf_TaskTable[caller].NumOfTimers ) + { + if ( t_config != NULL ) + { + t_next_entry = t_config; + do + { + t_config_entry = t_next_entry; + if ( t_config_entry->entity == caller + && t_config_entry->index == index ) + { + found = TRUE; + break; + } + t_next_entry = t_config_entry->next; + } while ( t_next_entry != NULL ); + } + + if ( found == FALSE ) + { + if ( os_AllocateMemory ( caller, (T_VOID_STRUCT**)&t_new_entry, sizeof(T_TIMER_CONFIG_ENTRY), OS_NO_SUSPEND, ext_data_pool_handle ) == OS_TIMEOUT ) + return VSI_ERROR; + t_new_entry->next = NULL; + } + + if ( t_config == NULL ) + { + t_config = t_new_entry; + t_config_entry = t_new_entry; + } + else + { + if ( found == FALSE && t_config_entry != NULL ) + { + t_config_entry->next = t_new_entry; + t_config_entry = t_new_entry; + } + } + + if ( t_config_entry != NULL ) + { + t_config_entry->entity = caller; + t_config_entry->index = index; + t_config_entry->mode = mode; + t_config_entry->value = value; + timer_configured = TRUE; + return VSI_OK; + } + } + return VSI_ERROR; +} +#endif + +#ifndef RUN_INT_RAM +/* ++------------------------------------------------------------------------------ +| Function : _vsi_t_config ++------------------------------------------------------------------------------ +| Description : Parse a timer configuration string into the components +| timer index, timer mode, timer value. +| +| Parameters : Caller - calling task +| *CfgString - configuration string +| *pTable - pointer to configuration string table +| +| Return : VSI_OK +| VSI_ERROR ++------------------------------------------------------------------------------ +*/ +int _vsi_t_config ( T_HANDLE Caller, char *CfgString, const T_STR_IND *pTable ) +{ +T_TIMER_CONFIG_ENTRY *t_config_entry; +T_TIMER_CONFIG_ENTRY *t_next; +char token[20]; +unsigned int offset = 0,len; +USHORT Index; +BYTE Mode; +int i = 0; +unsigned int Value; + + if ( pTable != NULL ) + { + len = GetNextToken (CfgString, token, " #"); + offset = offset + len +1; + while ( StrInd[i].Str && strcmp ( token, StrInd[i].Str ) ) + { i++; } + if ( StrInd[i].Str == NULL ) + return VSI_ERROR; + + if ( (Mode = (BYTE)StrInd[i].Ind) == TIMER_CLEAN ) + { + t_config_entry = t_config; + while ( t_config_entry != NULL ) + { + t_next = t_config_entry->next; + os_DeallocateMemory ( Caller, (T_VOID_STRUCT*)t_config_entry ); + t_config_entry = t_next; + } + t_config = NULL; + return VSI_OK; + } + len = GetNextToken (CfgString+offset, token, " #"); + offset = offset + len +1; + while ( pTable->Str && strcmp ( token, pTable->Str ) ) + { pTable++; } + if ( pTable->Str == NULL ) + { + vsi_o_ttrace ( 0, TC_SYSTEM, "Timer not found!") ; + return VSI_OK; /* VSI_OK is returned to avoid creating a new return code */ + } + Index = pTable->Ind; + len = GetNextToken (CfgString+offset, token, " #"); + Value = ASCIIToHex (token, CHARS_FOR_32BIT); + + return ( vsi_t_config ( Caller, Index, Mode, Value ) ); + } + return VSI_ERROR; + +} +#endif + +#ifndef RUN_INT_RAM +/* ++---------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : VSI_TIM | +| STATE : code ROUTINE : InitializeTimerConfig| ++---------------------------------------------------------------------+ + + PURPOSE : initialize timer configuration + +*/ + +void InitializeTimer ( void ) +{ +int i; + + for ( i = 0; i <= MaxTimer; i++) + { + TimerHandleField[i] = 0; + } + timer_configured = FALSE; + t_config = NULL; +} +#endif + +