diff src/cs/system/main/create_RVtasks.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 8d5373b24f5f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cs/system/main/create_RVtasks.c	Fri Oct 16 06:23:26 2020 +0000
@@ -0,0 +1,665 @@
+/*******************************************************************************
+ *                                                                             *
+ *  Name        create_RVtasks.c                                               *
+ *                                                                             *
+ *  Function    this file contains functions allowing tasks creation in        *
+ *              the Riviera environment                                        *
+ *                                                                             *
+ *  Version     0.1                                                            *
+ *                                                                             *
+ *  Date        Modification                                                   *
+ *  ------------------------------------                                       *
+ *  03 August 2000      Create                                                 *
+ *                                                                             *
+ *  Author      Pascal Puel                                                    *
+ *                                                                             *
+ * (C) Copyright 2000 by Texas Instruments Incorporated, All Rights Reserved   *
+ *                                                                             *
+ * --------------------------------------------------------------------------- *
+ *                                                                             *
+ *   History:                                                                  *
+ *                                                                             *
+ *   10/18/2001 - Updated for R2D by Christophe Favergeon                      *
+ *   08/28/2002 - Clean-Up by Gerard Cauvy                                     *
+ *                                                                             *
+ ******************************************************************************/
+
+#ifndef _WINDOWS
+    #include "rv.cfg"
+#endif
+
+#include "rv/rv_general.h"
+#include "rvf/rvf_api.h"
+#include "rvm/rvm_api.h"
+#include "rvm/rvm_use_id_list.h"
+#include "rvt/rvt_gen.h"
+//sys_types.h is necessary for function prototypes in buzzer.h
+#include "sys_types.h"
+#include "buzzer/buzzer.h"
+#include "rv/rv_defined_swe.h"
+#include "chipset.cfg"
+
+#ifndef _WINDOWS
+#  include "power/power.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+
+#define START_TASK_ID      (MAX_RVF_TASKS-1)
+#define RV_START_TASK_PRIO (249)
+
+T_RVT_USER_ID rv_trace_user_id = 0xff;
+T_RVT_USER_ID etm_trace_user_id;
+
+extern void etm_receive(unsigned char *inbuf, unsigned short size);
+
+#ifdef MIXED_TRACE
+  T_RVT_USER_ID l23_trace_user_id;
+  extern void ext_processExtInput (T_RVT_BUFFER, UINT16);
+#endif
+
+#ifdef RVM_RNET_BR_SWE
+  T_RVT_USER_ID rnet_trace_user_id;
+  extern void rnet_receive (UINT8 *inbuf, UINT16 size);
+#endif
+
+#if (TEST==1)
+
+  // The name that uniquely identifies the Memory Bank MUST be
+  // 'TEST1', whereas it might be used by some other software
+  // entity for testing purpose.
+  #define RVTEST_MENU_MB_NAME          ("TEST1")
+
+  // Memory requirements.
+  #define RVTEST_MENU_MB_SIZE          (5000)
+  #define RVTEST_MENU_MB_WATERMARK     (4000)
+
+  extern void rv_test (UINT32 p);
+#endif
+
+
+/*******************************************************************************
+**
+** Function         rvt_init_trace
+**
+** Description      This function is called by the RV_START task to register
+**                  the Riviera Frame in the trace module
+**
+** Returns          void
+**
+*******************************************************************************/
+void rvt_init_trace (void)
+{
+    rvt_register_id ("RV", &rv_trace_user_id, rvt_set_trace_level);
+}
+
+#ifdef RVM_ETM_SWE
+/*******************************************************************************
+**
+** Function         etm_init_trace
+**
+** Description      This function is called by the RV_START task to register
+**                  the ETM in the trace module
+**
+** Returns          void
+**
+*******************************************************************************/
+void etm_init_trace (void)
+{
+    extern T_RVT_USER_ID tm_trace_user_id;
+
+    rvt_register_id("TM", &etm_trace_user_id, etm_receive);
+
+#if (PSP_STANDALONE != 1)
+    tm_trace_user_id = etm_trace_user_id; // TML1 use the tm_trace_user_id
+#endif
+}
+#endif
+
+#ifdef MIXED_TRACE
+/*******************************************************************************
+**
+** Function         l23_init_trace
+**
+** Description      This function is called by the RV_START task to register
+**                  the Protocol Stack (Layers 2 & 3) in the trace module
+**
+** Returns          void
+**
+*******************************************************************************/
+void l23_init_trace (void)
+{
+    rvt_register_id ("L23", &l23_trace_user_id, ext_processExtInput);
+}
+#endif
+
+#ifdef RVM_RNET_BR_SWE
+/*******************************************************************************
+**
+** Function         rnet_init_trace
+**
+** Description      This function is called by the RV_START task to register
+**                  RNET in the trace module
+**
+** Returns          void
+**
+*******************************************************************************/
+void rnet_init_trace (void)
+{
+    rvt_register_id ("RNET", &rnet_trace_user_id, rnet_receive);
+}
+#endif
+
+
+/*******************************************************************************
+**
+** Function         rv_start_swe_and_check
+**
+** Description      This internal function is called by the stater task to
+**                  start the basic SWEs in the system and to check if
+**                  they started successfully or not.
+**
+** Returns          void
+**
+*******************************************************************************/
+#if (CHIPSET!=15) || (REMU==0)
+BOOLEAN rv_start_swe_and_check (T_RVM_USE_ID swe_use_id, T_RVM_NAME swe_name)
+{
+    T_RV_RETURN return_path    = {0};
+    T_RV_HDR    *msg_ptr       = NULL;
+    UINT16      rec_evt        = 0;
+    char        error_msg[150] = "";
+
+    /* temporary initialization of addr_id */
+    return_path.addr_id = START_TASK_ID;
+    return_path.callback_func = NULL;
+
+    /* attempt to initialize the required SWE */
+    if (rvm_start_swe (swe_use_id, return_path) != RVM_OK)
+    {
+        sprintf (error_msg,
+                 "create_RVtasks: Unable to start %s (0x%.8x). Error in rvm_start_swe",
+                 (char *)swe_name,
+                 swe_use_id);
+        rvf_send_trace ((char *)error_msg,
+                        strlen((char *)error_msg),
+                        NULL_PARAM,
+                        RV_TRACE_LEVEL_WARNING, RVM_USE_ID);
+        return FALSE;
+    }
+
+    /*
+     * wait for the SWE to be actually started.
+     * note that the 'RVM_EVT_TO_APPLI' notification is sent back
+     * once xxx_start () is invoked.
+     */
+    while (rec_evt = rvf_evt_wait (START_TASK_ID, \
+                                   0xFFFF, \
+                                   0xFFFFFFFFL))
+    {
+        if (rec_evt & ~RVF_TASK_MBOX_0_EVT_MASK)
+        {
+            sprintf (error_msg,
+                     "create_RVtasks: Starting %s (0x%.8x). Event ",
+                     (char *)swe_name,
+                     swe_use_id);
+            rvf_send_trace ((char *)error_msg,
+                            strlen((char *)error_msg),
+                            (UINT32)rec_evt,
+                            RV_TRACE_LEVEL_WARNING,
+                            RVM_USE_ID);
+        }
+        if (rec_evt & RVF_TASK_MBOX_0_EVT_MASK)
+        {
+            if ((msg_ptr = (T_RV_HDR *) rvf_read_addr_mbox (START_TASK_ID, \
+                                                            RVF_TASK_MBOX_0)) == NULL)
+            {
+                sprintf (error_msg,
+                         "create_RVtasks: Starting %s (0x%.8x). Message NULL",
+                         (char *)swe_name,
+                         swe_use_id);
+                rvf_send_trace ((char *)error_msg,
+                                strlen((char *)error_msg),
+                                NULL_PARAM,
+                                RV_TRACE_LEVEL_WARNING,
+                                RVM_USE_ID);
+                continue;
+            }
+            if (msg_ptr->msg_id != RVM_EVT_TO_APPLI)
+            {
+                sprintf (error_msg,
+                         "create_RVtasks: Starting %s (0x%.8x). Message ID ",
+                         (char *)swe_name,
+                         swe_use_id);
+                rvf_send_trace ((char *)error_msg,
+                                strlen((char *)error_msg),
+                                msg_ptr->msg_id,
+                                RV_TRACE_LEVEL_WARNING,
+                                RVM_USE_ID);
+                rvf_free_buf (msg_ptr);
+                continue;
+            }
+            break;
+        }
+    }
+    switch (((T_RVM_APPLI_RESULT *)msg_ptr)->result)
+    {
+        case RVM_OK:
+            {
+                sprintf (error_msg,
+                         "create_RVtasks: %s (0x%.8x) started",
+                         (char *)swe_name,
+                         swe_use_id);
+                rvf_send_trace ((char *)error_msg,
+                                strlen ((char *)error_msg),
+                                NULL_PARAM,
+                                RV_TRACE_LEVEL_DEBUG_HIGH,
+                                RVM_USE_ID);
+                rvf_free_buf (msg_ptr);
+                return TRUE;
+            }
+        case RVM_NOT_READY:
+            {
+                sprintf (error_msg,
+                         "create_RVtasks: %s (0x%.8x) already started",
+                         (char *)swe_name,
+                         swe_use_id);
+                rvf_send_trace ((char *)error_msg,
+                                strlen ((char *)error_msg),
+                                NULL_PARAM,
+                                RV_TRACE_LEVEL_DEBUG_MEDIUM,
+                                RVM_USE_ID);
+                rvf_free_buf (msg_ptr);
+                return TRUE;
+            }
+        default:
+            {
+                break;
+            }
+    }
+    sprintf (error_msg,
+             "create_RVtasks: Unable to start %s (0x%.8x). Error ",
+             (char *)swe_name,
+             swe_use_id);
+    rvf_send_trace ((char *)error_msg,
+                    strlen ((char *)error_msg),
+                    ((T_RVM_APPLI_RESULT *)msg_ptr)->result,
+                    RV_TRACE_LEVEL_WARNING,
+                    RVM_USE_ID);
+    rvf_free_buf (msg_ptr);
+    return FALSE;
+}
+
+#endif
+/*******************************************************************************
+**
+** Function         rv_start
+**
+** Description      This function is called by the RV_START task. It starts the
+**                  Riviera environment and the TRACE task. This start must be
+**                  done after Application_initialize().
+**
+** Returns          void
+**
+*******************************************************************************/
+void rv_start (void)
+{
+#if (TEST==1)
+    T_RVF_MB_ID     mb_id           = RVF_INVALID_MB_ID;
+    T_RVF_MB_PARAM  mb_requirements = {0};
+    volatile UINT16 result          = 0;
+#endif
+
+    /* initialize the RVM and the RVF at the same time */
+#if (CHIPSET!=15) || (REMU==0)
+    rvm_start_environment ();
+#endif
+    /*
+    ** Init trace module
+    */
+    rvt_init_trace ();
+#ifdef RVM_ETM_SWE
+    etm_init_trace ();
+#endif
+
+#if (_GSM==1)
+    #ifdef MIXED_TRACE
+      l23_init_trace ();
+    #endif
+#endif // if (_GSM==1)
+
+#ifdef RVM_RNET_BR_SWE
+    rnet_init_trace ();
+#endif
+
+#if (REMU==1)
+#ifdef RVM_LLS_SWE
+    /* initialize LLS SWE */
+    lls_init();
+#endif
+
+#ifdef RVM_RNG_SWE
+    /* initialize RNG SWE */
+    rng_init ();
+#endif
+#endif
+
+#if (CHIPSET!=15) || (REMU==0)
+#ifdef RVM_RVT_SWE
+    /* initialize TRACE SWE */
+    rv_start_swe_and_check (RVT_USE_ID, "RVT");
+#endif
+
+#ifdef RVM_I2C_SWE
+	rv_start_swe_and_check (I2C_USE_ID, "I2C");
+#endif
+
+#ifdef RVM_DMA_SWE
+	rv_start_swe_and_check (DMA_USE_ID, "DMA");
+#endif
+
+#ifdef RVM_DMG_SWE
+	rv_start_swe_and_check (DMG_USE_ID, "DMG");
+#endif
+
+#ifdef RVM_NAN_SWE
+	rv_start_swe_and_check (NAN_USE_ID, "NAN");
+#endif
+
+#ifdef RVM_MC_SWE
+	rv_start_swe_and_check (MC_USE_ID, "MC");
+#endif
+
+#ifdef RVM_FFS_SWE
+    /* initialize FFS SWE */
+    rv_start_swe_and_check (FFS_USE_ID, "FFS");
+#endif
+
+#ifdef RVM_SPI_SWE
+    /* initialize SPI SWE */
+    rv_start_swe_and_check (SPI_USE_ID, "SPI");
+#endif
+
+#ifdef RVM_PWR_SWE
+    /* initialize PWR SWE */
+    rv_start_swe_and_check (PWR_USE_ID, "PWR");
+#endif
+
+#ifdef RVM_LCC_SWE
+    /* initialize LCC(PWR) SWE */
+    rv_start_swe_and_check (LCC_USE_ID, "LCC");
+#endif
+
+#ifdef RVM_FCHG_SWE
+    /* initialize FCHG (new PWR) SWE */
+    rv_start_swe_and_check (FCHG_USE_ID, "FCHG");
+#endif
+
+#ifdef RVM_KPD_SWE
+    /* initialize KPD SWE */
+    rv_start_swe_and_check (KPD_USE_ID, "KPD");
+#endif
+
+#ifdef RVM_DAR_SWE
+    /* initialize DAR SWE */
+    rv_start_swe_and_check (DAR_USE_ID, "DAR");
+#endif
+
+#ifdef RVM_R2D_SWE
+    /* initialize R2D SWE */
+    rv_start_swe_and_check (R2D_USE_ID, "R2D");
+#endif
+
+#ifdef RVM_LCD_SWE
+    /* initialize LCD SWE */
+    rv_start_swe_and_check (LCD_USE_ID, "LCD");
+#endif
+
+
+#ifdef RVM_ETM_SWE
+    /* initialize ETM SWE */
+    rv_start_swe_and_check (ETM_USE_ID, "ETM");
+#endif
+
+#ifdef RVM_TTY_SWE
+    /* initialize TTY SWE */
+    rv_start_swe_and_check (TTY_USE_ID, "TTY");
+#endif
+
+
+#ifdef RVM_AUDIO_MAIN_SWE
+    /* initialize AUDIO SWE */
+    rv_start_swe_and_check (AUDIO_USE_ID, "AUDIO");
+#endif
+
+#if (PSP_STANDALONE==0)
+#ifdef RVM_AUDIO_BGD_SWE
+    /* initialize AUDIO BACKGROUND SWE */
+    rv_start_swe_and_check (AUDIO_BGD_USE_ID, "AUDIO_BGD");
+#endif
+#endif
+
+#if (PSP_STANDALONE==0)
+#ifdef RVM_BAE_SWE
+    /* initialize BAE SWE */
+    rv_start_swe_and_check (BAE_USE_ID, "BAE");
+#endif
+#endif
+
+#ifdef RVM_AS_SWE
+    /* initialize AS (Audio Services) SWE */
+    rv_start_swe_and_check (AS_USE_ID, "AS");
+#endif
+
+#if (PSP_STANDALONE==0)
+#ifdef RVM_BPR_SWE
+    /* initialize sample BPR SWE */
+    rv_start_swe_and_check (BPR_USE_ID, "BPR");
+#endif
+
+#endif /* PSP_STANDALONE */
+
+#ifdef RVM_RTC_SWE
+    /* initialize RTC SWE */
+    rv_start_swe_and_check (RTC_USE_ID, "RTC");
+#endif
+
+#ifdef RVM_LLS_SWE
+    /* initialize LLS SWE */
+    rv_start_swe_and_check (LLS_USE_ID, "LLS");
+#endif
+
+#ifdef RVM_TUT_SWE
+    /* initialize TUT SWE */
+//	rv_start_swe_and_check (TUT_USE_ID, "TUT");
+#endif
+
+#ifdef RVM_RGUI_SWE
+    /* initialize RGUI SWE */
+	rv_start_swe_and_check (RGUI_USE_ID, "RGUI");
+#endif
+
+#ifdef RVM_ATP_SWE
+	/* initialize ATP SWE */
+	rv_start_swe_and_check (ATP_USE_ID, "ATP");
+#endif
+
+/*
+ * FreeCalypso: the main.lib:Create_RVtasks.obj binary blob we got with our
+ * TCS211 semi-src does not start MKS, even though the SWE itself is enabled
+ * in the build system and pulled into the link.
+ */
+#if 0
+#ifdef RVM_MKS_SWE
+	rv_start_swe_and_check (MKS_USE_ID, "MKS");
+#endif
+#endif
+
+#ifdef RVM_IMG_SWE
+	rv_start_swe_and_check (IMG_USE_ID, "IMG");
+#endif
+
+#ifdef RVM_GBI_SWE
+	rv_start_swe_and_check (GBI_USE_ID, "GBI");
+#endif
+
+#ifdef RVM_CAMD_SWE
+	rv_start_swe_and_check (CAMD_USE_ID, "CAMD");
+#endif
+
+#ifdef RVM_USB_SWE
+    /* initialize USB SWE */
+	rv_start_swe_and_check (USB_USE_ID, "USB");
+#endif
+
+#ifdef RVM_CAMA_SWE
+	rv_start_swe_and_check (CAMA_USE_ID, "CAMA");
+#endif
+
+#ifdef RVM_MFW_SWE
+    /* initialize MFW SWE */
+    rv_start_swe_and_check (MFW_USE_ID, "MFW");
+#endif
+
+#ifdef RVM_SMBS_SWE
+    /* initialize SMBS SWE */
+    rv_start_swe_and_check (SMBS_USE_ID, "SMBS");
+#endif
+
+#ifdef RVM_USBFAX_SWE
+    /* initialize USB SWE */
+	rv_start_swe_and_check (USBFAX_USE_ID, "USBFAX");
+#endif
+
+#ifdef RVM_USBTRC_SWE
+    /* initialize USBTRC SWE */
+	rv_start_swe_and_check (USBTRC_USE_ID, "USBTRC");
+#endif
+
+#ifdef RVM_USBMS_SWE
+    /* initialize USBMS SWE */
+	rv_start_swe_and_check (USBMS_USE_ID, "USBMS");
+#endif
+
+#ifdef RVM_RFS_SWE
+    /* initialize RFS SWE */
+	rv_start_swe_and_check (RFS_USE_ID, "RFS");
+#endif
+
+
+#ifdef RVM_CCI_SWE
+    /* initialize CCI SWE */
+    rv_start_swe_and_check (CCI_USE_ID, "CCI");
+#endif
+
+#ifdef RVM_BTUI_SWE
+    /* initialize sample BTUI SWE */
+    rv_start_swe_and_check (BTUI_USE_ID, "BTUI");
+#endif
+#ifdef RVM_JPEG_SWE
+    /* initialize sample JPEG SWE */
+    rv_start_swe_and_check (JPEG_USE_ID, "JPEG");
+#endif    
+#ifdef RVM_JPEG_SWE
+    /* initialize sample JPEG SWE */
+    rv_start_swe_and_check (JPEG_USE_ID, "JPEG");
+#endif    
+#endif
+// WARNING WARNING ----------------------------------------------------
+// Do not perform any SWE initialization after this line !
+// WARNING WARNING ----------------------------------------------------
+
+#if (REMU==0) /* moved this to kpd start function.  rv_start function for REMU. rv_start is called from Application Initialize 
+context.  Since this is a blocking call, we cannot afford to block in Application_Initialization. */
+#ifndef _WINDOWS
+    // Perform switch ON processing.
+    Switch_ON();
+#endif
+
+#if (_GSM==1)
+    BZ_KeyBeep_ON ();          // Audio feedback if ON/OFF pushed
+#endif // if (_GSM==1)
+
+#endif
+#if (CHIPSET!=15) || (REMU==0)
+    /* dump the Riviera memory state */
+    rvf_delay (RVF_MS_TO_TICKS (300)) ;
+	rvf_dump_mem ();
+    rvf_dump_pool();
+    rvf_dump_tasks();
+#endif
+#if (TEST==1)
+#if (PSP_STANDALONE == 1)
+	/* Just For Testing Reset of UICC */
+//   bspUicc_reset(1,0);   
+
+	/* Just For Testing GEA */
+//   bspTest_Gea3_ciph_req(1);
+
+#endif
+#if (CHIPSET!=15) || (REMU==0)
+    // create a Memory Bank for the 'Test Selection Menu'.
+    mb_requirements.size      = RVTEST_MENU_MB_SIZE;
+    mb_requirements.watermark = RVTEST_MENU_MB_WATERMARK;
+    mb_requirements.pool_id   = RVF_POOL_EXTERNAL_MEM;
+    if (rvf_create_mb (RVTEST_MENU_MB_NAME,
+                       mb_requirements,
+                       &mb_id) != RVF_OK)
+    {
+        // error case.
+        result++;
+    }
+
+#if (PSP_STANDALONE == 1)	
+/* Just For Testing Reset of UICC */	
+bspUicc_reset(1,0);	/* Just For Testing GEA */	
+bspTest_Gea3_ciph_req(1);    
+#endif
+
+// Go to the 'Test Selection Menu' (using rv_test ()).
+    rv_test (0);
+#endif	
+#endif // (TEST==1)
+
+#if (CHIPSET!=15) || (REMU==0)
+    // infinite wait
+    rvf_evt_wait (START_TASK_ID,
+                  0xFFFF,
+                  0xFFFFFFFFL);
+#endif
+}
+
+#if (TEST==1) 
+  #define RV_START_TASK_STACK (4096)
+#else
+  #define RV_START_TASK_STACK (1024)
+#endif
+#if (CHIPSET!=15) || (REMU==0)
+UINT8 stack_start[RV_START_TASK_STACK];
+
+
+/*******************************************************************************
+**
+** Function         create_tasks
+**
+** Description      This function is called once at startup to allow task
+**                  creation thanks to Riviera environment.
+**
+** Returns          void
+**
+*******************************************************************************/
+void create_tasks (void)
+{
+
+   // Tasks creation
+   rvf_create_legacy_task ((TASKPTR) rv_start, START_TASK_ID,
+                    "RV_START", stack_start,
+                    RV_START_TASK_STACK, RV_START_TASK_PRIO, 0, RUNNING);
+
+}
+#endif
+
+
+