401 lines
9.4 KiB
C
401 lines
9.4 KiB
C
/******************************************************************************
|
|
* wanec_iface.h
|
|
*
|
|
* Author: Alex Feldman <al.feldman@sangoma.com>
|
|
*
|
|
* Copyright: (c) 1995-2001 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.
|
|
* ============================================================================
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef __WANEC_IFACE_H
|
|
# define __WANEC_IFACE_H
|
|
|
|
#if defined(__WINDOWS__)
|
|
# if defined(__KERNEL__)
|
|
# define _DEBUG
|
|
# include <DebugOut.h>
|
|
# else
|
|
# include <windows.h>
|
|
# endif
|
|
#endif
|
|
|
|
#include "wanpipe_includes.h"
|
|
#include "wanpipe_defines.h"
|
|
#include "wanpipe_cfg.h"
|
|
#include "wanpipe_events.h"
|
|
|
|
#if defined(__WINDOWS__)
|
|
# include "oct6100_api.h"
|
|
#else
|
|
# include "oct6100api/oct6100_api.h"
|
|
#endif
|
|
|
|
#define WAN_EC_VERBOSE_NONE 0x00
|
|
#define WAN_EC_VERBOSE_EXTRA1 0x01
|
|
#define WAN_EC_VERBOSE_MASK_EXTRA1 0x01
|
|
#define WAN_EC_VERBOSE_EXTRA2 0x02
|
|
#define WAN_EC_VERBOSE_MASK_EXTRA2 0x03
|
|
#define WAN_EC_VERBOSE(ec_api) (ec_api)?ec_api->verbose:WAN_EC_VERBOSE_NONE
|
|
|
|
#define WAN_EC_RC_OK 0x0000
|
|
#define WAN_EC_RC_CPU_INTERFACE_NO_RESPONSE 0x0001
|
|
#define WAN_EC_RC_MEMORY 0x0002
|
|
|
|
|
|
/* Internal EC chip state machine */
|
|
enum {
|
|
WAN_EC_STATE_NONE = 0x00,
|
|
WAN_EC_STATE_RESET,
|
|
WAN_EC_STATE_READY,
|
|
WAN_EC_STATE_CHIP_OPEN_PENDING,
|
|
WAN_EC_STATE_CHIP_OPEN,
|
|
WAN_EC_STATE_CHAN_READY
|
|
};
|
|
#define WAN_EC_STATE_DECODE(state) \
|
|
(state == WAN_EC_STATE_RESET) ? "Reset" : \
|
|
(state == WAN_EC_STATE_READY) ? "Ready" : \
|
|
(state == WAN_EC_STATE_CHIP_OPEN_PENDING) ? "Chip Open Pending" : \
|
|
(state == WAN_EC_STATE_CHIP_OPEN) ? "Chip Open" : \
|
|
(state == WAN_EC_STATE_CHAN_READY) ? "Channels Ready" : \
|
|
"Unknown"
|
|
|
|
#define MAX_EC_CHANS 256
|
|
|
|
#define WAN_NUM_DTMF_TONES 16
|
|
#define WAN_NUM_PLAYOUT_TONES 16
|
|
#define WAN_MAX_TONE_LEN 100
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct wanec_config_
|
|
{
|
|
u_int16_t max_channels;
|
|
int memory_chip_size;
|
|
UINT32 debug_data_mode;
|
|
UINT8 *WP_POINTER_64 imageData;
|
|
#if defined(__GNUC__) && !defined(__x86_64__)
|
|
unsigned int reserved;
|
|
#endif
|
|
|
|
UINT32 imageSize;
|
|
int imageLast;
|
|
|
|
wan_custom_conf_t custom_conf;
|
|
} wanec_config_t;
|
|
|
|
typedef struct wanec_config_poll_
|
|
{
|
|
int cnt;
|
|
} wanec_config_poll_t;
|
|
|
|
typedef struct wanec_chip_stats_
|
|
{
|
|
int reset;
|
|
tOCT6100_CHIP_STATS f_ChipStats;
|
|
} wanec_chip_stats_t;
|
|
|
|
typedef struct wanec_chip_image_
|
|
{
|
|
tOCT6100_CHIP_IMAGE_INFO *WP_POINTER_64 f_ChipImageInfo;
|
|
#if defined(__GNUC__) && !defined(__x86_64__)
|
|
unsigned int reserved;
|
|
#endif
|
|
} wanec_chip_image_t;
|
|
|
|
typedef struct wanec_chan_opmode_
|
|
{
|
|
UINT32 opmode;
|
|
} wanec_chan_opmode_t;
|
|
|
|
typedef struct wanec_chan_mute_
|
|
{
|
|
unsigned char port_map;
|
|
|
|
} wanec_chan_mute_t;
|
|
|
|
typedef struct wanec_chan_custom_
|
|
{
|
|
int custom;
|
|
wan_custom_conf_t custom_conf;
|
|
} wanec_chan_custom_t;
|
|
|
|
typedef struct wanec_chan_stats_
|
|
{
|
|
int reset;
|
|
tOCT6100_CHANNEL_STATS f_ChannelStats;
|
|
} wanec_chan_stats_t;
|
|
|
|
#define MAX_MONITOR_DATA_LEN 1024
|
|
typedef struct wanec_chan_monitor_
|
|
{
|
|
int fe_chan;
|
|
int data_mode;
|
|
UINT32 remain_len;
|
|
UINT32 data_len;
|
|
UINT32 max_len;
|
|
UINT8 data[MAX_MONITOR_DATA_LEN+1];
|
|
} wanec_chan_monitor_t;
|
|
|
|
typedef struct wanec_buffer_config_
|
|
{
|
|
UINT8 buffer[WAN_MAX_TONE_LEN];
|
|
UINT8 *WP_POINTER_64 data;
|
|
#if defined(__GNUC__) && !defined(__x86_64__)
|
|
unsigned int reserved;
|
|
#endif
|
|
UINT32 size;
|
|
UINT32 pcmlaw;
|
|
UINT32 buffer_index; /* value return by ec */
|
|
} wanec_buffer_config_t;
|
|
|
|
#define MAX_EC_PLAYOUT_LEN 20
|
|
typedef struct wanec_playout_
|
|
{
|
|
UINT32 index;
|
|
UINT8 port;
|
|
UINT32 duration;
|
|
BOOL repeat;
|
|
UINT32 repeat_cnt;
|
|
UINT32 buffer_length;
|
|
INT32 gaindb;
|
|
BOOL notifyonstop;
|
|
UINT32 user_event_id;
|
|
|
|
CHAR str[MAX_EC_PLAYOUT_LEN];
|
|
UINT32 delay;
|
|
} wanec_playout_t;
|
|
|
|
typedef struct wanec_tone_config_
|
|
{
|
|
u_int8_t id; /* Tone id */
|
|
u_int8_t port_map; /* SOUT/ROUT */
|
|
u_int8_t type; /* PRESENT or STOP */
|
|
} wanec_tone_config_t;
|
|
|
|
|
|
/*===========================================================================*\
|
|
User process context - This would probably have to be defined elsewhere.
|
|
This structure must be allocated by the calling process and the parameters
|
|
should be defined prior to open the OCT6100 chip.
|
|
\*===========================================================================*/
|
|
typedef struct _OCTPCIDRV_USER_PROCESS_CONTEXT_
|
|
{
|
|
#if defined(WAN_KERNEL)
|
|
/* Interface name to driver (copied by calling process) */
|
|
unsigned char devname[WAN_DRVNAME_SZ+1];
|
|
/*unsigned char ifname[WAN_IFNAME_SZ+1];*/
|
|
|
|
/* Board index. */
|
|
unsigned int ulBoardId;
|
|
|
|
void *ec_dev;
|
|
#else
|
|
/* Is main process */
|
|
unsigned int fMainProcess;
|
|
|
|
/* Handle to driver (opened by calling process) */
|
|
void *ec_dev;
|
|
|
|
/* Interface name to driver (copied by calling process) */
|
|
unsigned char devname[WAN_DRVNAME_SZ+1];
|
|
unsigned char ifname[WAN_IFNAME_SZ+1];
|
|
|
|
/* Handle to serialization object used for read and writes */
|
|
unsigned int ulUserReadWriteSerObj;
|
|
|
|
/* Board index. */
|
|
unsigned int ulBoardId;
|
|
|
|
/* Board type. */
|
|
unsigned int ulBoardType;
|
|
#endif
|
|
} tOCTPCIDRV_USER_PROCESS_CONTEXT, *tPOCTPCIDRV_USER_PROCESS_CONTEXT;
|
|
|
|
#pragma pack()
|
|
|
|
|
|
#if defined(WAN_KERNEL)
|
|
|
|
#if defined(__WINDOWS__)
|
|
# define PRINT1(v,...) \
|
|
if (v & WAN_EC_VERBOSE_EXTRA1) DEBUG_EVENT(## __VA_ARGS__)
|
|
# define PRINT2(v,...) \
|
|
if (v & WAN_EC_VERBOSE_EXTRA2) DEBUG_EVENT(## __VA_ARGS__)
|
|
#else
|
|
# define PRINT1(v,format,msg...) \
|
|
if (v & WAN_EC_VERBOSE_EXTRA1) DEBUG_EVENT(format,##msg)
|
|
# define PRINT2(v,format,msg...) \
|
|
if (v & WAN_EC_VERBOSE_EXTRA2) DEBUG_EVENT(format,##msg)
|
|
#endif
|
|
|
|
|
|
#define WANEC_IGNORE (TRUE+1)
|
|
|
|
#define WANEC_BYDEFAULT_NORMAL
|
|
|
|
/* Critical bit map */
|
|
#define WAN_EC_BIT_TIMER_RUNNING 1
|
|
#define WAN_EC_BIT_TIMER_KILL 2
|
|
#define WAN_EC_BIT_CRIT_CMD 3
|
|
#define WAN_EC_BIT_CRIT_DOWN 4
|
|
#define WAN_EC_BIT_CRIT_ERROR 5
|
|
#define WAN_EC_BIT_CRIT 6
|
|
|
|
#define WAN_EC_BIT_EVENT_TONE 4
|
|
#define WAN_EC_BIT_EVENT_PLAYOUT 5
|
|
|
|
#define WAN_EC_POLL_NONE 0x00
|
|
#define WAN_EC_POLL_INTR 0x01
|
|
#define WAN_EC_POLL_CHIPOPENPENDING 0x02
|
|
#define WAN_EC_POLL_DTMF_MUTE_ON 0x03
|
|
#define WAN_EC_POLL_DTMF_MUTE_OFF 0x04
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef
|
|
struct wan_ec_confbridge_
|
|
{
|
|
UINT32 ulHndl;
|
|
|
|
WAN_LIST_ENTRY(wan_ec_confbridge_) next;
|
|
} wan_ec_confbridge_t;
|
|
|
|
|
|
struct wan_ec_;
|
|
typedef struct wan_ec_dev_
|
|
{
|
|
char *name;
|
|
char devname[WAN_DRVNAME_SZ+1];
|
|
char ecdev_name[WAN_DRVNAME_SZ+1];
|
|
int ecdev_no;
|
|
sdla_t *card;
|
|
|
|
u_int8_t fe_media;
|
|
u_int32_t fe_lineno;
|
|
int fe_start_chan, fe_stop_chan;
|
|
int fe_max_chans;
|
|
u_int32_t fe_channel_map;
|
|
u_int32_t fe_dtmf_removal_map; /* Bitmap of channels that have dtmf removal enabled already */
|
|
u_int32_t fe_ec_map;
|
|
u_int32_t fe_tdmv_law;
|
|
u_int32_t channel;
|
|
int state;
|
|
|
|
u_int32_t critical;
|
|
wan_timer_t timer;
|
|
|
|
u_int8_t poll_cmd;
|
|
int poll_channel;
|
|
|
|
u_int32_t events; /* enable events map */
|
|
|
|
wan_hwec_dev_state_t ecdev_state;
|
|
|
|
struct wan_ec_ *ec;
|
|
WAN_LIST_ENTRY(wan_ec_dev_) next;
|
|
|
|
#if 0
|
|
/* Not using fax debouncing for now */
|
|
wan_ticks_t fax_detect_timeout;
|
|
u_int16_t fax_detect_cnt;
|
|
#endif
|
|
|
|
} wan_ec_dev_t;
|
|
|
|
typedef struct wan_ec_
|
|
{
|
|
char name[WAN_DRVNAME_SZ+1];
|
|
int usage;
|
|
int chip_no;
|
|
int state;
|
|
int ec_active;
|
|
u_int16_t max_ec_chans; /* max number of ec channels (security) */
|
|
int confbridges_no; /* number of opened conf bridges */
|
|
void *ec_dev;
|
|
u_int32_t intcount;
|
|
u_int32_t critical;
|
|
|
|
int ignore_H100; /* Temporary for BRI card */
|
|
|
|
wan_mutexlock_t lock;
|
|
u_int32_t events; /* enable events map */
|
|
int tone_verbose; /* verbose mode for tone events */
|
|
int playout_verbose; /* verbose mode for playout events */
|
|
wan_ticks_t lastint_ticks;
|
|
|
|
PUINT8 pImageData;
|
|
UINT32 ImageSize;
|
|
int imageLast;
|
|
wan_custom_conf_t custom_conf;
|
|
tOCT6100_CHIP_OPEN f_OpenChip;
|
|
|
|
tOCTPCIDRV_USER_PROCESS_CONTEXT f_Context;
|
|
tPOCT6100_INSTANCE_API pChipInstance;
|
|
tOCT6100_INTERRUPT_FLAGS f_InterruptFlag;
|
|
UINT32 *pEchoChannelHndl;
|
|
PUINT32 pToneBufferIndexes;
|
|
UINT32 ulDebugChannelHndl;
|
|
INT DebugChannel;
|
|
UINT32 ulDebugDataMode;
|
|
struct wan_ec_dev_ **pEcDevMap;
|
|
WAN_LIST_HEAD(wan_ec_dev_head_, wan_ec_dev_) ec_dev_head;
|
|
WAN_LIST_HEAD(wan_ec_confbridge_head_, wan_ec_confbridge_) ec_confbridge_head;
|
|
WAN_LIST_ENTRY(wan_ec_) next;
|
|
} wan_ec_t;
|
|
|
|
#pragma pack()
|
|
|
|
#if 0
|
|
typedef struct wanec_lip_reg
|
|
{
|
|
unsigned long init;
|
|
|
|
void* (*reg) (void*, int);
|
|
int (*unreg) (void*, void*);
|
|
|
|
int (*ioctl) (void);
|
|
int (*isr) (void);
|
|
|
|
}wanec_lip_reg_t;
|
|
#endif
|
|
|
|
static __inline int wan_ec_update_and_check(wan_ec_t *ec, int enable)
|
|
{
|
|
if (!enable) {
|
|
if (ec->ec_active > 0){
|
|
ec->ec_active--;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
if (ec->ec_active >= ec->max_ec_chans) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
ec->ec_active++;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* global interface functions */
|
|
void *wan_ec_config (void *pcard, int max_channels);
|
|
int wan_ec_remove(void*, void *pcard);
|
|
int wan_ec_ioctl(void*, struct ifreq*, void *pcard);
|
|
int wan_ec_dev_ioctl(void*, void *pcard);
|
|
|
|
u32 wan_ec_req_write(void*, u32 write_addr, u16 write_data);
|
|
u32 wan_ec_req_write_smear(void*, u32 addr, u16 data, u32 len);
|
|
u32 wan_ec_req_write_burst(void*, u32 addr, u16 *data, u32 len);
|
|
u32 wan_ec_req_read(void*, u32 addr, u16 *data);
|
|
u32 wan_ec_req_read_burst(void*, u32 addr, u16 *data, u32 len);
|
|
|
|
#endif
|
|
|
|
#endif /* __WANEC_IFACE_H */
|