view src/cs/drivers/drv_core/uart/serialswitch_core.h @ 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

/*******************************************************************************
 *
 * SERIALSWITCH_CORE.H
 *
 * This module allows managing the use of the serial ports of TI GSM Evaluation
 * Boards.
 * An application may have to send several serial data flows. The board on which
 * the application is running may have one or several devices. The purpose of
 * this module is to establish connections between the serial data flows and the
 * serial devices at runtime, when the application is started.
 *
 * (C) Texas Instruments 1999 - 2003
 *
 ******************************************************************************/
/*
 * 17/12/03
 * Duplication of serialswitch.h for L1 standalone only
 *
 ******************************************************************************/

#ifndef __SERIALSWITCH_CORE_H__
#define __SERIALSWITCH_CORE_H__

#ifndef _WINDOWS
  #include "l1sw.cfg"
  #include "swconfig.cfg"
  #include "chipset.cfg"
#endif

#ifndef __MONITOR__

#if (OP_L1_STANDALONE == 0)
  #include "main/sys_types.h"
#else
  #include "sys_types.h"
#endif

#include "traceswitch.h"
#endif /* __MONITOR__ */

#ifndef C_EXTERN
  #if (OP_L1_STANDALONE)
    #define C_EXTERN  extern
  #else
    #define C_EXTERN
  #endif
#endif

/*
 * Constants used to identify the serial data flows.
 */

#define SER_FLOW_1  (0)
#define SER_FLOW_2  (1)
#define SER_FLOW_3  (2)
#define SER_FLOW_4  (3)

#define SER_PROTOCOL_STACK (SER_FLOW_1)
#define SER_LAYER_1        (SER_FLOW_2) 
#define SER_FAX_DATA       (SER_FLOW_3)
#define SER_BLUETOOTH_HCI  (SER_FLOW_4)

#define SER_HWTEST         (SER_FLOW_1)
#define SER_SERIAL_TEST_1  (SER_FLOW_3)

 
#define SER_MAX_NUMBER_OF_FLOWS  (4)

#define SER_MAX_NUMBER_OF_CFG  (16)

/*
 * Type used to define the various drivers configuration
 * available, according to the UART devices.
 */

typedef enum {
    /* Trace Flow */
    DUMMY_TRACE,             /* = 0 */
    UART_IRDA_TRACE,         /* = 1 */
    UART_MODEM_TRACE,        /* = 2 */
    #if (CHIPSET == 12)
      UART_MODEM2_TRACE,     /* = 3 */
    #endif
    /* AT-Commands/Fax & Data Flow */
    DUMMY_FAX_DATA = 4,      /* = 4 */
    /* UART IrDA F&D Driver, not supported - should be = 5 */
    UART_MODEM_FAX_DATA = 6, /* = 6 */
    #if (CHIPSET == 12)
      /* UART Modem2 F&D Driver, not supported - should be = 7 */
    #endif
    /* Bluetooth HCI Flow */
    DUMMY_BT_HCI = 8,        /* = 8 */
    UART_IRDA_BT_HCI,        /* = 9 */
    UART_MODEM_BT_HCI        /* = A */
    #if (CHIPSET == 12)
      , UART_MODEM2_BT_HCI   /* = B */
    #endif
} T_SerialDriver;

/*
 * Type used to describe a defined serial configuration;
 * Each field is a 4 bits field representing one serial flow.
 *
 * T_DefinedSerialConfig : [ flow_1 | flow_2 | flow_3 | flow_4 ]
 *                         15    12 11     8  7     4  3     0
 */

typedef struct {

    unsigned int flow_4 :4;
    unsigned int flow_3 :4;
    unsigned int flow_2 :4;
    unsigned int flow_1 :4;
    
} T_DefinedSerialConfig;


/*
 * Type used to describe all serial configuration informations
 * of a defined application:
 *     - the default configuration to set up, if the current one is
 *       not valid,
 *     - the number of allowed serial configurations,
 *     - the entire allowed serial configurations.
 */

typedef struct {

    T_DefinedSerialConfig default_config;
	SYS_UWORD8         num_config;
	T_DefinedSerialConfig allowed_config[SER_MAX_NUMBER_OF_CFG];

} T_AppliSerialInfo;


/*
 * Functions prototypes.
 */

#ifndef __MONITOR__

C_EXTERN  void SER_InitSerialConfig (T_AppliSerialInfo *serial_info);

C_EXTERN SYS_BOOL SER_UartSleepStatus (void);

C_EXTERN void SER_WakeUpUarts (void);

void SER_restart_uart_sleep_timer (void);

void SER_activate_timer_hisr (void);

C_EXTERN  void SER_tr_Init (int serial_data_flow,
                              T_tr_Baudrate baudrate,
                              void (callback_function (void)));

C_EXTERN SYS_UWORD32 SER_tr_ReadNChars (int serial_data_flow,
                                        char *buffer,
                                        SYS_UWORD32 chars_to_read);

C_EXTERN SYS_UWORD32 SER_tr_ReadNBytes (int serial_data_flow,
                                        char *buffer,
                                        SYS_UWORD32 chars_to_read,
                                        SYS_BOOL *eof_detected);

C_EXTERN SYS_UWORD32 SER_tr_WriteNChars (int serial_data_flow,
                                         char *buffer,
                                         SYS_UWORD32 chars_to_write);

C_EXTERN SYS_UWORD32 SER_tr_EncapsulateNChars (int serial_data_flow,
                                               char *buffer,
                                               SYS_UWORD32 chars_to_write);

C_EXTERN SYS_UWORD32 SER_tr_WriteNBytes (int serial_data_flow,
                                         SYS_UWORD8 *buffer,
                                         SYS_UWORD32 chars_to_write);

C_EXTERN void SER_tr_WriteChar (int serial_data_flow,
                                char character);

C_EXTERN SYS_BOOL SER_tr_EnterSleep (int serial_data_flow);

C_EXTERN void SER_tr_WakeUp (int serial_data_flow);

C_EXTERN void SER_tr_WriteString (int serial_data_flow,
                                  char *buffer);


#if ((CHIPSET == 2) || (CHIPSET == 3))
   C_EXTERN void SER_uart_handler (void);
#elif ((CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
   C_EXTERN void SER_uart_modem_handler (void);
   C_EXTERN void SER_uart_irda_handler (void);
#endif
#if (CHIPSET == 12)
   C_EXTERN void SER_uart_modem2_handler (void);
#endif

#endif /* __MONITOR__ */

#undef C_EXTERN

#endif /* __SERIALSWITCH_CORE_H__ */