view src/cs/services/dar/dar_task.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/****************************************************************************/
/*                                                                          */
/*  File Name:  dar_task.c                                                  */
/*                                                                          */
/*  Purpose:   This function is the main function. It contains the dar_core */
/*             which waits for messages or function calls.                  */
/*                                                                          */
/*                                                                          */
/*  Version   0.1                                                           */
/*                                                                          */
/*  Date                 Modification                                       */
/*  ------------------------------------                                    */
/*  16 October 2001    Create                                               */
/*                                                                          */
/*  Author     Stephanie Gerthoux                                           */
/*                                                                          */
/* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved*/
/****************************************************************************/

#include "rv/rv_defined_swe.h"
#ifdef RVM_DAR_SWE
   #ifndef _WINDOWS
      #include "config/swconfig.cfg"
      #include "config/sys.cfg"
      #include "config/chipset.cfg"
   #endif

   #include <string.h>
   #include "rvm/rvm_gen.h"
   #include "rvm/rvm_use_id_list.h"
   #include "dar/dar_api.h"
   #include "dar/dar_macro_i.h"
   #include "dar/dar_handle_message.h"
   #include "dar/dar_structs_i.h"
   #include "dar/dar_error_hdlr_i.h"
   #include "dar/dar_const_i.h"  

   #include "ffs/ffs_api.h"
  
   /* Variables definitions */
   T_DAR_RECOVERY_STATUS status=0;

   /**** Global variables ****/
   /* Define a pointer to the Global Environment Control block  */
   extern T_DAR_ENV_CTRL_BLK *dar_gbl_var_p;

   /* Write buffer*/
   extern char dar_write_buffer[DAR_MAX_BUFFER_SIZE];

   /* index used in the circular buffer*/
   extern UINT16 dar_current_index;

   /* DAR previous status : to get the status of the last exception */
   extern UINT8  dar_previous_exception;

   /* Ram buffer that contains the Debug Unit register */
   extern UINT32  debug_RAM[DEBUG_UNIT_WORD_SIZE];

   /* X_dump buffer defined in the command file */
   /* This buffer contains the general register, the PC, the CPSR....*/
   #ifndef _WINDOWS
      extern INT32 xdump_buffer;
   #endif


   /********************************************************************************/
   /* Function         dar_core                                                    */
   /*                                                                              */
   /* Description      Core of the dar task, which scans the dar mailbox and       */
   /*                  waits for messages. When a message arrives, it sends it to  */
   /*                  proper functions                                            */
   /*                                                                              */
   /*                                                                              */
   /********************************************************************************/

   T_RV_RET dar_core(void)
   {
      /* Declare local variables */
      /**** Structs ****/
      /* File descriptor type */
      T_FFS_FD  ffs_fd;
    
      /* Variables */
      T_RV_RET     error_status = RV_OK;
      T_RV_HDR     *msg_p = NULL;
      UINT16       received_event = 0x0000;
      char         dar_ffs[20];
      char         dar_dir_ffs[20];
      char         dar_subdir_ffs[20];
      BOOL         dar_ffs_error = FALSE;

      #ifndef _WINDOWS
         /* Define the Link register and the CPSR */
         INT32 *link_register_p = &(xdump_buffer) + 14;
         INT32 *dar_spsr_p      = &(xdump_buffer) + 16;
         UINT16      i;      
      #endif

      /* Dar_ffs file name */ 
      strcpy(dar_dir_ffs,"/var");
      strcpy(dar_subdir_ffs,"/var/dbg");

      #ifndef _WINDOWS
         strcpy(dar_ffs,"/var/dbg/dar");
      #else
         strcpy(dar_ffs,"\var\dbg\dar");
      #endif

      DAR_SEND_TRACE("DAR_TASK started",RV_TRACE_LEVEL_DEBUG_HIGH);

      /*---------------------------------*/
      /*               FFS               */
      /*---------------------------------*/

      /**** create the dar ffs directories ****/
	  if ((ffs_mkdir(dar_dir_ffs) != EFFS_OK) && (ffs_mkdir(dar_dir_ffs) != EFFS_EXISTS))
	  {
         DAR_SEND_TRACE("DAR entity can't create the '/var' folder into the flash",RV_TRACE_LEVEL_ERROR);
	  }

  	  if ((ffs_mkdir(dar_subdir_ffs) != EFFS_OK) && (ffs_mkdir(dar_subdir_ffs) != EFFS_EXISTS))
	  {
         DAR_SEND_TRACE("DAR entity can't create the '/var/dbg' folder into the flash",RV_TRACE_LEVEL_ERROR);
	  }


      /**** create the ffs file ****/
      ffs_fd = ffs_open(dar_ffs, FFS_O_CREATE | FFS_O_WRONLY | FFS_O_TRUNC | FFS_O_APPEND);

      if (ffs_fd < 0)
      {
         DAR_SEND_TRACE("DAR entity has received wrong file name or the flash is not formatted",RV_TRACE_LEVEL_WARNING);
         dar_ffs_error = TRUE;
      }
    
      #ifndef _WINDOWS

         /**** Save the RAM buffer into the FFS ****/
         /* save the buffer in 2 parts in order to have the information in chronological order */
         /* save the oldest information : from dar_current_index to the end of the buffer*/
         if ((ffs_write (ffs_fd,
                         (void *)(&dar_write_buffer + dar_current_index),
                         (DAR_MAX_BUFFER_SIZE - dar_current_index))) < 0 & (dar_ffs_error == FALSE))
         {
            DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING);
         }

         /* save the rest of information: from the beginning of the buffer to dar_current_index */
         if ((ffs_write (ffs_fd,
                         (void *)(&dar_write_buffer),
                         (dar_current_index))) < 0 & (dar_ffs_error == FALSE))
         {
            DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING);
         }

         /* Erase the dar_write_buffer */
         for (i=0;i<DAR_MAX_BUFFER_SIZE; i++)
         {
            dar_write_buffer[i] = 0;
         }

         /**** Save the X_dump_buffer into the Flash. ****/
         /* This buffer is defined in the command file */
         /* And the size of this buffer is defined in the gsm_cs_amd4_lj3_test.cmd */
         /* its size is 38*32 bits = 38*4 bytes = 152 bytes */
         if ((ffs_write (ffs_fd,
                         (void *)(&xdump_buffer),
                         (DAR_X_DUMP_BUFFER_SIZE))) < 0 & (dar_ffs_error == FALSE))
         {
            DAR_SEND_TRACE("DAR entity can't saved the X_dump_buffer in flash",RV_TRACE_LEVEL_WARNING);
         }

         /**** Save the Debug Unit Register into the Flash if necessary (Abort or prefetch)****/
         /* A Prefetch abort exception or a data abort exception is generated */
         #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11))
            if ((dar_previous_exception == DAR_EXCEPTION_PREFETCH_ABORT) ||
                (dar_previous_exception == DAR_EXCEPTION_DATA_ABORT))
            {
               /* Save the Debug Unit into the Flash */
               if ((ffs_write (ffs_fd,
                              (void *) &debug_RAM,
                              (4*DEBUG_UNIT_WORD_SIZE))) < 0 & (dar_ffs_error == FALSE))
               {
                  DAR_SEND_TRACE("DAR entity can't saved the DEBUG UNIT in flash",RV_TRACE_LEVEL_WARNING);
               }
            }
         #endif
         
      #else
         /* save the buffer in 2 parts in order to have the information in chronological order */
         /* save the oldest information : from dar_current_index to the end of the buffer*/
         if ((ffs_write (ffs_fd,
                         (&dar_write_buffer + dar_current_index),
                         (DAR_MAX_BUFFER_SIZE - dar_current_index))) != EFFS_OK)
         {
            DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING);
         }
         /* save the rest of information: from the beginning of the buffer to dar_current_index */
         if ((ffs_write (ffs_fd,
                         (&dar_write_buffer),
                         (dar_current_index))) != EFFS_OK)
         {
            DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING);
         }
         /* The X_dump_buffer  and the Debug Unit can't be saved on the PC */
      #endif

      /* Close the ffs file*/
      #ifndef _WINDOWS
         if ( ffs_close(ffs_fd) != EFFS_OK & (dar_ffs_error == FALSE))
         {
            DAR_SEND_TRACE("DAR entity has not closed the file",RV_TRACE_LEVEL_WARNING);
         }
      #else
         if ( ffs_close(ffs_fd) != EFFS_OK )
         {
            dar_error_trace(DAR_ENTITY_FILE_NO_CLOSE);
         }
      #endif

      #ifndef _WINDOWS
         /**** Save the LR and the SPSR when an exception has occured ****/
         if ((dar_previous_exception == DAR_EXCEPTION_PREFETCH_ABORT)||
             (dar_previous_exception == DAR_EXCEPTION_DATA_ABORT)    ||
             (dar_previous_exception == DAR_EXCEPTION_UNDEFINED)     ||
             (dar_previous_exception == DAR_EXCEPTION_SWI)           ||
             (dar_previous_exception == DAR_EXCEPTION_RESERVED))
         {
            /* Displays the Link register saved on exception  */
            DAR_SEND_TRACE_PARAM("Link register = ", *link_register_p,RV_TRACE_LEVEL_DEBUG_HIGH);

            /* Displays the User mode CPSR saved on exception */
            DAR_SEND_TRACE_PARAM("User mode SPSR before the exception=", *dar_spsr_p,RV_TRACE_LEVEL_DEBUG_HIGH); 
         }

         /* Displays the status of the last reset of the system */
         dar_recovery_get_status(&status);
      #endif

      /* ------------------------------------------- */
      /* loop to process messages                    */
      /* ------------------------------------------- */
      while (error_status == RV_OK)
      {
         /* Wait for all events. */
         received_event = rvf_wait(DAR_ALL_EVENT_FLAGS, DAR_NOT_TIME_OUT);
  
         if (received_event & DAR_TASK_MBOX_EVT_MASK)
         {
            /* Read the message in the Dar mailbox and handle it. */
            msg_p = (T_RV_HDR *) rvf_read_mbox(DAR_MBOX);			
            error_status = dar_handle_msg(msg_p);
         }
      }
  
      /* If one of the occured events is unexpected (due to an unassigned  */
      /* mailbox), then report an internal error.                          */
      if (received_event & ~(DAR_TASK_MBOX_EVT_MASK )) 
      {
         DAR_SEND_TRACE(" DAR ERROR (env). One of the occured events is unexpected ",
                         RV_TRACE_LEVEL_ERROR);

         error_status = RV_NOT_SUPPORTED;
      }

      /* If a memory error happened .. */
      if (error_status ==  RV_MEMORY_ERR)
      {
         dar_gbl_var_p->callBackFctError("DAR",
                                         RVM_MEMORY_ERR,
                                         0,
                                         " Memory Error : the DAR primitive memory bank is RED ");
      }

       return RV_OK;
   } /* dar_core */

#endif /* #ifdef RVM_DAR_SWE */