488 lines
13 KiB
C
488 lines
13 KiB
C
/*******************************************************************************
|
|
** sdla_remora.h
|
|
**
|
|
** Author: Alex Feldman <al.feldman@sangoma.com>
|
|
**
|
|
** Copyright: (c) 2005 Sangoma Technologies Inc.
|
|
**
|
|
** This program is free software; you can redistribute it and/or
|
|
** modify it under the terms of the GNU General Public License
|
|
** as published by the Free Software Foundation; either version
|
|
** 2 of the License, or (at your option) any later version.
|
|
** ============================================================================
|
|
** Oct 6, 2005 Alex Feldman Initial version.
|
|
*******************************************************************************/
|
|
|
|
#ifndef __SDLA_REMORA_H
|
|
# define __SDLA_REMORA_H
|
|
|
|
#ifdef __SDLA_REMORA_SRC
|
|
# define WP_EXTERN
|
|
#else
|
|
# define WP_EXTERN extern
|
|
#endif
|
|
|
|
# include "aft_core_options.h"
|
|
# include "sdla_a600_remora.h"
|
|
# include "sdla_b800_remora.h"
|
|
# include "sdla_remora_proslic.h"
|
|
# include "wanpipe_events.h"
|
|
|
|
|
|
#define DBG_FALSE_RING1 0
|
|
#define DBG_FALSE_RING2 0
|
|
|
|
#if defined(__WINDOWS__)
|
|
# define DEBUG_FALSE_RING if(0)DbgPrint
|
|
#else
|
|
# define DEBUG_FALSE_RING if(0)DEBUG_EVENT
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
** DEFINES and MACROS
|
|
*******************************************************************************/
|
|
|
|
#define IS_FXOFXS_CARD(card) IS_FXOFXS_FEMEDIA(&(card)->fe)
|
|
|
|
#define IS_A200(fe) (((sdla_t*)(fe->card))->adptr_type == A200_ADPTR_ANALOG ||\
|
|
((sdla_t*)(fe->card))->adptr_type == A400_ADPTR_ANALOG)
|
|
|
|
#define IS_A200_CARD(card) (card->adptr_type == A200_ADPTR_ANALOG || \
|
|
card->adptr_type == A400_ADPTR_ANALOG)
|
|
|
|
#define IS_A700(fe) (((sdla_t*)(fe->card))->adptr_type == AFT_ADPTR_FLEXBRI)
|
|
#define IS_A700_CARD(card) (card->adptr_type == AFT_ADPTR_FLEXBRI)
|
|
|
|
#define WAN_RM_START_CHANNEL 1
|
|
|
|
#define MAX_REMORA_MODULES 24
|
|
#define MAX_FXOFXS_CHANNELS MAX_REMORA_MODULES
|
|
#define NUM_A700_ANALOG_PORTS 2
|
|
|
|
#define MOD_TYPE_NONE 0
|
|
#define MOD_TYPE_FXS 1
|
|
#define MOD_TYPE_FXO 2
|
|
#define MOD_TYPE_TEST 3
|
|
#define WP_REMORA_DECODE_TYPE(type) \
|
|
(type == MOD_TYPE_FXS) ? "FXS" : \
|
|
(type == MOD_TYPE_FXO) ? "FXO" : \
|
|
(type == MOD_TYPE_TEST) ? "TST" : \
|
|
"Unknown"
|
|
|
|
/* SPI interface */
|
|
#define MOD_CHAIN_DISABLED 0
|
|
#define MOD_CHAIN_ENABLED 1
|
|
|
|
#define A700_ANALOG_SPI_INTERFACE_REG 0x5C
|
|
#define A700_ANALOG_SPI_CS_FXS_CHIP_0 0XFD
|
|
#define A700_ANALOG_SPI_CS_FXS_CHIP_1 0XFE
|
|
#define A700_ANALOG_SPI_MOD_START_BIT (1<<31)
|
|
|
|
#define SPI_INTERFACE_REG 0x54
|
|
|
|
#define MOD_SPI_ADDR_FXS_READ 0x80
|
|
#define MOD_SPI_ADDR_FXS_WRITE 0x00
|
|
|
|
#define MOD_SPI_CS_FXS_CHIP_0 0x01
|
|
#define MOD_SPI_CS_FXS_CHIP_1 0x02
|
|
|
|
#define MOD_SPI_CS_FXO_CHIP_1 0x08
|
|
#define MOD_SPI_CS_FXO_WRITE 0x00
|
|
#define MOD_SPI_CS_FXO_READ 0x40
|
|
|
|
#define MOD_SPI_CTRL_V3_START 0x08 /* bit 27 used as START in version 1-2-3 */
|
|
#define MOD_SPI_CTRL_START 0x80
|
|
#define MOD_SPI_CTRL_FXS 0x10
|
|
#define MOD_SPI_CTRL_CHAIN 0x20
|
|
|
|
#define MOD_SPI_RESET 0x40000000
|
|
#define MOD_SPI_BUSY 0x80000000
|
|
#define MOD_SPI_V3_STAT 0x08000000 /* bit 27 used as START in version 1-2-3 */
|
|
#define MOD_SPI_START 0x08000000
|
|
|
|
#define WAN_FXS_NUM_REGS 109
|
|
#define WAN_FXS_NUM_INDIRECT_REGS 105
|
|
|
|
#define WAN_FXO_NUM_REGS 59
|
|
|
|
#define WAN_REMORA_READREG 0x01;
|
|
|
|
#define RM_FE_MAGIC 0x150D
|
|
|
|
#define WAN_RM_OPERMODE_LEN 20
|
|
|
|
/* Front-End UDP command */
|
|
#define WAN_FE_TONES (WAN_FE_UDP_CMD_START + 0)
|
|
#define WAN_FE_RING (WAN_FE_UDP_CMD_START + 1)
|
|
#define WAN_FE_REGDUMP (WAN_FE_UDP_CMD_START + 2)
|
|
#define WAN_FE_STATS (WAN_FE_UDP_CMD_START + 3)
|
|
|
|
#define WAN_RM_SET_ECHOTUNE _IOW (ZT_CODE, 63, struct wan_rm_echo_coefs)
|
|
|
|
/* RM interrupt types */
|
|
#define WAN_RM_INTR_NONE 0x00
|
|
#define WAN_RM_INTR_GLOBAL 0x01
|
|
|
|
/* Signalling types */
|
|
#define __WAN_RM_SIG_FXO (1 << 12) /* Never use directly */
|
|
#define __WAN_RM_SIG_FXS (1 << 13) /* Never use directly */
|
|
|
|
#define WAN_RM_SIG_NONE (0) /* Channel not configured */
|
|
#define WAN_RM_SIG_FXSLS ((1 << 0) | __WAN_RM_SIG_FXS) /* FXS, Loopstart */
|
|
#define WAN_RM_SIG_FXSGS ((1 << 1) | __WAN_RM_SIG_FXS) /* FXS, Groundstart */
|
|
#define WAN_RM_SIG_FXSKS ((1 << 2) | __WAN_RM_SIG_FXS) /* FXS, Kewlstart */
|
|
|
|
#define WAN_RM_SIG_FXOLS ((1 << 3) | __WAN_RM_SIG_FXO) /* FXO, Loopstart */
|
|
#define WAN_RM_SIG_FXOGS ((1 << 4) | __WAN_RM_SIG_FXO) /* FXO, Groupstart */
|
|
#define WAN_RM_SIG_FXOKS ((1 << 5) | __WAN_RM_SIG_FXO) /* FXO, Kewlstart */
|
|
|
|
#define WAN_RM_SIG_EM (1 << 6) /* Ear & Mouth (E&M) */
|
|
|
|
#define MIN_OFFHOOK_THRESHOLD 5
|
|
#define MAX_OFFHOOK_THRESHOLD 20
|
|
|
|
/*Analog FXO Operation mode */
|
|
|
|
#define WAN_RM_DEFAULT 0x00
|
|
#define WAN_RM_TAPPING 0x01
|
|
|
|
/*******************************************************************************
|
|
** TYPEDEF STRUCTURE
|
|
*******************************************************************************/
|
|
typedef struct sdla_remora_cfg_ {
|
|
|
|
int opermode;
|
|
char opermode_name[WAN_RM_OPERMODE_LEN];
|
|
/* int tdmv_law;*/ /* WAN_TDMV_ALAW or WAN_TDMV_MULAW */
|
|
int reversepolarity;
|
|
int battthresh;
|
|
int ohthresh;
|
|
int battdebounce;
|
|
|
|
u_int8_t relaxcfg; /* do not failed during config if one of
|
|
** the modules failed to configure */
|
|
|
|
int fxs_rxgain;
|
|
int fxs_txgain;
|
|
u_int8_t fxs_fastringer;
|
|
u_int8_t fxs_lowpower;
|
|
u_int8_t fxs_pulsedialing;
|
|
|
|
int fxo_rxgain;
|
|
int fxo_txgain;
|
|
|
|
int fxs_ringampl;
|
|
u_int8_t rm_mode; /*Analog Operation mode: default or tapping */
|
|
u_int8_t fake_polarity;
|
|
u_int8_t rm_lcm; /*Analog Loop Current Measure (LCM) : Yes Or NO */
|
|
} sdla_remora_cfg_t;
|
|
|
|
typedef struct {
|
|
unsigned char direct[WAN_FXS_NUM_REGS];
|
|
unsigned short indirect[WAN_FXS_NUM_INDIRECT_REGS];
|
|
} wan_remora_fxs_regs_t;
|
|
|
|
typedef struct {
|
|
unsigned char direct[WAN_FXO_NUM_REGS];
|
|
} wan_remora_fxo_regs_t;
|
|
|
|
typedef struct {
|
|
int tip_volt; /* TIP voltage (mV) (FXS) */
|
|
int ring_volt; /* RING voltage (mV) (FXS) */
|
|
int bat_volt; /* VBAT voltage (mV) (FXS) */
|
|
int volt; /* Line voltage status (FXO) */
|
|
/*u_int8_t hook; */ /* On/Off hook state */
|
|
unsigned char status; /* Line connected/disconnecd */
|
|
} wan_remora_stats_t;
|
|
|
|
typedef struct {
|
|
int mod_no;
|
|
int type;
|
|
|
|
union {
|
|
wan_remora_fxs_regs_t regs_fxs;
|
|
wan_remora_fxo_regs_t regs_fxo;
|
|
wan_remora_stats_t stats;
|
|
} u;
|
|
} wan_remora_udp_t;
|
|
|
|
struct wan_rm_echo_coefs {
|
|
unsigned char acim;
|
|
unsigned char coef1;
|
|
unsigned char coef2;
|
|
unsigned char coef3;
|
|
unsigned char coef4;
|
|
unsigned char coef5;
|
|
unsigned char coef6;
|
|
unsigned char coef7;
|
|
unsigned char coef8;
|
|
};
|
|
|
|
|
|
|
|
#if defined(WAN_KERNEL)
|
|
|
|
#define NUM_CAL_REGS 12
|
|
|
|
#if !defined(WAN_DEBUG_FE)
|
|
# define WRITE_RM_FXS_REG(mod_no,chain,reg,val) \
|
|
fe->write_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXS, \
|
|
(int)chain, \
|
|
(int)reg, \
|
|
(int)val)
|
|
# define READ_RM_FXS_REG(mod_no,chain,reg) \
|
|
fe->read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXS, \
|
|
(int)chain, \
|
|
(int)reg)
|
|
# define WRITE_RM_FXO_REG(mod_no,chain,reg,val) \
|
|
fe->write_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXO, \
|
|
(int)chain, \
|
|
(int)reg, \
|
|
(int)val)
|
|
# define READ_RM_FXO_REG(mod_no,chain,reg) \
|
|
fe->read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXO, \
|
|
(int)chain, \
|
|
(int)reg)
|
|
# define WRITE_RM_REG(mod_no,reg,val) \
|
|
fe->write_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)fe->rm_param.mod[mod_no].type, \
|
|
(int)fe->rm_param.mod[mod_no].chain, \
|
|
(int)reg, (int)val)
|
|
# define READ_RM_REG(mod_no,reg) \
|
|
fe->read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)fe->rm_param.mod[mod_no].type, \
|
|
(int)fe->rm_param.mod[mod_no].chain, \
|
|
(int)reg)
|
|
#else
|
|
# define WRITE_RM_FXS_REG(mod_no,chain,reg,val) \
|
|
fe->write_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXS, \
|
|
(int)chain, \
|
|
(int)reg, (int)val, \
|
|
__FILE__,(int)__LINE__)
|
|
# define READ_RM_FXS_REG(mod_no,chain,reg) \
|
|
fe->read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXS, \
|
|
(int)chain, \
|
|
(int)reg, \
|
|
__FILE__,__LINE__)
|
|
# define WRITE_RM_FXO_REG(mod_no,chain,reg,val) \
|
|
fe->write_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXO, \
|
|
(int)chain, \
|
|
(int)reg,(int)val, \
|
|
__FILE__,(int)__LINE__)
|
|
# define READ_RM_FXO_REG(mod_no,chain,reg) \
|
|
fe->read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)MOD_TYPE_FXO, \
|
|
(int)chain, \
|
|
(int)reg, \
|
|
__FILE__,(int)__LINE__)
|
|
# define WRITE_RM_REG(mod_no,reg,val) \
|
|
fe->write_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)fe->rm_param.mod[mod_no].type, \
|
|
(int)fe->rm_param.mod[mod_no].chain, \
|
|
(int)reg, (int)val,__FILE__,(int)__LINE__)
|
|
# define READ_RM_REG(mod_no,reg) \
|
|
fe->read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)fe->rm_param.mod[mod_no].type, \
|
|
(int)fe->rm_param.mod[mod_no].chain, \
|
|
(int)reg,__FILE__,(int)__LINE__)
|
|
#endif
|
|
#define __READ_RM_REG(mod_no,reg) \
|
|
fe->__read_fe_reg( ((sdla_t*)fe->card)->hw, \
|
|
(int)mod_no, \
|
|
(int)fe->rm_param.mod[mod_no].type, \
|
|
(int)fe->rm_param.mod[mod_no].chain, \
|
|
(int)reg)
|
|
|
|
|
|
enum proslic_power_warn {
|
|
PROSLIC_POWER_UNKNOWN = 0,
|
|
PROSLIC_POWER_ON,
|
|
PROSLIC_POWER_WARNED,
|
|
};
|
|
|
|
/* Sangoma A200 event bit map */
|
|
#define WAN_RM_EVENT_DTMF 1 /* DTMF event */
|
|
#define WAN_RM_EVENT_LC 2 /* Loop closure event */
|
|
#define WAN_RM_EVENT_RING_TRIP 3 /* Ring trip event */
|
|
#define WAN_RM_EVENT_POWER 4 /* Power event */
|
|
#define WAN_RM_EVENT_RING 5 /* Ring event */
|
|
#define WAN_RM_EVENT_TONE 6 /* Play tone */
|
|
#define WAN_RM_EVENT_RING_DETECT 7 /* Ring detect event */
|
|
|
|
typedef struct {
|
|
unsigned char vals[NUM_CAL_REGS];
|
|
} callregs_t;
|
|
|
|
typedef struct {
|
|
int ready;
|
|
|
|
u8 status; /* line status (connected/disconnected) */
|
|
int statusdebounce; /* line status debounce */
|
|
|
|
int ring_detect;
|
|
|
|
int offhook; /* Xswitch */
|
|
int battery; /* Xswitch */
|
|
int battdebounce; /* Xswitch */
|
|
int i_debounce;
|
|
int ringdebounce;
|
|
int wasringing;
|
|
int nobatttimer;
|
|
int lastpol;
|
|
int polarity;
|
|
int polaritydebounce;
|
|
|
|
/* Variables required for tapper mode */
|
|
int ohdebounce;
|
|
int going_offhook; /* current ohdebounce is for off-hk or on-hk */
|
|
|
|
unsigned char imask; /* interrupt mask */
|
|
|
|
/*Additional for Zaptel mode*/
|
|
#if defined(CONFIG_PRODUCT_WANPIPE_TDM_VOICE)
|
|
int echotune; /* echo tune */
|
|
struct wan_rm_echo_coefs echoregs; /* echo tune */
|
|
int readcid;
|
|
unsigned int cidtimer;
|
|
|
|
#endif
|
|
|
|
} wp_remora_fxo_t;
|
|
|
|
typedef struct {
|
|
int ready;
|
|
int idletxhookstate;
|
|
enum proslic_power_warn proslic_power;
|
|
callregs_t callregs;
|
|
unsigned char imask1; /* interrupt mask 1 */
|
|
unsigned char imask2;
|
|
unsigned char imask3;
|
|
|
|
int oldrxhook; /* Xswitch */
|
|
int lasttxhook; /* Xswitch */
|
|
int lastrxhook;
|
|
int ohttimer; /* Xswitch */
|
|
int palarms; /* Xswitch */
|
|
int debounce;
|
|
int debouncehook;
|
|
|
|
/*Additional for Zaptel mode */
|
|
int lasttxhook_update;
|
|
/*Flash/hook timer */
|
|
|
|
int itimer;
|
|
int rxflashtime;
|
|
|
|
} wp_remora_fxs_t;
|
|
|
|
typedef struct {
|
|
int type;
|
|
int chain;
|
|
unsigned long events;
|
|
unsigned long lastcmd;
|
|
|
|
#if 0
|
|
#if defined(__WINDOWS__)
|
|
wan_event_ctrl_t current_control_event;
|
|
wan_event_ctrl_t *current_control_event_ptr;
|
|
#else
|
|
WAN_LIST_HEAD(, wan_event_ctrl_) event_head;
|
|
#endif
|
|
#endif
|
|
/* TDM Voice applications */
|
|
int sig;
|
|
/* Special fxs/fxo settings */
|
|
union {
|
|
wp_remora_fxo_t fxo;
|
|
wp_remora_fxs_t fxs;
|
|
} u;
|
|
|
|
} wp_remora_module_t;
|
|
|
|
typedef struct {
|
|
// u_int16_t type;
|
|
unsigned int mod_no; /* A200-Remora */
|
|
unsigned char ec_dtmf_port; /* EC DTMF: SOUT or ROUT */
|
|
unsigned long ts_map;
|
|
u_int8_t tone;
|
|
int ohttimer; /* On-hook transfer */
|
|
int polarity; /* SETPOLARITY */
|
|
unsigned short reg; /* fe register */
|
|
unsigned char value; /* fe register value */
|
|
int rm_gain; /* Tx/Rx Gain */
|
|
} sdla_rm_event_t;
|
|
|
|
typedef struct sdla_remora_param {
|
|
int not_used;
|
|
|
|
wp_remora_module_t mod[MAX_REMORA_MODULES];
|
|
|
|
u32 module_map; /* Map of available module */
|
|
u16 max_fe_channels;/* Number of available modules */
|
|
|
|
u8 critical;
|
|
// wan_timer_t timer;
|
|
// u8 timer_cmd;
|
|
// u16 timer_mod_no;
|
|
// u16 timer_delay;
|
|
|
|
u32 intcount;
|
|
wan_ticks_t last_watchdog;
|
|
|
|
int reg_dbg_busy;
|
|
int reg_dbg_ready;
|
|
unsigned char reg_dbg_value;
|
|
/* use REG_SHADOW in all modes */
|
|
unsigned char reg0shadow[MAX_REMORA_MODULES]; /* read> fxs: 68 fxo: 5 */
|
|
unsigned char reg1shadow[MAX_REMORA_MODULES]; /* read> fxs: 64 fxo: 29 */
|
|
unsigned char reg2shadow[MAX_REMORA_MODULES]; /* read> fxs: 64 fxo: 29 */
|
|
unsigned char reg3shadow[MAX_REMORA_MODULES]; /* read > fxs : 19 for Ring/Trip Evnet , FXO -used LCS2 (read 28) */
|
|
unsigned char reg4shadow[MAX_REMORA_MODULES]; /* read > fxs : 20 for DTMF Evnet , FXO no use yet */
|
|
|
|
unsigned char reg0shadow_write[MAX_REMORA_MODULES]; /* write> fxs: 68 fxo: 5 */
|
|
int reg0shadow_update[MAX_REMORA_MODULES];
|
|
int battdebounce; /* global for FXO */
|
|
int battthresh; /* global for FXO */
|
|
int wp_rm_chunk_size; /* TDM API set as MTU for Zaptel set as ZT_CHUNK_SIZE */
|
|
|
|
#if DBG_FALSE_RING1
|
|
u32 last_system_ticks;
|
|
u32 last_intcount;
|
|
u32 ticks_diff;
|
|
u32 int_diff;
|
|
#endif
|
|
|
|
} sdla_remora_param_t;
|
|
|
|
|
|
#endif /* WAN_KERNEL */
|
|
|
|
/*******************************************************************************
|
|
** FUNCTION PROTOTYPES
|
|
*******************************************************************************/
|
|
extern int wp_remora_iface_init(void*, void*);
|
|
extern int wp_a700_remora_iface_init(void*, void*);
|
|
|
|
#undef WP_EXTERN
|
|
#endif /* __SDLA_REMORA_H */
|
|
|