view src/g23m-fad/fad/fad.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 fa8dc04885d8
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :  GSM-F&D (8411)
|  Modul   :  FAD
+-----------------------------------------------------------------------------
|  Copyright 2002 Texas Instruments Berlin, AG
|                 All rights reserved.
|
|                 This file is confidential and a trade secret of Texas
|                 Instruments Berlin, AG
|                 The receipt of or possession of this file does not convey
|                 any rights to reproduce or disclose its contents or to
|                 manufacture, use, or sell anything it may describe, in
|                 whole, or in part, without the specific written consent of
|                 Texas Instruments Berlin, AG.
+-----------------------------------------------------------------------------
|  Purpose :  Definitions for the Protocol Stack Entity
|             Fax Adaptation 3.45
+-----------------------------------------------------------------------------
*/


#ifndef FAD_H
#define FAD_H

#include "cl_ribu.h"

/*
 * Macros
 */

#undef  TRACE_FAD_DL_TCF

#define  TRACE_FAD_DL_STATUS
#define  TRACE_FAD_UL_STATUS

#ifndef _SIMULATION_        /* keeps testcases passing */
#define BMI_TCF_WORKAROUND
#endif

#ifndef NTRACE

/* for trace purposes */

#define SERVICE_NAME_KER    "KER"
#define SERVICE_NAME_RCV    "RCV"
#define SERVICE_NAME_RCVSUB "RCVSUB"
#define SERVICE_NAME_SND    "SND"
#define SERVICE_NAME_SNDSUB "SNDSUB"

#endif

#define KER     ker.
#define RCV     rcv.
#define RCVSUB  rcv.sub.
#define SND     snd.
#define SNDSUB  snd.sub.

#define SHARED_FAX_DATA_RAM

/*
 * instance management
 */

#define GET_INSTANCE(p) &fad_data_base[0]

/*
 * Constants
 */

/*
 * global unchangeable constants
 */
#define SBM_MAX_PRIMS   10  /* max numbers of prims in SBM   */
#define FRAME_SIZE       8  /* num of data bytes in fad frame */
#define MAX_NEW_FRAMES   9  /* number of 64 bit frames
                               which can be received
                               in one ra_data_ind primitive */

#define MAX_SDU_SIZE (MAX_NEW_FRAMES * FRAME_SIZE)

/*==== TYPES ======================================================*/

/*
 * Constants
 */

/*
 * Bitoffset for encoding/decoding
 */
#define ENCODE_OFFSET        0

/*
 * Dynamic Configuration Numbers
 */

/*
 * States of the entity process KERNEL
 */
#define KER_NULL             0
#define IDLE                 1
#define BCS_REC              2
#define BCS_TRA              3
#define MSG_REC_TCF          4
#define MSG_REC              5
#define MSG_TRA_TCF          6
#define MSG_TRA              7

/*
 * States of the entity process SND
 */
#define SYNC_SND             0
#define PREAM_SND            1
#define TCF_SND              2
#define TRAIN_SND            3
#define TRAIN_CNF_SND        4
#define BCS_SND              5
#define MSG_SND              6

/*
 * States of the entity process RCV
 */
#define SYNC_RCV             0
#define PREAM_RCV            1
#define TCF_RCV              2
#define TRAIN_RCV            3
#define BCS_RCV              4
#define MSG_RCV              5

/* substates */
#define SUB_IDLE             0
#define SUB_PREAMBLE         1
#define SUB_TCF              2
#define SUB_POST_TCF         3
#define SUB_DATA             4

/*
 * FAD Constants
 */

/* shared */

/* phase identifiers */
#define IDENT_BCS_REC   0x11
#define IDENT_MSG_REC   0x33
#define IDENT_MSG_TRA   0x44

/* Layer 1 TI frame */
#define L1_TI_LEN             40

/* RCV specific */

#ifdef _TARGET_
#define FAD_DESCBUF_LEN        8
#endif

#define BCS_TOLERANCE         70    /* 70% tolerance for correct BCS data */
#define TRAIN_TOLERANCE       50

/* SND specific */

/* Frame formats */

#define FR_SEQ_SYNC           "\x3E\x37\x50\x96\xC1\xC8\xAF\x69"
#define FR_SEQ_PREAMBLE       "\x11\x7E"    /* BCS-REC + preamble */
#define FR_SEQ_TRAIN_SND      "\x33\x0F"    /* MSG-REC + STATUS   */
#define FR_SEQ_TRAIN_RCV      "\x44\x0F"    /* MSG-TRA + STATUS   */
#define FR_SEQ_TCF            "\x00\x00\x00\x00\x00\x00\x00\x00"

