view src/cs/riviera/rvf/rvf_api.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

/****************************************************************************/
/*                                                                          */
/*  Name        rvf_api.h                                                       */
/*                                                                          */
/*  Function    this file contains rvf public definitions.                  */
/*                                                                          */
/*  Version		0.1															*/
/*																			*/
/* 	Date       	Modification												*/
/*  ------------------------------------									*/
/*  3/12/99		Create														*/
/*	11/15/99	remove useless functions,									*/
/*				change tasks priority and time_slicing						*/
/*	11/15/1999	compliant to RV coding guidelines							*/
/*  12/23/1999	change buffer management, add memory bank handling			*/
/*																			*/
/*	Author		David Lamy-Charrier (dlamy@tif.ti.com)						*/
/*																			*/
/* (C) Copyright 1999 by Texas Instruments Incorporated, All Rights Reserved*/
/****************************************************************************/

#ifndef _RVF_API_H
#define _RVF_API_H

#include "rv/general.h"
#include "rv/rv_general.h"
#include "rvf/rvf_target.h"

#ifndef _WINDOWS
  #include "config/swconfig.cfg"
#endif

#ifdef __cplusplus
extern "C" {
#endif


/* macros used to trace messages */

// WCP patch: default config is no RV trace for WCP
#if (OP_WCP == 0)
  #define DEBUG_ENABLE 1
#endif


#ifndef DEBUG_ENABLE 
#define rvf_send_trace 
#else 
void rvf_send_trace1(char * msg, UINT8 msg_length, UINT32 val, UINT8 trace_level, UINT32 swe_use_id);
#define rvf_send_trace rvf_send_trace1
#endif 	

#define T_RVF_GD_ID UINT8

/* return parameters definition */
typedef T_RV_RET T_RVF_RET;

#define	RVF_OK					RV_OK				
#define	RVF_NOT_SUPPORTED		RV_NOT_SUPPORTED		
#define	RVF_NOT_READY			RV_NOT_READY			
#define	RVF_MEMORY_ERR			RV_MEMORY_ERR			
#define	RVF_INTERNAL_ERR		RV_INTERNAL_ERR		
#define	RVF_INVALID_PARAMETER	RV_INVALID_PARAMETER	

/* memeory bank state definition */
typedef enum{
	RVF_GREEN,
	RVF_YELLOW,
	RVF_RED
}T_RVF_MB_STATUS;

/* task state */
typedef enum { SUSPEND, RUNNING} T_RVF_TASK_STATE;

/************************************************************************
** Mailbox definitions. Each task has 4 mailboxes that are used to
** send buffers to the task.
*/
#define RVF_TASK_MBOX_0    0
#define RVF_TASK_MBOX_1    1
#define RVF_TASK_MBOX_2    2
#define RVF_TASK_MBOX_3    3

#define RVF_NUM_TASK_MBOX  4

#define RVF_TASK_MBOX_0_EVT_MASK   0x0001
#define RVF_TASK_MBOX_1_EVT_MASK   0x0002
#define RVF_TASK_MBOX_2_EVT_MASK   0x0004
#define RVF_TASK_MBOX_3_EVT_MASK   0x0008

/************************************************************************
** Event definitions.
**
** There are 4 reserved events used to signal messages rcvd in task mailboxes.
** There are 4 reserved events used to signal timeout events.
** There are 8 general purpose events available for applications.
*/
#define RVF_MAX_EVENTS	          16

#define RVF_NUM_TASK_TIMERS     4

#define RVF_TIMER_0             0
#define RVF_TIMER_1             1
#define RVF_TIMER_2             2
#define RVF_TIMER_3             3

#define RVF_TIMER_0_EVT_MASK    0x0010
#define RVF_TIMER_1_EVT_MASK    0x0020
#define RVF_TIMER_2_EVT_MASK    0x0040
#define RVF_TIMER_3_EVT_MASK    0x0080

#define RVF_APPL_EVT_0          8
#define RVF_APPL_EVT_1          9
#define RVF_APPL_EVT_2          10
#define RVF_APPL_EVT_3          11
#define RVF_APPL_EVT_4          12
#define RVF_APPL_EVT_5          13
#define RVF_APPL_EVT_6          14
#define RVF_APPL_EVT_7          15

#define EVENT_MASK(evt)	   ((UINT16)0x0001 << evt)

#define MAX_HOSTING_TASKS	10
#define MAX_PARASITES		10


/* define memory bank related types */
typedef UINT16 T_RVF_MB_ID;
//typedef UINT8 T_RVF_MB_NAME[RVF_MAX_MB_LEN];
typedef char T_RVF_MB_NAME[RVF_MAX_MB_LEN];
#define T_RVF_BUFFER void 
typedef void (*CALLBACK_FUNC)(void *);
typedef void (*MB_CALLBACK_FUNC)(T_RVF_MB_ID);

typedef struct{
	UINT32 size;
	UINT32 watermark;
} T_RVF_MB_PARAM;



/* Define a timer list entry
*/
typedef struct _tle
{
	T_RV_HDR	  hdr;
	struct _tle  *p_next;
	struct _tle  *p_prev;
	UINT32        ticks;
	UINT16        event;			/* event & param must be revised possibily       */
	UINT32        param;			/* sub struct pointed to by p_data if required   */
	UINT32		  t_init;
	void*		  p_data;
} T_RVF_TIMER_LIST_ENT;

typedef T_RVF_TIMER_LIST_ENT*	P_NODE;

/* Define a timer list queue          ?? QUEUE or LIST ??
*/
typedef struct 
{
    T_RVF_TIMER_LIST_ENT   *p_first;
    T_RVF_TIMER_LIST_ENT   *p_last;
    UINT32           last_ticks;
	UINT16			 timerCnt;
} T_RVF_TIMER_LIST_Q;


/***********************************************************************
** This queue is a general purpose buffer queue, for application use.
*/
typedef struct 
{   void    *p_first;
    void    *p_last;
    UINT16  count;
} T_RVF_BUFFER_Q;

#define RVF_IS_QUEUE_EMPTY(p_q) (p_q.count == 0)

/*******************************************************
* Message parameter of "handle_timer()"  
********************************************************/
#define T_RVF_TIMER_ID		UINT32 

typedef struct {
	T_RV_HDR				hdr;
	T_RVF_TIMER_ID			tm_id;
	UINT8					cont;
	void*					action;
} T_RVF_TMS_MSG;

/* define a mutex structure */
typedef struct
{	UINT32	words[11];
}T_RVF_MUTEX;

/***********************************************************************
** Define the basic message header that RVF expects on all inter-computer
** communications. Applications should use this in their own definitions
** and add on their own message contents.
*/
/*typedef struct {
	UINT16  prim;  // Message Type 
	UINT16  len;   // Message Length (including header) 
} msg_hdr_t;

typedef struct {
	msg_hdr_t  hdr;
	UINT8      data[1];
} msg_type1;
*/

/* Task constants
*/
#ifndef TASKPTR
typedef void (*TASKPTR)(UINT32);
#endif


#define RVF_INVALID_TASK (0xFF)
#define RVF_INVALID_MB_ID		(0xFFFF)
#define RVF_INVALID_MAILBOX (0xFF)
#define RVF_INVALID_ADDR_ID	(0xFF)

/* Define the value that create pool will return if it fails
*/


/************************************************************************/
/* Function prototypes													*/


/* Task management*/
void			rvf_init(void);
T_RVF_RET		rvf_create_legacy_task (TASKPTR task_entry, UINT8 task_id, char *taskname, UINT8 *stack, UINT16 stacksize, UINT8 priority, UINT8 time_slicing, T_RVF_TASK_STATE is_suspend) ;
T_RVF_RET		rvf_create_task (TASKPTR task_entry, T_RVF_G_ADDR_ID task_id, char *taskname, UINT8 *stack, UINT16 stacksize, UINT8 priority, UINT8 tcode, UINT8 time_slicing, T_RVF_TASK_STATE is_suspend);
T_RVF_RET		rvf_resume_task( T_RVF_G_ADDR_ID taskid);
void			rvf_exit_task(T_RVF_G_ADDR_ID vtask);
T_RVF_RET		rvf_suspend_task(T_RVF_G_ADDR_ID vtask);
T_RVF_G_ADDR_ID	rvf_get_taskid(void);
char *			rvf_get_taskname(void);
T_RVF_G_ADDR_ID rvf_get_context();

/* Message Handling */
typedef T_RV_HDR T_RVF_MSG ;
typedef UINT32	  T_RVF_MSG_ID;

T_RVF_RET		rvf_send_msg			(T_RVF_G_ADDR_ID addr_id, void * p_msg);
T_RVF_MB_STATUS rvf_get_msg_buf			(T_RVF_MB_ID mb_id,
											UINT32 message_size,
											T_RVF_MSG_ID msg_id,
											T_RVF_MSG ** pp_msg);
T_RVF_RET		rvf_free_msg			(T_RVF_MSG * p_msg);
T_RVF_RET		rvf_free_timer_msg		(T_RVF_MSG *p_msg);



/* To send buffers and events between tasks*/
void *			rvf_read_mbox  (UINT8 mbox);
void *			rvf_read_addr_mbox (T_RVF_G_ADDR_ID  task_id, UINT8 mbox);
UINT8			rvf_send_event (T_RVF_G_ADDR_ID task_id, UINT16 event);

/* task synchronization */
T_RVF_RET		rvf_initialize_mutex( T_RVF_MUTEX * mutex);
T_RVF_RET		rvf_lock_mutex( T_RVF_MUTEX * mutex);
T_RVF_RET		rvf_unlock_mutex( T_RVF_MUTEX * mutex);
T_RVF_RET		rvf_delete_mutex( T_RVF_MUTEX * mutex);


/* To manage memory */
T_RVF_RET		rvf_create_mb(T_RVF_MB_NAME mb_name, T_RVF_MB_PARAM mb_param, T_RVF_MB_ID *mb_id);
T_RVF_RET		rvf_delete_mb(T_RVF_MB_NAME mb_name);
T_RVF_RET		rvf_get_mb_id(T_RVF_MB_NAME mb_name, T_RVF_MB_ID *mb_id);
T_RVF_MB_STATUS	rvf_get_mb_status(T_RVF_MB_ID mb_id);
T_RVF_RET		rvf_mb_is_used(T_RVF_MB_NAME mb_name, UINT8* isUsed) ;

T_RVF_MB_STATUS	rvf_get_buf(T_RVF_MB_ID mb_id, UINT32 buffer_size, T_RVF_BUFFER** p_buffer);
T_RVF_MB_STATUS	rvf_count_buf(T_RVF_MB_ID mb_id, T_RVF_BUFFER * p_buffer);
T_RVF_RET		rvf_free_buf( T_RVF_BUFFER * p_buffer);
T_RVF_RET		rvf_set_callback_func(T_RVF_MB_ID mb_id, MB_CALLBACK_FUNC func);
T_RVF_RET		rvf_change_callback_func(T_RVF_MB_ID mb_id, MB_CALLBACK_FUNC func);

void rvf_get_protected_buf(T_RVF_MB_ID mb_id, UINT32 buffer_size, T_RVF_BUFFER** p_buffer);
  

UINT32			rvf_get_buf_size (void *bptr);
				/* get the parameters of a specific memory bank */
T_RVF_RET		rvf_get_mb_param( T_RVF_MB_NAME mb_name, T_RVF_MB_PARAM * param);
				/* change the parameters of a specific memory bank */
T_RVF_RET		rvf_set_mb_param( T_RVF_MB_NAME mb_name, T_RVF_MB_PARAM * param);


/* User buffer queue management*/
T_RVF_RET		rvf_enqueue (T_RVF_BUFFER_Q *p_q, void *p_buf);
T_RVF_RET		rvf_enqueue_head (T_RVF_BUFFER_Q *p_q, void *p_buf);
void *			rvf_dequeue  (T_RVF_BUFFER_Q *p_q);
T_RVF_BUFFER *	rvf_scan_next (T_RVF_BUFFER_Q * p_q, T_RVF_BUFFER * p_buf);
T_RVF_RET		rvf_remove_from_queue (T_RVF_BUFFER_Q * p_q, T_RVF_BUFFER * p_buf);

/* Timer management*/

UINT16			rvf_wait(UINT16 flag, UINT32 ticks);
UINT16			rvf_evt_wait(T_RVF_G_ADDR_ID rtask, UINT16 flag, UINT32 timeout) ;
void			rvf_delay(UINT32 ticks);

void			rvf_start_timer(UINT8 tnum, UINT32 ticks, BOOLEAN is_continuous);
void			rvf_stop_timer (UINT8 tnum);
char *			rvf_get_time_stamp(char *tbuf);
UINT32			rvf_get_tick_count(void);
void			rvf_init_timer_list (T_RVF_TIMER_LIST_Q *p_timer_listq);
void			rvf_init_timer_list_entry (T_RVF_TIMER_LIST_ENT  *p_tle);
UINT16			rvf_update_timer_list (T_RVF_TIMER_LIST_Q *p_timer_listq);
void			rvf_add_to_timer_list (T_RVF_TIMER_LIST_Q *p_timer_listq, T_RVF_TIMER_LIST_ENT  *p_tle);
void			rvf_remove_from_timer_list (T_RVF_TIMER_LIST_Q *p_timer_listq, T_RVF_TIMER_LIST_ENT  *p_tle);
T_RVF_TIMER_LIST_ENT*	rvf_get_expired_entry (T_RVF_TIMER_LIST_Q *p_timer_listq);


#define T_RV_TM_ID	UINT32

/*************************************************************************/
/* :)  USER FRIENDLY TIMER MANAGEMENT API consisting of add, delete and modify timer */
/*************************************************************************/
/* Returns 0 on failure */
T_RVF_TIMER_ID	rvf_create_timer(	T_RVF_G_ADDR_ID			g_addrId,
									UINT32					timerDuration,
									BOOLEAN					isContinuous,
									void*					p_action);

void			rvf_del_timer	(	T_RV_TM_ID tm_id) ;

void			rvf_reset_timer	(	T_RV_TM_ID tm_id, UINT32 new_duration,
									BOOLEAN isContinuous);


/* Disable Interrupts, Enable Interrupts*/
void			rvf_enable(void);
void			rvf_disable(UINT8 who);

/* Trace for debug purposes*/
void rvf_dump_mem();
void rvf_dump_tasks();
void rvf_dump_pool();

/* specific function */
T_RVF_BUFFER * rvf_wait_for_specific_msg(UINT16 msg_code, UINT8 mbox, UINT32 timeout);

/* Trace definitions */
#define NULL_PARAM 4294967295 /* this value will not be displayed in rvf_send_trace function */
#define TRACE_MB_ID		(RVF_MAX_REAL_MB -1)

#ifdef __cplusplus
}
#endif

#endif	/* _RVF_API_H */