media/webrtc/signaling/src/sipcc/core/includes/phone.h
author Phil Ringnalda <philringnalda@gmail.com>
Mon, 08 Dec 2014 20:53:07 -0800
changeset 218811 960303b07c909e69db87467d0b499351d65c82af
permissions -rw-r--r--
Backed out 10 changesets (bug 1091242) for Android/b2g non-unified build bustage CLOSED TREE Backed out changeset 7f72b55c5de7 (bug 1091242) Backed out changeset f1501aa24397 (bug 1091242) Backed out changeset 7fde5994aee5 (bug 1091242) Backed out changeset 59b415714087 (bug 1091242) Backed out changeset dadb65fedc08 (bug 1091242) Backed out changeset 21be81424e4e (bug 1091242) Backed out changeset 498fb1dafba5 (bug 1091242) Backed out changeset 8d0653eb85ab (bug 1091242) Backed out changeset c82d484e135a (bug 1091242) Backed out changeset 3e0c8932f1b1 (bug 1091242)

/* 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 */