#define VAL_TCF               0x00
#define HDLC_FLAG             0x7E
#define VAL_TRAIN             0x0F

/* length in bytes */
#define LEN_SEQ_SYNC          FRAME_SIZE
#define LEN_SEQ_PREAMBLE      2
#define LEN_SEQ_TCF           FRAME_SIZE
#define LEN_SEQ_TRAIN         2

#define SYNC_CYCLE_NONE       0
#define SYNC_CYCLE_7200       4
#define SYNC_CYCLE_12000      6

#define SYNC_RESET                  3

#define REPEAT_FOREVER        0xFFFF    /* bytes remaining - SYNC */

#define PREAMBLE_BYTES_TI_EXP   30      /* = 400 ms (give some extra tolerance to required 850 ms) */
#define PREAMBLE_BYTES_TI_SND   74      /* = 1 sec   */

#define TIME_AWAIT_TCF          75      /*   75 millisec. */
#define TIME_TCF_SND          1500      /* 1500 millisec. */
#define TIME_TCF_RCV          1350      /* 1500 millisec. - 10% */

#ifdef _SIMULATION_
#define TIME_THRESHOLD        5000      /* 5-sec. MSG buffer - T.32, §7.4 */
#else
#define TIME_THRESHOLD_TI     1000
#endif

#define MAX_SND_FRAMES        3
#define SND_FRAME_LEN         FRAME_SIZE   /* 11.01.99/DL: 24 -> 8 */
#define RCV_FRAME_LEN         24
#define HDLC_LEN              (RCV_FRAME_LEN * 12)
#define BCS_BUF_LEN           (SND_FRAME_LEN * MAX_SND_FRAMES * 16) /* 336 */

#ifdef _SIMULATION_
#define BCS_RATE              300
#define HDLC_REPEAT           8
#endif

/* frame types - FAD internal */
#define FT_PREAMBLE          0x06
#define FT_TRAIN_RESPONSE    0x07
#define FT_NONE              0x0F

/*==== TYPES ======================================================*/

/*
 * entity global data
 */

/*
 * send buffer management
 */
#define SBM_PRIMBUF_SIZE  (SBM_MAX_PRIMS+1)

typedef T_FAD_DATA_REQ  T_SBM_PRIM;
typedef UBYTE           T_SBM_PRIM_INDEX;

typedef struct
{
  T_SBM_PRIM *Prim;
} T_SBM_PRIMSLOT;

/*
 * receive buffer management
 */
#define RBM_PQ_MAX_PRIM   10
#define RBM_PQ_SIZE       (RBM_PQ_MAX_PRIM+1)

typedef T_FAD_DATA_IND    T_RBM_PRIM;

/*
 * data for send buffer management
 */

typedef struct
{
  USHORT           syncCycle;
  USHORT           framesUntilSync;
  USHORT           CurrPrimOff;
  USHORT           CurrPrimLen;
  USHORT           FrameSize;
  UBYTE            frames[MAX_SDU_SIZE];
  T_RIBU ribu;
  T_SBM_PRIMSLOT   Prim[SBM_PRIMBUF_SIZE];
  T_SBM_PRIM_INDEX PA;
} T_SBM;

/*
 * data for receive buffer management
 */

#define DL_RIBU_DEPTH 4

typedef struct
{
  BOOL          Initialised;
  USHORT        FramesPerPrim;
  USHORT        FramesInCurrPrim;
  T_RIBU_FD    *ribu;
  T_RBM_PRIM   *CurrPrim;
  T_RIBU        PQ;
  T_RBM_PRIM   *PQ_Array[RBM_PQ_SIZE];
} T_RBM_FAD;

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif
  BOOL forward_data;
} T_KER;

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif
} T_STATE;

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif
  T_STATE sub; /* substate */

  UBYTE   reset;
  BOOL    send_status;
  BOOL    send_ready_to_t30;
  BOOL    final;
  UBYTE   seq_buf [BCS_BUF_LEN];
  UBYTE   ul_FD_align[L1_TI_LEN];

  USHORT  ra_req_frames;
  USHORT  seq_buflen;
  USHORT  seq_bufpos;
  USHORT  bytes_to_send;
  USHORT  threshold;    /* T.32: 5-sec. buffer */
  USHORT  data_to_send;
  USHORT  data_bufpos;
  USHORT  frames_per_prim;
  USHORT  trans_rate;

  T_FD FD;
  U8 FD_buf[BCS_BUF_LEN];
  
  T_FAD_DATA_REQ *fad_data_req;
