# HG changeset patch # User Michael Spacefalcon # Date 1409333146 0 # Node ID 9e605ec89ed0048ad1f989ea972dd466fa377fe6 # Parent 700d450bb8da711936d1bca38e9789027957d259 gsm-fw/L1/stand: starting work on our version of standalone L1 diff -r 700d450bb8da -r 9e605ec89ed0 gsm-fw/L1/stand/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/L1/stand/README Fri Aug 29 17:25:46 2014 +0000 @@ -0,0 +1,33 @@ +In their internal development environment, TI had a way to build L1 standalone, +i.e., omitting the G23 protocol stack and other large and complex pieces of the +full firmware. Such an ability is essential for sane development, and the +abundant references to OP_L1_STANDALONE throughout the codebase confirm that TI +had it indeed. + +However, we (FreeCalypso) don't have a way to build an OP_L1_STANDALONE image +exactly the way TI did it - we don't have all of the necessary source - the +glue pieces specific to this configuration are missing. Nor do we necessarily +need to imitate what TI did in this department: it appears that TI's standalone +L1 build omitted GPF (with the exception of OS and OSX) and everything that +lives in Riviera land, but for us the situation is different: we already have +a successful build with Riviera and GPF, but no L1, thus we simply need to add +L1 to what we have. Our idea of standalone L1 simply means building without +the G23 stack, which we have yet to begin integrating. + +In the standard firmware build, there is a component called L1 PEI. It is part +of the G23 stack, and has header and library dependencies of the latter - thus +it is *not* part of the L1 code proper. However, it performs some essential +initialization steps, and runs the L1A task. We don't know how TI handled +these functions in their standalone L1 build - we don't have that part of their +source, not even in the otherwise complete LoCosto version, not even if we were +targeting LoCosto hardware. + +Our solution: we are going to lift l1_pei out of LoCosto's g23m-gsm, and hack +up a special version of it that won't have the standard complement of G23 +header and library dependencies. It is virtually certain that TI did something +different, but our hack-solution should work for our needs. + +Because our standalone L1 build is a specially stripped-down version of the +regular fw build, and not at all like TI's standalone L1, we do NOT define +OP_L1_STANDALONE. Instead we have a different preprocessor symbol: +CONFIG_L1_STANDALONE. diff -r 700d450bb8da -r 9e605ec89ed0 gsm-fw/L1/stand/cus_l1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/L1/stand/cus_l1.h Fri Aug 29 17:25:46 2014 +0000 @@ -0,0 +1,55 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : CUS_L1 ++----------------------------------------------------------------------------- +| 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 : Custom dependent definitions for L1 of the +| mobile station ++----------------------------------------------------------------------------- +*/ + +#ifndef CUS_L1_H +#define CUS_L1_H + +/*==== CONSTANTS ==================================================*/ +/* + * VERSION + * + * Description : The constants define the type and the value + * of a version identification. The version + * is part of the monitor struct. + */ + +#define T_VERSION char +#define VERSION_L1 "L1 1.0" + +/* + * VSI_CALLER + * + * Description : For multithread applications the constant VSI_CALLER + * must be defined to identify the calling thread of the + * VSI-Interface. This must be done correponding to the + * type of T_VSI_CALLER in VSI.H. The comma symbol is + * neccessary because the vsi-functions are called + * like this vsi_xxx (VSI_CALLER par2, par3 ...) + */ + +#ifdef NEW_FRAME + #define VSI_CALLER L1_Handle, +#else + #define VSI_CALLER L1_NAME, +#endif + +#endif + diff -r 700d450bb8da -r 9e605ec89ed0 gsm-fw/L1/stand/dll-functions --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/L1/stand/dll-functions Fri Aug 29 17:25:46 2014 +0000 @@ -0,0 +1,9 @@ +L1S (l1_cmplx.c specifically) calls these 3 functions which are normally +defined in the DL protocol stack entity: + +dll_dcch_downlink() +dll_read_dcch() +dll_read_sacch() + +If we are building L1 standalone (without the G23 protocol stack), we need +to provide stubs for these functions. diff -r 700d450bb8da -r 9e605ec89ed0 gsm-fw/L1/stand/l1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/L1/stand/l1.h Fri Aug 29 17:25:46 2014 +0000 @@ -0,0 +1,137 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 for the Protocol Stack Entity l1. ++----------------------------------------------------------------------------- +*/ + +#ifndef L1_H +#define L1_H + +#ifdef TI_PS_HCOMM_CHANGE +#include "cl_hComm_handle.h" + +#ifdef NEW_FRAME + + + #define hCommGRR l1_hCommGRR + #define hCommLLC l1_hCommLLC + #define hCommSNDCP l1_hCommSNDCP + #define hCommGMM l1_hCommGMM + #define hCommTOM l1_hCommTOM + + #define L1_Handle l1_L1_Handle + +/*jk: delete warnings #define VSI_CALLER L1_Handle, */ + + #ifdef L1_PEI_C + + /* Communication handles */ + + #ifdef GPRS + T_HANDLE hCommGRR = VSI_ERROR; + T_HANDLE hCommLLC = VSI_ERROR; + T_HANDLE hCommSNDCP = VSI_ERROR; + T_HANDLE hCommGMM = VSI_ERROR; + T_HANDLE hCommTOM = VSI_ERROR; + #endif + T_HANDLE L1_Handle; + + #else /* L1_PEI_C */ + + extern T_HANDLE hCommGRR; + extern T_HANDLE hCommLLC; + extern T_HANDLE hCommSNDCP; + extern T_HANDLE hCommGMM; + extern T_HANDLE hCommTOM; + extern T_HANDLE L1_Handle; + + #endif /* L1_PEI_C */ + +#else /* NEW_FRAME */ + + #define PL_NAME "PL" + #define L1_NAME "L1" + + #define VSI_CALLER L1_NAME, + +#endif /* NEW_FRAME */ +#else +#ifdef NEW_FRAME + + #define hCommPL l1_hCommPL + #define hCommL1 l1_hCommL1 + #define hCommGRR l1_hCommGRR + #define hCommLLC l1_hCommLLC + #define hCommSNDCP l1_hCommSNDCP + #define hCommGMM l1_hCommGMM + #define hCommTOM l1_hCommTOM + #define hCommACI l1_hCommACI + #define L1_Handle l1_L1_Handle + +/*jk: delete warnings #define VSI_CALLER L1_Handle, */ + + #ifdef L1_PEI_C + + /* Communication handles */ + T_HANDLE hCommPL = VSI_ERROR; + T_HANDLE hCommACI = VSI_ERROR; + T_HANDLE hCommL1 = VSI_ERROR; + #ifdef GPRS + T_HANDLE hCommGRR = VSI_ERROR; + T_HANDLE hCommLLC = VSI_ERROR; + T_HANDLE hCommSNDCP = VSI_ERROR; + T_HANDLE hCommGMM = VSI_ERROR; + T_HANDLE hCommTOM = VSI_ERROR; + #endif + T_HANDLE L1_Handle; + + #else /* L1_PEI_C */ + + extern T_HANDLE hCommPL; + extern T_HANDLE hCommACI; + extern T_HANDLE hCommL1; + extern T_HANDLE hCommGRR; + extern T_HANDLE hCommLLC; + extern T_HANDLE hCommSNDCP; + extern T_HANDLE hCommGMM; + extern T_HANDLE hCommTOM; + extern T_HANDLE L1_Handle; + + #endif /* L1_PEI_C */ + +#else /* NEW_FRAME */ + + #define PL_NAME "PL" + #define L1_NAME "L1" + + #define VSI_CALLER L1_NAME, + + #ifdef L1_PEI_C + + T_VSI_CHANDLE hCommPL = VSI_ERROR; + T_VSI_CHANDLE hCommL1 = VSI_ERROR; + + #else /* L1_PEI_C */ + + extern T_VSI_CHANDLE hCommPL; + extern T_VSI_CHANDLE hCommL1; + + #endif /* L1_PEI_C */ + +#endif /* NEW_FRAME */ +#endif /* TI_PS_HCOMM_CHANGE */ +#endif /* L1_H */ diff -r 700d450bb8da -r 9e605ec89ed0 gsm-fw/L1/stand/l1_pei.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/L1/stand/l1_pei.c Fri Aug 29 17:25:46 2014 +0000 @@ -0,0 +1,488 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 implements the process body interface +| for the entity L1. ++----------------------------------------------------------------------------- +*/ + +#define L1_PEI_C + +#define ENTITY_L1 + +#define CUST_OS_C +/*==== INCLUDES =============================================================*/ + +#if 1 +#include +#if defined (NEW_FRAME) + #include "typedefs.h" /* to get Condat data types */ +#else + #include "stddefs.h" /* to get Condat data types */ +#endif +#include "vsi.h" /* to get a lot of macros */ +#include "custom.h" +#ifdef GPRS +#include "macdef.h" +#include "gprs.h" +#endif +#include "gsm.h" /* to get a lot of macros */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "pei.h" /* to get PEI interface */ +#include "tools.h" /* to get common tools */ +#include "l1.h" /* to get the global entity definitions */ +#include "cust_os.h" /* to get cust_os definitions */ + +#else /* 1 */ + +#if defined NEW_FRAME + +#include +#include +#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_l1.h" +#include "mon_l1.h" +#include "cus_l1.h" +#include "pei.h" +#include "tok.h" +#include "l1.h" + + +#else +#include +#include +#include "stddefs.h" +#include "pconst.cdg" +#include "mconst.cdg" +#include "message.h" +#include "ccdapi.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "cnf_l1.h" +#include "mon_l1.h" +#include "vsi.h" +#include "pei.h" +#include "tok.h" +#include "l1.h" + +#endif +#endif /* 1 */ + +/*==== CONSTS ================================================================*/ + +/*==== TYPES =================================================================*/ + +typedef struct +{ + char *version; +} T_MONITOR; + +/*==== LOCALS ================================================================*/ + +static T_MONITOR l1_mon; +static USHORT first_access = TRUE; + +/*==== PROTOTYPES ============================================================*/ + +SHORT pei_create (T_PEI_INFO **info); + +void l1_create_ISR (void); +void l1a_task(unsigned arcg, void *argv); + +/*==== PRIVATE FUNCTIONS =====================================================*/ + + +/* ++------------------------------------------------------------------------------ +| Function : pei_primitive ++------------------------------------------------------------------------------ +| Description : Process protocol specific primitive. +| +| Parameters : prim - pointer to the received primitive +| +| Return : PEI_OK - function succeeded +| PEI_ERROR - function failed ++------------------------------------------------------------------------------ + + | | + PL PPC(GPRS only) UPLINK + | | + +------v-----------v-------+ + | | + | L1 ASYNC | + | | + +-------------^------------+ + | + L1 SYNC DOWNLINK + | + +*/ +#if defined (NEW_FRAME) +LOCAL SHORT pei_primitive (void * ptr) +#else +EXPORT T_PEI_RETURN pei_primitive (T_PRIM * prim) +#endif +{ +#if defined (NEW_FRAME) + T_PRIM *prim = (T_PRIM*)ptr; +#endif + + USHORT opc = prim->custom.opc; + + /* + * primitive is not a GSM primitive - forward it to the environment + */ + if (opc & SYS_MASK) + vsi_c_primitive (VSI_CALLER prim); + else + { + PFREE (P2D(prim)); + return PEI_ERROR; + } + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_init ++------------------------------------------------------------------------------ +| Description : Initialize Protocol Stack Entity +| +| Parameters : handle - task handle +| +| Return : PEI_OK - entity initialised +| PEI_ERROR - entity not (yet) initialised ++------------------------------------------------------------------------------ +*/ +#if defined (NEW_FRAME) +LOCAL SHORT pei_init ( T_HANDLE Handle ) +#else +T_PEI_RETURN pei_init (void) +#endif +{ +#if defined (NEW_FRAME) + L1_Handle = Handle; +#endif + + + +#ifdef TI_PS_HCOMM_CHANGE +#ifdef NEW_FRAME + if ( first_access == TRUE ) + { + first_access = FALSE; + _osx_init(); + } +#endif + + if (!cl_hcom_all_handles_open()) return PEI_ERROR; + +#ifdef NEW_FRAME + _osx_open (VSI_CALLER L1_QUEUE, _hCommL1); +#endif + _osx_open (VSI_CALLER DL_QUEUE, _hCommPL); + _osx_open (VSI_CALLER RR_QUEUE, _hCommPL); + + _osx_open (VSI_CALLER GPF_ACI_QUEUE, _hCommMMI); +#else +#ifdef NEW_FRAME + if ( first_access == TRUE ) + { + first_access = FALSE; + _osx_init(); + } + /* + * Associate own "queue" handle (a task handle in the end) with L1_QUEUE, + * in order to be able to receive primitives. + */ + if (hCommL1 < VSI_OK) + { + if ((hCommL1 = vsi_c_open (VSI_CALLER L1_NAME)) < VSI_OK) + return PEI_ERROR; + _osx_open (VSI_CALLER L1_QUEUE, hCommL1); + } +#endif + + if (hCommPL < VSI_OK) + { + if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK) + return PEI_ERROR; + _osx_open (VSI_CALLER DL_QUEUE, hCommPL); + _osx_open (VSI_CALLER RR_QUEUE, hCommPL); + } + + if (hCommACI < VSI_OK) + { + if ((hCommACI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK) + return PEI_ERROR; + _osx_open (VSI_CALLER GPF_ACI_QUEUE, hCommACI); + } +#endif /* TI_PS_HCOMM_CHANGE */ + +#ifdef GPRS + if (hCommGRR < VSI_OK) + { + if ((hCommGRR = vsi_c_open (VSI_CALLER GRR_NAME)) < VSI_OK) + return PEI_ERROR; + _osx_open (VSI_CALLER GRR_QUEUE, hCommGRR); + } + + if (hCommLLC < VSI_OK) + { + if ((hCommLLC = vsi_c_open (VSI_CALLER LLC_NAME)) < VSI_OK) + return PEI_ERROR; + _osx_open (VSI_CALLER LLC_QUEUE, hCommLLC); + } + + if (hCommSNDCP < VSI_OK) + { + if ((hCommSNDCP = vsi_c_open (VSI_CALLER SNDCP_NAME)) < VSI_OK) + return PEI_ERROR; + _osx_open (VSI_CALLER SNDCP_QUEUE, hCommSNDCP); + } +#endif + + /* + * Register VSI_CALLER as generic caller entity. + */ + _osx_open (VSI_CALLER 0, 0); + + l1_create_ISR (); + + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_timeout ++------------------------------------------------------------------------------ +| Description : Process timeout. +| +| Parameters : index - timer index +| +| Return : PEI_OK - timeout processed +| PEI_ERROR - timeout not processed ++------------------------------------------------------------------------------ +*/ +#if !defined (NEW_FRAME) + +T_PEI_RETURN l1_pei_timeout (T_VSI_THANDLE handle) +{ + TRACE_FUNCTION ("pei_timeout()") + + return PEI_OK; +} + +#endif + +/* ++------------------------------------------------------------------------------ +| Function : pei_exit ++------------------------------------------------------------------------------ +| Description : Close Resources and terminate. +| +| Parameters : - +| +| Return : PEI_OK - exit sucessful ++------------------------------------------------------------------------------ +*/ +#if defined (NEW_FRAME) +LOCAL SHORT pei_exit (void) +#else +T_PEI_RETURN l1_pei_exit (void) +#endif +{ + + + +#ifdef TI_PS_HCOMM_CHANGE +#else + vsi_c_close (VSI_CALLER hCommPL); + hCommPL = VSI_ERROR; +#endif + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_run ++------------------------------------------------------------------------------ +| Description : Process Primitives, main loop is located in the +| Protocol Stack Entity. +| Only needed in active body variant +| +| Parameters : taskhandle - handle of current process +| comhandle - queue handle of current process +| +| Return : PEI_OK - sucessful +| PEI_ERROR - not successful ++------------------------------------------------------------------------------ +*/ +#if defined (NEW_FRAME) +LOCAL SHORT pei_run ( T_HANDLE taskhandle, T_HANDLE comhandle ) +#else +T_PEI_RETURN l1_pei_run (T_VSI_CHANDLE comhandle) +#endif +{ + +#ifdef TI_PS_HCOMM_CHANGE +#else + hCommL1 = comhandle; +#endif + + + l1a_task (0, NULL); + return PEI_OK; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_config ++------------------------------------------------------------------------------ +| Description : Dynamic Configuration. +| +| Parameters : in_string - configuration string +| +| Return : PEI_OK - sucessful +| PEI_ERROR - not successful ++------------------------------------------------------------------------------ +*/ +LOCAL SHORT pei_config (T_PEI_CONFIG inString) +{ + + + if ( _osx_config ( inString ) == OSX_OK ) + return PEI_OK; + else + return PEI_ERROR; +} + +/* ++------------------------------------------------------------------------------ +| Function : pei_monitor ++------------------------------------------------------------------------------ +| Description : Monitoring of physical Parameters. +| +| Parameters : out_monitor - return the address of the data to be monitored +| +| Return : PEI_OK - sucessful (address in out_monitor is valid) +| PEI_ERROR - not successful ++------------------------------------------------------------------------------ +*/ +#if defined (NEW_FRAME) +LOCAL SHORT pei_monitor (void ** monitor) +#else +T_PEI_RETURN l1_pei_monitor (void ** monitor) +#endif +{ + + + l1_mon.version = "ALR 2.0.0"; + *monitor = &l1_mon; + + return PEI_OK; +} + + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : pei_create ++------------------------------------------------------------------------------ +| Description : Create the Protocol Stack Entity. +| +| Parameters : info - Pointer to the structure of entity parameters +| +| Return : PEI_OK - entity created successfully +| ++------------------------------------------------------------------------------ +*/ +#if defined (NEW_FRAME) + +GLOBAL SHORT l1_pei_create ( T_PEI_INFO **info ) +{ + static T_PEI_INFO pei_info = + { + "L1", + { + pei_init, +#ifdef _SIMULATION_ + pei_exit, +#else + NULL, +#endif + NULL, /* no primitive function */ + NULL, /* no timeout function */ + NULL, /* no signal function */ + pei_run, + pei_config, + pei_monitor, + }, + #if defined (GPRS) + 2800, /* Stack Size */ + #else + #if defined (FAX_AND_DATA) + 2800, /* Stack Size */ + #else + 1805, /* Stacksize */ + #endif + #endif + 10, /* Queue Entries */ + 235, /* Priority */ + 0, /* number of timer */ +#ifdef GPRS + COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND /* flags */ +#else + COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND /* flags */ +#endif + }; + + /* + * export startup configuration data + */ + *info = &pei_info; + /* + * Initialize entity data + */ + + return PEI_OK; +} + +#else /* NEW_FRAME */ + +T_PEI_RETURN pei_create (T_VSI_CNAME * name) +{ + TRACE_FUNCTION ("pei_create()") + + *name = L1_NAME; + + return PEI_OK; +} + +#endif /* NEW_FRAME */ + +/*==== END OF FILE ==========================================================*/