FreeCalypso > hg > fc-tourmaline
view src/cs/drivers/drv_app/uart/serialswitch.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.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 * ******************************************************************************/ #ifndef __SERIALSWITCH_H__ #define __SERIALSWITCH_H__ #ifndef _WINDOWS #include "l1sw.cfg" #include "swconfig.cfg" #if (!OP_L1_STANDALONE) #include "rv.cfg" #endif #include "chipset.cfg" #endif #ifndef __MONITOR__ #include "main/sys_types.h" #include "uart/traceswitch.h" #include "faxdata.h" #endif /* __MONITOR__ */ #ifdef BTEMOBILE #include "hci_ser.h" #endif #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__ #if (DP==1) void SER_InitSerialConfig (int application_id); #else C_EXTERN void SER_InitSerialConfig (T_AppliSerialInfo *serial_info); #endif //DP 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); #if (DP==1) void SER_tr_Init (int serial_data_flow, int baudrate, void (callback_function (void))); #else C_EXTERN void SER_tr_Init (int serial_data_flow, T_tr_Baudrate baudrate, void (callback_function (void))); #endif //DP 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); #define T_UFRET T_FDRET #define UF_DEVICE_0 (0) #define UF_OK FD_OK #define UF_SUSPENDED FD_SUSPENDED #define UF_NOT_SUPPORTED FD_NOT_SUPPORTED #define UF_NOT_READY FD_NOT_READY #define UF_INTERNAL_ERROR FD_INTERNAL_ERR #define UF_LINE_ON FD_LINE_ON #define UF_LINE_OFF FD_LINE_OFF #define UF_MAX_BUFFER_SIZE FD_MAX_BUFFER_SIZE #define UF_BAUD_AUTO FD_BAUD_AUTO #define UF_BAUD_75 FD_BAUD_75 #define UF_BAUD_150 FD_BAUD_150 #define UF_BAUD_300 FD_BAUD_300 #define UF_BAUD_600 FD_BAUD_600 #define UF_BAUD_1200 FD_BAUD_1200 #define UF_BAUD_2400 FD_BAUD_2400 #define UF_BAUD_4800 FD_BAUD_4800 #define UF_BAUD_7200 FD_BAUD_7200 #define UF_BAUD_9600 FD_BAUD_9600 #define UF_BAUD_14400 FD_BAUD_14400 #define UF_BAUD_19200 FD_BAUD_19200 #define UF_BAUD_28800 FD_BAUD_28800 #define UF_BAUD_33900 FD_BAUD_33900 #define UF_BAUD_38400 FD_BAUD_38400 #define UF_BAUD_57600 FD_BAUD_57600 #define UF_BAUD_115200 FD_BAUD_115200 #define UF_BAUD_203125 FD_BAUD_203125 #define UF_BAUD_406250 FD_BAUD_406250 #define UF_BAUD_812500 FD_BAUD_812500 C_EXTERN T_FDRET SER_fd_Init (void); #if (DP==0) C_EXTERN T_FDRET SER_fd_Initialize (void); #endif C_EXTERN T_FDRET SER_fd_Enable (SYS_BOOL enable); C_EXTERN T_FDRET SER_fd_SetComPar (T_baudrate baudrate, T_bitsPerCharacter bpc, T_stopBits sb, T_parity parity); C_EXTERN T_FDRET SER_fd_SetBuffer (SYS_UWORD16 bufSize, SYS_UWORD16 rxThreshold, SYS_UWORD16 txThreshold); C_EXTERN T_FDRET SER_fd_SetFlowCtrl (T_flowCtrlMode fcMode, SYS_UWORD8 XON, SYS_UWORD8 XOFF); C_EXTERN T_FDRET SER_fd_SetEscape (char escChar, SYS_UWORD16 guardPeriod); C_EXTERN T_FDRET SER_fd_InpAvail (void); C_EXTERN T_FDRET SER_fd_OutpAvail (void); C_EXTERN T_FDRET SER_fd_EnterSleep (void); C_EXTERN T_FDRET SER_fd_WakeUp (void); C_EXTERN T_FDRET SER_fd_ReadData (T_suspendMode suspend, void (readOutFunc (SYS_BOOL cldFromIrq, T_reInstMode *reInstall, SYS_UWORD8 nsource, SYS_UWORD8 *source[], SYS_UWORD16 size[], SYS_UWORD32 state))); C_EXTERN T_FDRET SER_fd_WriteData (T_suspendMode suspend, void (writeInFunc (SYS_BOOL cldFromIrq, T_reInstMode *reInstall, SYS_UWORD8 ndest, SYS_UWORD8 *dest[], SYS_UWORD16 size[]))); C_EXTERN T_FDRET SER_fd_StopRec (void); C_EXTERN T_FDRET SER_fd_StartRec (void); C_EXTERN T_FDRET SER_fd_GetLineState (SYS_UWORD32 *state); C_EXTERN T_FDRET SER_fd_SetLineState (SYS_UWORD32 state, SYS_UWORD32 mask); #if (DP==0) C_EXTERN T_FDRET SER_fd_CheckXEmpty (void); #endif #ifdef BTEMOBILE C_EXTERN T_HCI_RET SER_bt_Init (void); C_EXTERN T_HCI_RET SER_bt_Start (void); C_EXTERN T_HCI_RET SER_bt_Stop (void); C_EXTERN T_HCI_RET SER_bt_Kill (void); C_EXTERN T_HCI_RET SER_bt_SetBaudrate (UINT8 baudrate); C_EXTERN T_HCI_RET SER_bt_TransmitPacket (void *uart_sco_tx_buffer); C_EXTERN SYS_BOOL SER_bt_EnterSleep (void); C_EXTERN void SER_bt_WakeUp (void); #endif #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 #if (DP==1) T_FDRET UF_Init (int serial_data_flow); T_FDRET UF_Enable (int serial_data_flow, SYS_BOOL enable); T_FDRET UF_SetComPar (int serial_data_flow, T_baudrate baudrate, T_bitsPerCharacter bpc, T_stopBits sb, T_parity parity); T_FDRET UF_SetBuffer (int serial_data_flow, SYS_UWORD16 bufSize, SYS_UWORD16 rxThreshold, SYS_UWORD16 txThreshold); T_FDRET UF_SetFlowCtrl (int serial_data_flow, T_flowCtrlMode fcMode, SYS_UWORD8 XON, SYS_UWORD8 XOFF); T_FDRET UF_SetEscape (int serial_data_flow, char escChar, SYS_UWORD16 guardPeriod); T_FDRET UF_InpAvail (int serial_data_flow); T_FDRET UF_OutpAvail (int serial_data_flow); T_FDRET UF_ReadData (int serial_data_flow, T_suspendMode suspend, void (readOutFunc (SYS_BOOL cldFromIrq, T_reInstMode *reInstall, SYS_UWORD8 nsource, SYS_UWORD8 *source[], SYS_UWORD16 size[], SYS_UWORD32 state))); T_FDRET UF_WriteData (int uartNo, T_suspendMode suspend, void (writeInFunc (SYS_BOOL cldFromIrq, T_reInstMode *reInstall, SYS_UWORD8 ndest, SYS_UWORD8 *dest[], SYS_UWORD16 size[]))); T_FDRET UF_StopRec (int serial_data_flow); T_FDRET UF_StartRec (int serial_data_flow); T_FDRET UF_GetLineState (int serial_data_flow, SYS_UWORD32 *state); T_FDRET UF_SetLineState (int serial_data_flow, SYS_UWORD32 state, SYS_UWORD32 mask); T_FDRET UF_CheckXEmpty (int serial_data_flow); T_FDRET UF_EnterSleep (int serial_data_flow); T_FDRET UF_WakeUp (int serial_data_flow); #endif //DP /* * Functions used for Dynamic Switch. */ SYS_BOOL SER_WriteConfig (char *new_config, SYS_BOOL write_to_flash); SYS_BOOL SER_ImmediateSwitch (void); /* * Constants and macros used by Condat. * Condat uses a serial device for the protocol stack trace. */ #ifndef __SERIALSWITCH_C__ #define UT_DEVICE_0 (0) #define UT_BAUD_406250 TR_BAUD_406250 #define UT_BAUD_115200 TR_BAUD_115200 #define UT_BAUD_57600 TR_BAUD_57600 #define UT_BAUD_38400 TR_BAUD_38400 #define UT_BAUD_33900 TR_BAUD_33900 #define UT_BAUD_28800 TR_BAUD_28800 #define UT_BAUD_19200 TR_BAUD_19200 #define UT_BAUD_14400 TR_BAUD_14400 #define UT_BAUD_9600 TR_BAUD_9600 #define UT_BAUD_4800 TR_BAUD_4800 #define UT_BAUD_2400 TR_BAUD_2400 #define UT_BAUD_1200 TR_BAUD_1200 #define UT_BAUD_600 TR_BAUD_600 #define UT_BAUD_300 TR_BAUD_300 #define UT_BAUD_150 TR_BAUD_150 #define UT_BAUD_75 TR_BAUD_75 #define UT_Init(A,B,C) SER_tr_Init (SER_PROTOCOL_STACK, B, C) #define UT_ReadNChars(A,B,C) SER_tr_ReadNChars (SER_PROTOCOL_STACK, B, C) #define UT_WriteNChars(A,B,C) SER_tr_WriteNChars (SER_PROTOCOL_STACK, B, C) #define UT_WriteChar(A,B) SER_tr_WriteChar (SER_PROTOCOL_STACK, B) #define UT_WriteString(A,B) SER_tr_WriteString (SER_PROTOCOL_STACK, B) #if (DP==0) #define UF_Init(A) SER_fd_Init () #define UF_Enable(A,B) SER_fd_Enable (B) #define UF_SetComPar(A,B,C,D,E) SER_fd_SetComPar (B, C, D, E) #define UF_SetBuffer(A,B,C,D) SER_fd_SetBuffer (B, C, D) #define UF_SetFlowCtrl(A,B,C,D) SER_fd_SetFlowCtrl (B, C, D) #define UF_SetEscape(A,B,C) SER_fd_SetEscape (B, C) #define UF_InpAvail(A) SER_fd_InpAvail () #define UF_OutpAvail(A) SER_fd_OutpAvail () #define UF_ReadData(A,B,C) SER_fd_ReadData (B, C) #define UF_WriteData(A,B,C) SER_fd_WriteData (B, C) #define UF_StopRec(A) SER_fd_StopRec() #define UF_StartRec(A) SER_fd_StartRec () #define UF_GetLineState(A,B) SER_fd_GetLineState (B) #define UF_SetLineState(A,B,C) SER_fd_SetLineState (B, C) #define UF_CheckXEmpty(A) SER_fd_CheckXEmpty () #endif //DP #endif /* __SERIALSWITCH_C__ */ #endif /* __MONITOR__ */ #undef C_EXTERN #endif /* __SERIALSWITCH_H__ */