#ifdef _TARGET_
  T_RA_DATA_REQ ra_data_req;
#endif
} T_SND;

#define FLAGFOUND_MIN 5

typedef struct
{
  UBYTE state;
#ifndef NTRACE
  char *name;
  char *state_name;
#endif
  T_STATE sub; /* substate */

  BOOL    train_flg;
  BOOL    prim_ready;
  BOOL    data_incoming;
  BOOL    t30_req_frames;
  BOOL    data_in_rbm;
  BOOL    preamble_pending;
  BOOL    bcs_pending;
  UBYTE   bcs_data_len;
  UBYTE   hdlc [HDLC_LEN];

  UBYTE   FlagFound;  /* HDLC flag in preamble found */
  UBYTE   AlignShift; /* shift of HDLC flag in received RA_DATA_IND */
  USHORT  AlignWord;

  USHORT  bytes_good;
  USHORT  bytes_expect;
  USHORT  bytes_rcvd;
  USHORT  hdlc_len;
  USHORT  data_bufpos;
} T_RCV;

typedef struct
{
  T_KER  ker;
  T_SND  snd;
  T_RCV  rcv;
  T_SBM  sbm;
  T_RBM_FAD  rbm;
} T_FAD_DATA;

/*
 *  SBM, RBM: constants, type defs
 */
#define ENTITY_DATA fad_data

/*==== EXPORT =====================================================*/
/*
 * instance data base
 */

#ifdef FAD_PEI_C
GLOBAL T_FAD_DATA *fad_data;
#else
EXTERN T_FAD_DATA *fad_data;
#endif

#ifdef SHARED_FAX_DATA_RAM

  /*lint -e526 : not defined */
  EXTERN UBYTE l2r_data_base[];
  EXTERN ULONG l2r_data_magic_num;

  #define fad_data_base ((T_FAD_DATA*)l2r_data_base)

  #define fad_data_magic_num l2r_data_magic_num

#else /* !SHARED_FAX_DATA_RAM */

  #ifdef FAD_PEI_C
  GLOBAL T_FAD_DATA fad_data_base[1];
  GLOBAL ULONG fad_data_magic_num;
  #else
  EXTERN T_FAD_DATA fad_data_base[];
  EXTERN ULONG fad_data_magic_num;
  #endif

#endif /* !SHARED_FAX_DATA_RAM */

#define FAD_DATA_MAGIC_NUM (('F'<<24) + ('A'<<16) + ('D'<<8))   /* "FAD",NUL */

/*
 *  Prototypes
 *
 *  FAD KERNEL
 *
 *  KERNEL primitive processing
 */

#ifdef USE_L1FD_FUNC_INTERFACE
  EXTERN void l1i_ra_detect_req(T_RA_DETECT_REQ *ra_detect_req);
#endif

#ifdef OPTION_MULTITHREAD
  #define ker_fad_activate_req   _ENTITY_PREFIXED(ker_fad_activate_req)
  #define ker_fad_deactivate_req _ENTITY_PREFIXED(ker_fad_deactivate_req)
  #define ker_fad_modify_req     _ENTITY_PREFIXED(ker_fad_modify_req)
  #define ker_fad_data_req       _ENTITY_PREFIXED(ker_fad_data_req)
  #define ker_fad_snd_tcf_req    _ENTITY_PREFIXED(ker_fad_snd_tcf_req)
  #define ker_fad_rcv_tcf_req    _ENTITY_PREFIXED(ker_fad_rcv_tcf_req)
  #define ker_fad_ready_req      _ENTITY_PREFIXED(ker_fad_ready_req)
  #define ker_fad_ignore_req     _ENTITY_PREFIXED(ker_fad_ignore_req)
#endif

