FreeCalypso > hg > fc-tourmaline
diff src/cs/layer1/cfile/l1_mfmgr.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cs/layer1/cfile/l1_mfmgr.c Fri Oct 16 06:23:26 2020 +0000 @@ -0,0 +1,298 @@ + +/************* Revision Controle System Header ************* + * GSM Layer 1 software + * L1_MFMGR.C + * + * Filename l1_mfmgr.c + * Copyright 2003 (C) Texas Instruments + * + ************* Revision Controle System Header *************/ + +#define L1_MFMGR_C + +#include "l1_macro.h" +#include "l1_confg.h" + +#if (CODE_VERSION == SIMULATION) + #include <string.h> + #include "l1_types.h" + #include "sys_types.h" + #include "l1_const.h" + #if TESTMODE + #include "l1tm_defty.h" + #endif + #if (AUDIO_TASK == 1) + #include "l1audio_const.h" + #include "l1audio_cust.h" + #include "l1audio_defty.h" + #endif + #if (L1_GTT == 1) + #include "l1gtt_const.h" + #include "l1gtt_defty.h" + #endif + #if (L1_MP3 == 1) + #include "l1mp3_defty.h" + #endif + #if (L1_MIDI == 1) + #include "l1midi_defty.h" + #endif + #if (L1_AAC == 1) + #include "l1aac_defty.h" + #endif + #include "l1_defty.h" + #include "cust_os.h" + #include "l1_msgty.h" + #include "l1_varex.h" + #include "l1_proto.h" +#else + #include <string.h> + #include "l1_types.h" + #include "sys_types.h" + #include "l1_const.h" + + #if TESTMODE + #include "l1tm_defty.h" + #endif + #if (AUDIO_TASK == 1) + #include "l1audio_const.h" + #include "l1audio_cust.h" + #include "l1audio_defty.h" + #endif + #if (L1_GTT == 1) + #include "l1gtt_const.h" + #include "l1gtt_defty.h" + #endif + #if (L1_MP3 == 1) + #include "l1mp3_defty.h" + #endif + #if (L1_MIDI == 1) + #include "l1midi_defty.h" + #endif + #if (L1_AAC == 1) + #include "l1aac_defty.h" + #endif + #include "l1_defty.h" + #include "cust_os.h" + #include "l1_msgty.h" + #include "l1_varex.h" + #include "l1_proto.h" +#endif +#include "l1_tabs.h" + +/*-------------------------------------------------------*/ +/* l1s_clear_mftab() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1s_clear_mftab(T_FRM *frmlst) +{ + WORD32 j,k; + + #if (TRACE_TYPE==5) + trace_mft("l1s_clear_mftab()", -1); + #endif + + // Clear MFTAB. + for (j=0; j<MFTAB_SIZE; j++) + { + for (k=0; k<L1_MAX_FCT; k++) + { + frmlst[j].fct[k].fct_ptr = NULL; // Enough to clear the MFTAB. + } + } +} + +/*-------------------------------------------------------*/ +/* l1s_load_mftab() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1s_load_mftab(const T_FCT *fct, const UWORD8 size, UWORD8 frame, T_FRM *frmlst) +{ + UWORD8 i; + UWORD8 frame_count; + T_FRM *current_frm; + + #if (TRACE_TYPE==5) + trace_mft("l1s_load_mftab()", frame); + #endif + + if(fct != NULL) + // there is a Rom block available. + { + frame_count = 0; + + do + { + i=0; + current_frm = &(frmlst[frame]); + + while (fct->fct_ptr != NULL) + { + // ROM block is downloaded to RAM, it is added to current block contents in MFTAB. + // we have to look for a free place in the OPTIONAL struct. for current frame. + while (current_frm->fct[i].fct_ptr != NULL) i++; + + current_frm->fct[i] = *fct++; + i++; + } + + // increment "fct" to skip the NULL function... + fct++; + + // increment frame counter... + frame_count++; + + // increment frame counter with round up... + if(++frame >= MFTAB_SIZE) frame = 0; + } + while (frame_count < size); + // end of permanent table when all frame read from ROM block. + } +} + +/*-------------------------------------------------------*/ +/* l1s_exec_mftab() */ +/*-------------------------------------------------------*/ +/* Parameters : */ +/* Return : */ +/* Functionality : */ +/*-------------------------------------------------------*/ +void l1s_exec_mftab() +{ + UWORD8 i=0; + T_FCT *current_fct; + + // Point to the first function for current frame. + current_fct = &(l1s.mftab.frmlst[l1s.afrm].fct[0]); + + do + /********************************************/ + /*** look at all fcts until L1_MAX_FCT ***/ + /********************************************/ + { + if (current_fct->fct_ptr != NULL) + /****************************************************/ + /* Check function is not NULL */ + /* -> execute functions and reset fct field */ + /****************************************************/ + { + UWORD8 param1 = current_fct->param1; + UWORD8 param2 = current_fct->param2; + + (*current_fct->fct_ptr)(param1,param2); // execute fction. + current_fct->fct_ptr = NULL; // clear executed fction. + current_fct->param1 = NO_PAR; // clear complexe function parameter. + current_fct->param2 = NO_PAR; // clear complexe function parameter. + } + + // Increment "i" and function pointer. + current_fct++; // point to next fction. + i++; // increment fction counter. + + } // end do. + while (i < L1_MAX_FCT); +} + +#if (FF_L1_FAST_DECODING == 1 ) +/*------------------------------------------------------- + l1s_clean_mftab() +------------------------------------------------------- + Parameters :-current task in MFTAB + -current_tsk_frm : frame of current task + from which functions should be erase + Return : + Functionality : Clean a task being execute +first step of function is to look for the frame +from which we want to erase functions of the task. +Second step is to identify function to clean up : we +want clean up only functions of current task starting +from current_tsk_frm.Hence, a test is done to identify +function from TASK_ROM_MFTAB inside MFTAB by checking + fct pointer amd the two parameters param1 and param2. +If test is true (i.e parameters and function pointer + are used for the current task executuion ) , a clean +is done by setfct pointer to NULL +in order to erase this function of MFTAB .The clean up +is applied until the last frame used by current task +(number of frames used by a task is defined by size +variable). +When clean up is done , reset active frame if current +frame is the last frame of MFTAB. +This function allow to pipeline fast signaling blocks +with non fast signaling blocks without lose blocks. +-------------------------------------------------------*/ +void l1s_clean_mftab(UWORD8 task, UWORD8 current_tsk_frm) +{ + T_FRM *p_current_frm; + const T_FCT *fct; + UWORD8 size; + UWORD8 frame; + UWORD8 i = 1;/*i refers to l1_mftab.h where we have frame 1,frame2,frame3... so i starts to 1*/ + UWORD8 j; + UWORD8 k; + +#if (TRACE_TYPE==5) + trace_mft("l1s_clean_mftab()", -1); +#endif + + fct = TASK_ROM_MFTAB[task].address; + size = TASK_ROM_MFTAB[task].size; + frame = l1s.afrm; + + /* Get the good frame in function block */ + while(i < current_tsk_frm) + { + while(fct->fct_ptr != NULL) + { + fct++;/* Skip non-nulll functions */ + } + fct++;/*Skip null function */ + i++; + } + + /* Search in MFTAB all functions relative to the block we want to erase*/ + while(i <= size) + { + p_current_frm = &(l1s.mftab.frmlst[frame]); + + while(fct->fct_ptr != NULL) + { + for(j = 0; j < L1_MAX_FCT; j++) + { + if(((p_current_frm->fct[j].param1 == task) && (p_current_frm->fct[j].param2 == fct->param2)) + && ( p_current_frm->fct[j].fct_ptr == fct->fct_ptr)) + { + p_current_frm->fct[j].fct_ptr = NULL; + + /*l1s_load_mftab function inserts a block just by looking if the function pointer is null : to avoid this issue, a remove dowwn */ + /*of all functions pointers of the frme is done so there is no hole and hence no possible block insertion*/ + if(frame != l1s.afrm) /* condition for shifting*/ + { + for( k = j; k < L1_MAX_FCT - 1; k ++) + { + p_current_frm->fct[k] = p_current_frm->fct[k + 1];/* alls pointers are going up of one position in the frame*/ + } + p_current_frm->fct[L1_MAX_FCT-1].fct_ptr = NULL; /*last pointer is setting to NULL to avoid to remove the last function fct[L1_MAX_FCT] */ + } + j = L1_MAX_FCT;/* Function found, exit to save time */ + } + } + fct++; + } + fct++; + i++; + if(++ frame >= MFTAB_SIZE) + { + frame = 0; + } + } +} +#endif /* if (FF_L1_FAST_DECODING == 1) */ + + +