505 lines
14 KiB
C
505 lines
14 KiB
C
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef PHONE_H
|
|
#define PHONE_H
|
|
|
|
#include "text_strings.h"
|
|
|
|
#include "sessionConstants.h"
|
|
|
|
// define device reset types
|
|
typedef enum {
|
|
DEVICE_RESET = CC_DEVICE_RESET,
|
|
DEVICE_RESTART = CC_DEVICE_RESTART,
|
|
ICMP_UNREACHABLE_RESET = CC_DEVICE_ICMP_UNREACHABLE
|
|
} DeviceResetType;
|
|
|
|
/*
|
|
* When not building IRX or attempting to emluate IRX
|
|
* define the irx_lst_blk structure
|
|
*/
|
|
typedef int32_t irx_lst_blk;
|
|
#if defined SIP_OS_WINDOWS
|
|
/*
|
|
* When attempting to emulate TNP, but use 79xx BTXML
|
|
* define the following
|
|
*/
|
|
typedef int32_t irx_tsk_blk;
|
|
typedef int32_t irx_tmr_buf;
|
|
|
|
#include "tnpphone.h"
|
|
#endif
|
|
|
|
|
|
#define APP_MAX_SIZE 0x60000L
|
|
#define MAX_CTL_FILE_SIZE 0x8000L
|
|
|
|
#define disableInt IRXDISAB
|
|
#define enableInt IRXENAB
|
|
#define intrOff IRXHRDDIS
|
|
#define intrOn IRXHRDENA
|
|
|
|
#define MAX_LINES_7940 2
|
|
#define MAX_LINES_7960 6
|
|
#define DSP_LOAD_ID_MAX 28
|
|
#define OLD_DSP_LOAD_ID_MAX 8
|
|
|
|
/*
|
|
* System timer tick (clock interrupt) specifications.
|
|
*/
|
|
#define TICKS_PER_SECOND 100 /* 10ms. per tick */
|
|
#define SECONDS_TO_TICKS(SECS) ((SECS) * TICKS_PER_SECOND)
|
|
#define TICKS_TO_SECONDS(TICKS) ((TICKS)/ TICKS_PER_SECOND)
|
|
#define MILLISECONDS_TO_TICKS(MILLISECS) (((MILLISECS)*(TICKS_PER_SECOND))/1000)
|
|
|
|
enum {
|
|
DSP_RST,
|
|
GPIO_A = 4,
|
|
GPIO_B,
|
|
GPIO_C,
|
|
GPIO_D,
|
|
gpioMax
|
|
};
|
|
|
|
typedef struct {
|
|
uint8_t loadid[256];
|
|
uint8_t apploadid[8];
|
|
uint32_t chksum; // file checksum
|
|
uint32_t applen; // file len
|
|
uint32_t appcmp; // compressed/uncompressed
|
|
uint32_t cmpchksum; // file checksum
|
|
uint32_t cmplen; // file len
|
|
} LoadHdr;
|
|
|
|
typedef struct {
|
|
uint8_t apploadid[DSP_LOAD_ID_MAX];
|
|
uint32_t chksum; // file checksum
|
|
uint32_t applen; // file len
|
|
uint32_t appcmp; // compressed/uncompressed
|
|
uint32_t cmpchksum; // file checksum
|
|
uint32_t cmplen; // file len
|
|
|
|
} DSPLoadHdr;
|
|
|
|
typedef struct {
|
|
uint8_t apploadid[OLD_DSP_LOAD_ID_MAX];
|
|
uint32_t chksum; // file checksum
|
|
uint32_t applen; // file len
|
|
uint32_t appcmp; // compressed/uncompressed
|
|
uint32_t cmpchksum; // file checksum
|
|
uint32_t cmplen; // file len
|
|
|
|
} LegacyDSPLoadHdr;
|
|
|
|
typedef struct {
|
|
uint16_t valid;
|
|
uint16_t notused[3];
|
|
uint16_t hw_ver_hi;
|
|
uint16_t hw_ver_low;
|
|
uint8_t mac[6];
|
|
int8_t model[20];
|
|
uint16_t feature_bits;
|
|
uint16_t ext;
|
|
uint16_t license[20];
|
|
int8_t serial_number[20];
|
|
} MfgBlk;
|
|
|
|
#define GPIO_IO_SEL_SHIFT 8
|
|
|
|
#define GPIOA_LBK_ON 1
|
|
#define GPIOA_MSG_LED 4
|
|
#define GPIOA_SPKR_LED 5
|
|
#define GPIOA_MUTE_LED 6
|
|
#define GPIOA_HDST_LED 7
|
|
#define GPIOA_IO_MASK ((1<<(GPIOA_LBK_ON+GPIO_IO_SEL_SHIFT))|\
|
|
(1<<(GPIOA_MSG_LED+GPIO_IO_SEL_SHIFT))|\
|
|
(1<<(GPIOA_SPKR_LED+GPIO_IO_SEL_SHIFT))|\
|
|
(1<<(GPIOA_MUTE_LED+GPIO_IO_SEL_SHIFT))|\
|
|
(1<<(GPIOA_HDST_LED+GPIO_IO_SEL_SHIFT)))
|
|
|
|
#define GPIOD_HANDSET 0
|
|
#define GPIOD_SPKER 1
|
|
#define GPIOD_PHY_MDC 3
|
|
#define GPIOD_PHY_MDIO 4
|
|
#define GPIOD_IO_RST_HI 5
|
|
#define GPIOD_IO_RST_LO 6
|
|
#define GPIOD_IO_MASK 0xff00
|
|
|
|
typedef volatile struct {
|
|
uint16_t reg;
|
|
uint16_t unused;
|
|
} s_rbbreg;
|
|
|
|
enum {
|
|
rbbTimeout,
|
|
rbbAPIWs,
|
|
rbbWbufEn,
|
|
rbbAccessFactor0,
|
|
rbbAccessFactor1,
|
|
rbbAccessFactor2,
|
|
rbbAccessFactor3,
|
|
rbbIntrSw,
|
|
rbbMax
|
|
};
|
|
|
|
extern s_rbbreg RBBReg[rbbMax];
|
|
|
|
#define DCFG_PROGRAMMED 0x12300000L
|
|
#define DCFG_FIXED_VLAN 0x00000001L
|
|
#define DCFG_UI_SETTING 0x00000002L
|
|
|
|
#define IF_MAX 1
|
|
#define MAX_PORT 2
|
|
enum { PORT_UP, PORT_DOWN };
|
|
|
|
#define KA_TICKS 0 //Default to 10 seconds
|
|
|
|
typedef struct {
|
|
uint32_t Active,
|
|
IP,
|
|
SSRC,
|
|
PktIn,
|
|
OctIn,
|
|
Delay,
|
|
Cycle,
|
|
Tick,
|
|
Time,
|
|
Mcast;
|
|
uint16_t Seq,
|
|
First;
|
|
int32_t Jitter,
|
|
Trans;
|
|
} _s_talkers;
|
|
|
|
#define TX_CONNECT 1
|
|
#define RX_CONNECT 2
|
|
|
|
//defined values for IfActive
|
|
#define IF_2MPS 1L
|
|
#define IF_10MPS 2L
|
|
|
|
//Flag definitions for timer
|
|
#define KEYSCAN 0x00000001L
|
|
#define HOOKSCAN 0x00000002L
|
|
#define TIMETICK 0x00000004L
|
|
|
|
#define ON 1
|
|
#define OFF 0
|
|
#define TALK 2
|
|
#define SIZEOF_UISET 16
|
|
|
|
typedef struct {
|
|
uint8_t diag;
|
|
uint32_t status;
|
|
uint16_t vlan;
|
|
uint16_t vvlan;
|
|
uint16_t port;
|
|
uint16_t uiset[SIZEOF_UISET];
|
|
uint16_t vvlanAdmin;
|
|
uint16_t vvlanIP; //vvlan that our IP address was aquired on
|
|
uint8_t unused[2001]; //struct must remain 2046 in size
|
|
} DeviceCfgBlk;
|
|
|
|
|
|
// pulled from net_config.h
|
|
#define MAX_NAME (64)
|
|
#define BACKUP_SERVERS (7)
|
|
#define MAX_DHCP_TFTP_FILE_NAME (128)
|
|
#define DISKFULL 3 // file too large
|
|
#define NOERR 8 // no error
|
|
typedef struct
|
|
{
|
|
int8_t tftp_file[40];
|
|
uint32_t status;
|
|
uint32_t control;
|
|
uint32_t appStatus;
|
|
uint32_t appControl;
|
|
uint32_t tftp_backup;
|
|
} DHCPBlkExt;
|
|
|
|
typedef struct
|
|
{
|
|
uint32_t status; // This structure for sake of backward compatibility needs to
|
|
uint32_t my_ip_addr; // remain as is until you and I are deceased, stop paying taxes
|
|
uint32_t subnet_mask; // and all the 79xx phones are long gone. A strategy could be
|
|
uint32_t defaultgw; // developed to solve this and world hunger but heed this warning.
|
|
uint32_t dns_addr;
|
|
uint32_t tftp_addr;
|
|
uint8_t my_mac_addr[6];
|
|
int8_t domain_name[MAX_NAME];
|
|
int8_t my_name[MAX_NAME];
|
|
uint32_t dhcp_server;
|
|
uint32_t spare;
|
|
uint32_t dns_backup[BACKUP_SERVERS];
|
|
uint32_t gw_backup[BACKUP_SERVERS];
|
|
int8_t tftp_name[MAX_NAME];
|
|
union {
|
|
int8_t tftp_file[MAX_DHCP_TFTP_FILE_NAME];
|
|
DHCPBlkExt ext;
|
|
} extFields;
|
|
} DHCPBlk;
|
|
|
|
|
|
/*
|
|
* These structures are how the memory blocks are laid out
|
|
* Note that these are reflected in ASICAPP.CMD with:
|
|
*
|
|
* BOOT_MEM : org = 0x00000020 len = 0x00001FE0
|
|
* MFG_ROM : org = 0x00004000 len = 0x00002000
|
|
* CFG_ROM : org = 0x00006000 len = 0x00002000
|
|
* VER_MEM : org = 0x00008000 len = 0x00000004
|
|
* A1_ROM : org = 0x00010000 len = 0x00060000
|
|
* A2_ROM : org = 0x00070000 len = 0x00060000
|
|
* DSP_ROM : org = 0x000D0000 len = 0x00020000
|
|
* DIR_ROM : org = 0x000F0000 len = 0x00010000
|
|
*/
|
|
typedef struct {
|
|
DHCPBlk dhcp_blk; /* 0x00006000 - 0x0000619f len=0x01a0 */
|
|
DeviceCfgBlk device_cfg_blk; /* 0x000061a0 - 0x000069a3 len=0x0804 */
|
|
|
|
// removing this area as we don't use it. Re-allocating this space
|
|
// for use in the prot_cfg_area so we can store more config info.
|
|
// int8_t skinny_cfg[0x065c]; /* 0x000069a4 - 0x00006fff len=0x065c */
|
|
|
|
int8_t prot_signature[0x0004]; /* 0x000069a4 - 0x000069a7 len=0x0004 */
|
|
|
|
// int8_t prot_cfg_area[0x0ff8]; /* 0x00007004 - 0x00007ffb len=0x0ff8 */
|
|
int8_t prot_cfg_area[0x1654]; /* 0x000069a8 - 0x00007ffb len=0x1654 */
|
|
|
|
uint32_t prot_cfg_offset; /* 0x00007ffc - 0x00007fff len=0x0004 */
|
|
} cfg_rom_t;
|
|
|
|
typedef struct {
|
|
int8_t prot_signature[0x0004]; /* 0x000F0000 - 0x000F0003 len=0x0004 */
|
|
int8_t personal_dir[0xDFFC]; /* 0x000F0004 - 0x000FDFFF len=0xDFFC */
|
|
int8_t dial_signature[0x0004]; /* 0x000FE000 - 0x000FE003 len=0x0004 */
|
|
int8_t dial_plan[0x1FF0]; /* 0x000FE004 - 0x000FFFF3 len=0x1FF0 */
|
|
uint32_t unused_offset2; /* 0x000FFFF4 - 0x000FFFF7 len=0x0004 */
|
|
uint32_t dial_plan_offset; /* 0x000FFFF8 - 0x000FFFFB len=0x0004 */
|
|
uint32_t prot_dir_offset; /* 0x000FFFFC - 0x000FFFFF len=0x0004 */
|
|
} dir_rom_t;
|
|
#define DIR_CONFIG_SIGNATURE "DIR0"
|
|
#define CONFIG_MAX (0x2000 - sizeof(DHCPBlk) - sizeof(DeviceCfgBlk))
|
|
|
|
// These variables are declared in the ASIC.CMD file
|
|
extern volatile uint32_t WDTimer;
|
|
extern volatile uint16_t GPIO1[gpioMax];
|
|
extern DHCPBlk DHCPInfo; // DHCP info stored in RAM
|
|
extern LoadHdr Load; // load header of current app
|
|
|
|
#ifdef _WIN32
|
|
extern uint8_t LoadArea[0xFFFF];
|
|
extern uint8_t BootHeader[9]; // Magic number 9 = MAX_OLD_LOAD_ID_STRING
|
|
#else
|
|
extern uint8_t LoadArea; // landing zone for app download
|
|
extern int8_t BootHeader;
|
|
#endif
|
|
extern LoadHdr LoadHeader; // landing zone for app download
|
|
extern DHCPBlk DHCPInfoRom; // DHCP info stored in ROM
|
|
extern DHCPBlk DHCPInfoTemp; // DHCP info stored in ROM
|
|
extern MfgBlk MfgInfo; // Manufacturing information
|
|
extern LoadHdr App1Hdr; // Application 1 in ROM
|
|
extern LoadHdr App2Hdr; // Application 2 in ROM
|
|
extern uint8_t App1Rom; // Application 1 in ROM
|
|
extern uint8_t App2Rom; // Application 2 in ROM
|
|
extern DSPLoadHdr DspHeader;
|
|
extern dir_rom_t DirStorage; // Actual personal directory stored in ROM
|
|
extern uint32_t DcmpVer; // Version of Decompression Algorithm in boot
|
|
extern uint16_t DCVerReg;
|
|
//extern SysHdr *pCFGTftpReq;
|
|
|
|
typedef struct {
|
|
int16_t displayContrast;
|
|
int16_t ringType;
|
|
int16_t handsetVolume;
|
|
int16_t headsetVolume;
|
|
int16_t speakerVolume;
|
|
int16_t ringVolume;
|
|
int16_t reserved[10];
|
|
} t_SettingsDesc;
|
|
|
|
extern int16_t SavePhoneSettings;
|
|
|
|
// Phone states
|
|
enum {
|
|
STATE_INIT_CFG,
|
|
STATE_CDP_CFG,
|
|
STATE_IP_CFG,
|
|
STATE_FILE_CFG,
|
|
STATE_CFG_UPDATE,
|
|
STATE_CONNECTING,
|
|
STATE_REGISTER,
|
|
STATE_REGISTER_REJ,
|
|
STATE_LOADID_REQ,
|
|
STATE_BOOT_DSP,
|
|
STATE_LOADING,
|
|
STATE_CONNECTED,
|
|
STATE_RESETTING,
|
|
STATE_IP_RELEASE,
|
|
STATE_DUP_IP,
|
|
STATE_DONE_LOADING,
|
|
STATE_UNPROVISIONED, /* KAZOO only */
|
|
maxPHNState
|
|
};
|
|
|
|
enum { CDP_CACHE_P0_CLEAR, CDP_CACHE_P1_CLEAR, CDP_CACHE_CLEAN };
|
|
//enum { CDP_UNTRUSTED, CDP_TRUSTED, CDP_TRUST_NA = 255 };
|
|
|
|
#define DC_NONE 0
|
|
#define DC_C3PO 1
|
|
#define DC_ETH 3
|
|
#define DC_2MPS 7
|
|
|
|
#define NO_TAGGING 4095
|
|
#define NO_VID 4096
|
|
|
|
/*
|
|
* Number of buffers in a pool.
|
|
*/
|
|
#define SYSBUF_CNT 50
|
|
#define DSPBUF_CNT 30
|
|
#define SIPTMRBUF_CNT 32
|
|
#define SIPBUF_CNT MAX(MAX_TEL_LINES, 32)
|
|
#define GSMBUF_CNT 32
|
|
#define GUITMRBUF_CNT 5
|
|
#define TCPBUF_CNT 6 // for use by telnet etc
|
|
#define PKTBUF_TX_CNT 10
|
|
#define ENET_RX_BUF_CNT 10
|
|
#define PKTBUF_CNT (ENET_RX_BUF_CNT + PKTBUF_TX_CNT) //20
|
|
|
|
/*
|
|
* Size of an indivdual buffer. CPR_MAX_MSG_SIZE
|
|
* declared in cpr_irx_ipc.h needs to be set to
|
|
* the largest value defined here.
|
|
*/
|
|
#define SYSBUF_SIZ 512
|
|
#define GUITMRBUF_SIZ 32
|
|
#define PKTBUF_SIZ 3072
|
|
#define TCPBUF_SIZ 2560
|
|
#define DSPBUF_SIZ 96
|
|
#define GUIBUF_SIZ 512
|
|
|
|
// Buffer Return Identifiers
|
|
/*
|
|
* Since we now have this horrible mismash of CPR and IRX calls
|
|
* in the legacy phone, CPR has to have an unique buffer ID to
|
|
* place in the sys header of the buffers so when the application
|
|
* is done with them CPR will know not to call Main0RetBuffer. This
|
|
* value is not used in application code just #defined here to
|
|
* prevent it being used in the future.
|
|
*/
|
|
#define SYS_BUFFER 1 //System Buffer
|
|
#define XMT_BUFFER 2 //Ether Transmit Packet Ram Buffer
|
|
#define RCV_BUFFER 3 //Ether Receive Packet Ram Buffer
|
|
#define TCP_BUFFER 4
|
|
#define DSP_BUFFER 5
|
|
#define GUITMR_BUFFER 6
|
|
#define CPR_BUFFER 256
|
|
|
|
extern uint16_t ResetPend;
|
|
extern uint32_t gtick;
|
|
extern uint16_t ResetTimer; // used to delay the bugtrap, 10mse ticks
|
|
extern uint8_t LinkState[MAX_PORT];
|
|
extern uint16_t LinkStatus[MAX_PORT];
|
|
extern uint8_t CurrentLinkState[MAX_PORT];
|
|
extern uint16_t CurrentMode[MAX_PORT];
|
|
|
|
extern int16_t CallInProg;
|
|
extern int32_t BugTrapped;
|
|
|
|
extern MfgBlk *pMfgInfo;
|
|
extern DeviceCfgBlk *pDeviceInfo, *pDeviceInfoRom;
|
|
extern LoadHdr *pMyLoad, *pPriLoad, *pSecLoad;
|
|
extern int8_t *pMyPlatform;
|
|
extern int8_t *pMyPhoneModel;
|
|
extern DSPLoadHdr *pMyDSPLoad;
|
|
|
|
extern int32_t PhoneStim;
|
|
extern int32_t PhoneHookStim;
|
|
|
|
extern uint32_t IfActive;
|
|
extern volatile uint16_t VVLan, DCDetect, C3PODetected;
|
|
extern uint32_t MaxPort;
|
|
|
|
extern uint32_t BCastMax;
|
|
extern boolean Is7940;
|
|
extern boolean Is79x0G;
|
|
|
|
void PHNChangeState(uint16_t state);
|
|
uint16_t PHNGetState(void);
|
|
int32_t PHNStateToStringIndex(uint16_t PhoneState);
|
|
void PHNSpeakerMode(uint16_t mode);
|
|
void PHNMuteMode(uint16_t mode);
|
|
void PHNHeadsetMode(uint16_t mode);
|
|
void PHNRequestFile(int8_t *pName, uint8_t *pDest, int32_t maxSize);
|
|
void PHNMessageLedMode(uint16_t mode);
|
|
void PHNRingerLedMode(uint16_t mode);
|
|
void phone_reset(DeviceResetType resetType);
|
|
void platform_reset_req(DeviceResetType resetType);
|
|
void platform_sync_cfg_vers(char *configVersionStamp,
|
|
char *dialplanVersionStamp, char *);
|
|
int32_t phone_get_keypress_rand_seed(void);
|
|
int16_t phone_call_in_progress(void);
|
|
|
|
void tweak_watchdog(void);
|
|
extern uint32_t set_wd_timeout(uint16_t new_time);
|
|
extern void restore_wd_timeout(uint32_t prev_time);
|
|
|
|
#define DEFAULT_WATCHDOG_TIME 8
|
|
|
|
#define PROGRAM_HW_WATCHDOG_IN_MILLISECONDS(x); WDTimer = 0x00550000; \
|
|
WDTimer = 0x01AA0000 + ((x)); //Program the watchdog
|
|
|
|
#define HIT_THE_WATCHDOG() tweak_watchdog()
|
|
|
|
|
|
void BugInfoValidate(void);
|
|
uint32_t BugInfoAbortPtr(void);
|
|
|
|
|
|
int8_t *task2string(int32_t task_id);
|
|
|
|
#define EXCEPTION_BUGCODE 0xdd //BugTrap Code:0xddxx for exceptions
|
|
#define INITSTKSZ 500
|
|
#define SVCSTKSZ 40 // interrupt off (svc) stack size
|
|
|
|
|
|
/* SKITTLES moved syshdr for IPC from network.h. this will be the new home for
|
|
* SysHdr. it is used by all phone tasks and can not be plat specific.
|
|
*/
|
|
#define MISC_LN 8
|
|
typedef struct
|
|
{
|
|
void *Next;
|
|
uint32_t Cmd;
|
|
uint16_t RetID;
|
|
uint16_t Port;
|
|
uint16_t Len;
|
|
uint8_t *Data;
|
|
union {
|
|
void *UsrPtr;
|
|
uint32_t UsrInfo;
|
|
} Usr;
|
|
uint8_t Misc[MISC_LN];
|
|
// void *TempPtr;
|
|
} phn_syshdr_t;
|
|
|
|
/* SKITTLES The line below is only temporary till we
|
|
* change refernces to SysHdr.
|
|
*/
|
|
typedef phn_syshdr_t SysHdr;
|
|
|
|
/* settings.c needs it */
|
|
extern DHCPBlk *pDHCPInfoTemp;
|
|
|
|
extern SysHdr *pCFGTftpReq;
|
|
|
|
typedef struct {
|
|
char newcfgVerStamp[64];
|
|
char newdialplanVerStamp[64];
|
|
} PhoneSyncCfgVer;
|
|
|
|
#endif /* PHONE_H */
|