EXTERN void ker_fad_activate_req   (T_FAD_ACTIVATE_REQ   *fad_activate_req);
EXTERN void ker_fad_deactivate_req (T_FAD_DEACTIVATE_REQ *fad_deactivate_req);
EXTERN void ker_fad_modify_req     (T_FAD_MODIFY_REQ     *fad_modify_req);
EXTERN void ker_fad_data_req       (T_FAD_DATA_REQ       *fad_data_req);
EXTERN void ker_fad_snd_tcf_req    (T_FAD_SND_TCF_REQ    *fad_snd_tcf_req);
EXTERN void ker_fad_rcv_tcf_req    (T_FAD_RCV_TCF_REQ    *fad_rcv_tcf_req);
EXTERN void ker_fad_ready_req      (T_FAD_READY_REQ      *fad_ready_req);
EXTERN void ker_fad_ignore_req     (T_FAD_IGNORE_REQ     *fad_ignore_req);

/*
 *  KERNEL signal processing
 */

/*
 *  KERNEL procedures
 */

#ifdef OPTION_MULTITHREAD
  #define ker_init           _ENTITY_PREFIXED(ker_init)
  #define ker_SetError       _ENTITY_PREFIXED(ker_SetError)
#endif

EXTERN void ker_init         (void);
EXTERN void ker_SetError     (USHORT cause);

/*
 *  FAD RCV
 *
 *  RCV primitive processing
 */

#ifdef OPTION_MULTITHREAD
  #define rcv_ra_data_ind         _ENTITY_PREFIXED(rcv_ra_data_ind)

#endif

EXTERN void rcv_ra_data_ind      (T_RA_DATA_IND *ra_data_ind);

/*
 *  RCV signal processing
 */
#ifdef OPTION_MULTITHREAD
/* KER -> RCV */
  #define sig_ker_rcv_await_tcf_req _ENTITY_PREFIXED(sig_ker_rcv_await_tcf_req)
  #define sig_ker_rcv_ready_req     _ENTITY_PREFIXED(sig_ker_rcv_ready_req)
  #define sig_ker_rcv_reset_req     _ENTITY_PREFIXED(sig_ker_rcv_reset_req)
/* RCV -> KER */
  #define sig_rcv_ker_preamble_ind  _ENTITY_PREFIXED(sig_rcv_ker_preamble_ind)
  #define sig_rcv_ker_tcf_ind       _ENTITY_PREFIXED(sig_rcv_ker_tcf_ind)
  #define sig_rcv_ker_train_ind     _ENTITY_PREFIXED(sig_rcv_ker_train_ind)
  #define sig_rcv_ker_train_end_ind _ENTITY_PREFIXED(sig_rcv_ker_train_end_ind)
  #define sig_rcv_ker_bcs_ind       _ENTITY_PREFIXED(sig_rcv_ker_bcs_ind)
  #define sig_rcv_ker_msg_ind       _ENTITY_PREFIXED(sig_rcv_ker_msg_ind)
  #define sig_rcv_ker_status_ind    _ENTITY_PREFIXED(sig_rcv_ker_status_ind)
  #define sig_rcv_ker_error_ind     _ENTITY_PREFIXED(sig_rcv_ker_error_ind)
#endif

EXTERN void sig_ker_rcv_await_tcf_req  (void);
EXTERN void sig_ker_rcv_ready_req      (void);
EXTERN void sig_ker_rcv_reset_req      (void);

EXTERN void sig_rcv_ker_preamble_ind   (void);
EXTERN void sig_rcv_ker_tcf_ind        (void);
EXTERN void sig_rcv_ker_train_ind      (void);
EXTERN void sig_rcv_ker_train_end_ind  (void);
EXTERN void sig_rcv_ker_bcs_ind        (UBYTE *hdlc, USHORT hdlc_len);
EXTERN void sig_rcv_ker_msg_ind        (T_FAD_DATA_IND *fad_data_ind);
EXTERN void sig_rcv_ker_status_ind     (void);
EXTERN void sig_rcv_ker_error_ind      (USHORT cause);

/*
 *  RCV procedures
 */

#ifdef OPTION_MULTITHREAD
  #define rcv_init                  _ENTITY_PREFIXED(rcv_init)
  #define rcv_ResetFormatter        _ENTITY_PREFIXED(rcv_ResetFormatter)
  #define rcv_FrameType             _ENTITY_PREFIXED(rcv_FrameType)
  #define rcv_SetHdlcFrame          _ENTITY_PREFIXED(rcv_SetHdlcFrame)
  #define rcv_SetErrorRatio         _ENTITY_PREFIXED(rcv_SetErrorRatio)
  #define rcv_GetMsgData            _ENTITY_PREFIXED(rcv_GetMsgData)
  #define rcv_SetFinalBuffer        _ENTITY_PREFIXED(rcv_SetFinalBuffer)
#endif

EXTERN void rcv_init                (void);
EXTERN void rcv_ResetFormatter      (void);
EXTERN UBYTE rcv_FrameType          (T_FD *pFD);
EXTERN void rcv_SetHdlcFrame        (T_FD *pFD, UBYTE *hdlc_data, USHORT *hdlc_len);
EXTERN void rcv_SetErrorRatio       (T_FD *pFD);

EXTERN BOOL rcv_StoreMsgData        (T_FD *pFD, BOOL *primAvail);

EXTERN BOOL rcv_GetMsgData          (T_FAD_DATA_IND **fad_data_ind, BOOL data_incoming);
EXTERN void rcv_SetFinalBuffer      (void);

#ifdef _TARGET_
EXTERN void l1i_ra_detect_req(T_RA_DETECT_REQ *ra_detect_req);
#endif

/*
 *  FAD SND
 *
 *  SND primitive processing
 */

#ifdef OPTION_MULTITHREAD
  #define snd_ra_ready_ind          _ENTITY_PREFIXED(snd_ra_ready_ind)
#endif

EXTERN void snd_ra_ready_ind  (T_RA_READY_IND *ra_ready_ind);

/*
 *  SND signal processing
 */
#ifdef OPTION_MULTITHREAD
/* KER -> SND */
  #define sig_ker_snd_activate_req      _ENTITY_PREFIXED(sig_ker_snd_activate_req)
  #define sig_ker_snd_sync_req         _ENTITY_PREFIXED(sig_ker_snd_sync_req)
  #define sig_ker_snd_train_req        _ENTITY_PREFIXED(sig_ker_snd_train_req)
  #define sig_ker_snd_tcf_req          _ENTITY_PREFIXED(sig_ker_snd_tcf_req)
  #define sig_ker_snd_preamble_req     _ENTITY_PREFIXED(sig_ker_snd_preamble_req)
  #define sig_ker_snd_bcs_req          _ENTITY_PREFIXED(sig_ker_snd_bcs_req)
  #define sig_ker_snd_status_req       _ENTITY_PREFIXED(sig_ker_snd_status_req)
/* SND -> KER */
  #define sig_snd_ker_ready_ind        _ENTITY_PREFIXED(sig_snd_ker_ready_ind)
  #define sig_snd_ker_data_sent_ind    _ENTITY_PREFIXED(sig_snd_ker_data_sent_ind)
#endif

EXTERN void sig_ker_snd_activate_req   (T_FAD_ACTIVATE_REQ *fad_activate_req);
EXTERN void sig_ker_snd_sync_req       (BOOL reset);
EXTERN void sig_ker_snd_train_req      (T_FAD_DATA_REQ *fad_data_req,
                                        BOOL send_fax);
EXTERN void sig_ker_snd_tcf_req        (void);
EXTERN void sig_ker_snd_preamble_req   (T_FAD_DATA_REQ *fad_data_req);
EXTERN void sig_ker_snd_bcs_req        (T_FAD_DATA_REQ *fad_data_req);
EXTERN void sig_ker_snd_status_req     (void);
EXTERN void sig_ker_snd_msg_req        (T_FAD_DATA_REQ *fad_data_req);

EXTERN void sig_snd_ker_ready_ind      (void);
EXTERN void sig_snd_ker_data_sent_ind  (void);

/*
 *  SND procedures
 */

#ifdef OPTION_MULTITHREAD
  #define snd_init                  _ENTITY_PREFIXED(snd_init)
  #define snd_SendReset             _ENTITY_PREFIXED(snd_SendReset)
  #define snd_SetSequence           _ENTITY_PREFIXED(snd_SetSequence)
  #define snd_SendSequence          _ENTITY_PREFIXED(snd_SendSequence)
  #define snd_DurationToBytes       _ENTITY_PREFIXED(snd_DurationToBytes)
  #define snd_BuildStatusFrames     _ENTITY_PREFIXED(snd_BuildStatusFrames)
  #define snd_StoreMsgData          _ENTITY_PREFIXED(snd_StoreMsgData)
  #define snd_SendMsgData           _ENTITY_PREFIXED(snd_SendMsgData)
  #define snd_SendBcsData           _ENTITY_PREFIXED(snd_SendBcsData)
#endif

EXTERN void snd_init                (void);
GLOBAL void snd_SendReset           (USHORT bytes_to_send);
EXTERN void snd_SetSequence         (UBYTE *seq_buf, USHORT *seq_buflen,
                                     UBYTE *sequence, USHORT seq_len,
                                     USHORT repeat);
EXTERN USHORT snd_SendSequence      (USHORT bytes_to_send, UBYTE fr_type);
EXTERN USHORT snd_DurationToBytes   (USHORT trans_rate, USHORT duration);

#ifdef _SIMULATION_
EXTERN void snd_BuildStatusFrames(T_FAD_DATA_REQ *fad_data_req, USHORT max_bytes);
#else
EXTERN void snd_BuildStatusFrames(T_FAD_DATA_REQ *fad_data_req);
#endif

EXTERN void snd_StoreMsgData        (T_FAD_DATA_REQ *fad_data_req);
EXTERN BOOL snd_SendMsgData         (UBYTE req_frames);

#ifdef _SIMULATION_
EXTERN void snd_SendBcsData (USHORT bytes_to_send);
#else
EXTERN void snd_SendBcsData (void);
#endif

/* SBM_RBM_BEGIN */
/*
 * Send Buffer Management SBM
 */
#ifdef OPTION_MULTITHREAD
  #define sbm_init                  _ENTITY_PREFIXED(sbm_init)
  #define sbm_store_prim            _ENTITY_PREFIXED(sbm_store_prim)
  #define sbm_get_frame             _ENTITY_PREFIXED(sbm_get_frame)
  #define sbm_free_empty_prims      _ENTITY_PREFIXED(sbm_free_empty_prims)
#endif

EXTERN void sbm_init       (USHORT frameSize);
EXTERN void sbm_store_prim (T_SBM_PRIM *sendPrim);
EXTERN BOOL sbm_get_frame  (T_FRAME_DESC *frameDesc, UBYTE reqFrames);
EXTERN void sbm_free_empty_prims (void);

/*
 * Receive Buffer Management RBM
 */

#ifdef OPTION_MULTITHREAD
  #define rbm_init            _ENTITY_PREFIXED(rbm_init           )
  #define rbm_deinit          _ENTITY_PREFIXED(rbm_deinit         )
  #define rbm_reset           _ENTITY_PREFIXED(rbm_reset          )
  #define rbm_store_frames    _ENTITY_PREFIXED(rbm_store_frames   )
  #define rbm_get_prim        _ENTITY_PREFIXED(rbm_get_prim       )
  #define rbm_get_curr_prim   _ENTITY_PREFIXED(rbm_get_curr_prim  )
#endif

EXTERN void rbm_init(USHORT framesPerPrim);
EXTERN void rbm_deinit(BOOL final);
EXTERN void rbm_reset(void);

EXTERN BOOL rbm_store_frames(T_FD *pFDw, BOOL *primIsReady);

EXTERN T_RBM_PRIM *rbm_get_prim(void);
EXTERN T_RBM_PRIM *rbm_get_curr_prim(void);

/*
 * Communication handles
 */
#ifdef OPTION_MULTITHREAD
  #define hCommT30  _ENTITY_PREFIXED(hCommT30)
#ifdef _SIMULATION_
  #define hCommRA   _ENTITY_PREFIXED(hCommRA)
#endif
#endif

#ifdef FAD_PEI_C

GLOBAL T_HANDLE fad_handle;              /* own handle        */
GLOBAL T_HANDLE hCommT30 = VSI_ERROR;    /* T30 Communication */
#ifdef _SIMULATION_
GLOBAL T_HANDLE hCommRA  = VSI_ERROR;    /* RA  Communication */
#endif

#else

EXTERN T_HANDLE  fad_handle;             /* own handle         */
EXTERN T_HANDLE  hCommT30;               /* T30  Communication */
#ifdef _SIMULATION_
EXTERN T_HANDLE  hCommRA;                /* RA   Communication */
#endif

#endif

GLOBAL void fad_exec_timeout(USHORT index);

#define BYTE2HEXSTR(B, H) {UBYTE b, *a = (UBYTE*)(H);\
        b = (((UBYTE)(B)) >> 4) & 0x0F;\
        if (b > 9) b += 'A'-10; else b += '0'; *a = b;\
        b = ((UBYTE)(B)) & 0x0F;\
        if (b > 9) b += 'A'-10; else b += '0'; *(a+1) = b;}

#endif