| /** \file vp792_api.h |
| * vp792_api.h |
| * |
| * Header file that define all the commands for the Vp792 device. |
| * |
| * Copyright (c) 2010, Zarlink Semiconductor, Inc. |
| * |
| * $Revision: 8475 $ |
| * $LastChangedDate: 2011-04-05 11:30:04 -0500 (Tue, 05 Apr 2011) $ |
| */ |
| |
| #ifndef VP792_API_H |
| #define VP792_API_H |
| |
| #define VP792_MIN_SLAC_ID 0 |
| #define VP792_MAX_SLAC_ID 7 |
| |
| #define VP792_MAX_OUTSTANDING_RESPONSES 10 |
| |
| /* Maximum number of profiles of each type in the Profile Table: */ |
| #define VP_792_DEV_PROF_TABLE_SIZE 1 |
| #define VP_792_AC_PROF_TABLE_SIZE 2 |
| #define VP_792_DC_PROF_TABLE_SIZE 2 |
| #define VP_792_RINGING_PROF_TABLE_SIZE 2 |
| #define VP_792_TONE_CADENCE_PROF_TABLE_SIZE 11 |
| #define VP_792_TONE_PROF_TABLE_SIZE 10 |
| #define VP_792_RING_CADENCE_PROF_TABLE_SIZE 4 |
| #define VP_792_METERING_PROF_TABLE_SIZE 2 |
| #define VP_792_CALLERID_PROF_TABLE_SIZE 2 |
| |
| /* Maximum length of each type of profile (bytes): */ |
| #define VP792_DEV_PROFILE_LEN 45 |
| #define VP792_DC_PROFILE_LEN 44 |
| #define VP792_AC_PROFILE_LEN 128 |
| #define VP792_CID_PROFILE_LEN 200 |
| #define VP792_MTR_PROFILE_LEN 22 |
| #define VP792_TONE_PROFILE_LEN 32 |
| #define VP792_RINGCAD_PROFILE_LEN 72 |
| #define VP792_TONECAD_PROFILE_LEN 72 |
| #define VP792_RING_PROFILE_LEN 38 |
| |
| /* Lengths of profile sections that need to be stored or otherwise handled |
| * separately from the whole. (words) */ |
| #define VP792_AC_PROFILE_REGDATA_LEN 1 |
| #define VP792_DC_PROFILE_REGDATA_LEN 22 |
| #define VP792_RING_PROFILE_REGDATA_LEN 34 |
| |
| typedef enum |
| { |
| VP_792_SEQ_OFF, |
| VP_792_SEQ_RING, |
| VP_792_SEQ_TONE, |
| VP_792_SEQ_OTHER |
| } Vp792SequencerUseType; |
| |
| #include "vp_hal.h" |
| |
| /* Struct for the Profile Table: */ |
| typedef struct { |
| #define VP792_NUM_PROFILE_TYPES 9 |
| uint16 valid[VP792_NUM_PROFILE_TYPES]; |
| |
| #ifdef VP_COMMON_ADDRESS_SPACE |
| /* We only need to save profile pointers in the device object. */ |
| VpProfilePtrType pDevice[VP_792_DEV_PROF_TABLE_SIZE]; |
| VpProfilePtrType pAc[VP_792_AC_PROF_TABLE_SIZE]; |
| VpProfilePtrType pDc[VP_792_DC_PROF_TABLE_SIZE]; |
| VpProfilePtrType pRinging[VP_792_RINGING_PROF_TABLE_SIZE]; |
| VpProfilePtrType pRingCad[VP_792_RING_CADENCE_PROF_TABLE_SIZE]; |
| VpProfilePtrType pTone[VP_792_TONE_PROF_TABLE_SIZE]; |
| VpProfilePtrType pMetering[VP_792_METERING_PROF_TABLE_SIZE]; |
| VpProfilePtrType pCallerId[VP_792_CALLERID_PROF_TABLE_SIZE]; |
| VpProfilePtrType pToneCad[VP_792_TONE_CADENCE_PROF_TABLE_SIZE]; |
| #else |
| /* Profiles must be copied into the device object. */ |
| VpProfileDataType device[VP_792_DEV_PROF_TABLE_SIZE][VP792_DEV_PROFILE_LEN]; |
| VpProfileDataType ac[VP_792_AC_PROF_TABLE_SIZE][VP792_AC_PROFILE_LEN]; |
| VpProfileDataType dc[VP_792_DC_PROF_TABLE_SIZE][VP792_DC_PROFILE_LEN]; |
| VpProfileDataType ringing[VP_792_RINGING_PROF_TABLE_SIZE][VP792_RING_PROFILE_LEN]; |
| VpProfileDataType ringCad[VP_792_RING_CADENCE_PROF_TABLE_SIZE][VP792_RINGCAD_PROFILE_LEN]; |
| VpProfileDataType tone[VP_792_TONE_PROF_TABLE_SIZE][VP792_TONE_PROFILE_LEN]; |
| VpProfileDataType metering[VP_792_METERING_PROF_TABLE_SIZE][VP792_MTR_PROFILE_LEN]; |
| VpProfileDataType callerId[VP_792_CALLERID_PROF_TABLE_SIZE][VP792_CID_PROFILE_LEN]; |
| VpProfileDataType toneCad[VP_792_TONE_CADENCE_PROF_TABLE_SIZE][VP792_TONECAD_PROFILE_LEN]; |
| #endif |
| |
| } Vp792ProfileTableType; |
| |
| typedef enum |
| { |
| VP792_REQUEST_SET_REL_GAIN, |
| VP792_REQUEST_GET_LOOP_COND, |
| VP792_REQUEST_GET_OPTION, |
| VP792_REQUEST_DEVICE_IO_ACCESS_EXT, |
| VP792_REQUEST_LINE_IO_ACCESS, |
| VP792_REQUEST_QUERY, |
| VP792_REQUEST_LOW_LEVEL_CMD_16, |
| VP792_REQUEST_SENDSIG_MSGWAIT, |
| VP792_REQUEST_TEST_INTERNAL, |
| VP792_REQUEST_TEST_CMP, |
| VP792_REQUEST_TIMER_CMP, |
| VP792_REQUEST_REGISTER_DUMP |
| } Vp792RequestTagType; |
| |
| /* Struct for information about pending responses (used in |
| VpGetResults()): */ |
| typedef struct { |
| bool outstanding; |
| |
| Vp792RequestTagType requestType; |
| |
| union { |
| struct { |
| uint16 handle; |
| uint8 channelId; |
| } setRelGain; |
| |
| struct { |
| uint16 handle; |
| uint8 channelId; |
| } getLoopCond; |
| |
| struct { |
| uint16 handle; |
| uint8 channelId; |
| VpOptionIdType optionId; |
| } getOption; |
| |
| struct { |
| VpDeviceIoAccessExtType deviceIoAccess; |
| } deviceIoAccessExt; |
| |
| struct { |
| uint16 handle; |
| VpLineIoAccessType lineIoAccess; |
| } lineIoAccess; |
| |
| struct { |
| uint16 handle; |
| uint8 channelId; |
| VpQueryIdType queryId; |
| } query; |
| |
| struct { |
| uint16 handle; |
| uint8 channelId; |
| VpLowLevelCmdType cmdType; |
| uint16 writeWords[2]; |
| uint8 numWriteWords; |
| uint8 numReadWords; |
| } lowLevelCmd16; |
| |
| struct { |
| uint16 eventId; |
| uint16 handle; |
| uint8 channelId; |
| uint16 respSize; |
| uint16 cmdId; |
| } testLine; |
| |
| struct { |
| uint16 handle; |
| uint8 channelId; |
| bool internal; |
| } genTimer; |
| |
| struct { |
| uint8 channelId; |
| uint8 commandId; |
| uint8 numReadWords; |
| } registerDump; |
| } args; |
| } Vp792ResponseRequestType; |
| |
| typedef struct { |
| uint32 opaqueData[2400]; |
| } Vp792OpaquePmDevObjType; |
| |
| /* Vp792-specific Device Object */ |
| typedef struct { |
| /* Customer-defined device identifier struct, passed to HAL functions: */ |
| VpDeviceIdType deviceId; |
| |
| /* Slac identifier mapped with VpMapSlacId(). This member allows for |
| multiple device objects to share a common deviceId (which is the case |
| when they share a chip-select on the SPI bus). */ |
| uint8 slacId; |
| |
| /* Total number of channels controlled by this device: */ |
| uint8 maxChannels; |
| |
| /* SLAC revision info */ |
| struct { |
| uint16 device; |
| uint16 product; |
| uint16 version; |
| uint32 patchAddress; |
| } rev; |
| |
| /* A flag indicating whether VpInitDevice() has completed: */ |
| bool devInit; |
| |
| /* The Profile Table: */ |
| Vp792ProfileTableType profTable; |
| |
| /* PCM Clock Rate in units of 1KHz */ |
| uint16 pcmClockRate; |
| |
| /* High bits of the VP-API-II timestamp. We maintain the high bits here |
| because the SLAC's timestamp has finer granularity. */ |
| uint16 timeStampHiBits; |
| |
| /* Struct for locally-maintained device-specific options: */ |
| struct { |
| VpOptionCriticalFltType criticalFlt; |
| VpOptionEventMaskType eventMask; |
| uint16 pulseEnabled; |
| uint16 dtmfEnabled; |
| VpOptionParkModeType parkMode; |
| uint32 debugSelect; |
| } options; |
| |
| /* Temporary storage for interrupt indication, while command mailbox is busy. */ |
| uint16 intInd[2]; |
| |
| /* Array for keeping track of outstanding response requests: */ |
| Vp792ResponseRequestType responseRequest[VP792_MAX_OUTSTANDING_RESPONSES]; |
| |
| /* Index (in the above array) of the next result to be returned by |
| VpGetResults(): */ |
| uint16 requestIdx; |
| |
| /* SLAC response mailbox cache (temporary storage used in cases of mailbox |
| congestion, where we need to empty the response mailbox before we can |
| issue another command in the command mailbox): */ |
| struct { |
| uint8 count; /* When the cache is nonempty, count > 0. */ |
| #define VP792_MAX_RSPSIZE 42 |
| uint16 data[2][VP792_MAX_RSPSIZE]; |
| } respMboxCache; |
| |
| /* Bitmask indicating which device-specific event handlers are running. */ |
| uint16 eventHandlers; |
| |
| /* State variables for EhInitDevice() event handler: */ |
| struct { |
| |
| #ifdef VP_COMMON_ADDRESS_SPACE |
| /* We only need to save profile pointers in the line object. */ |
| VpProfilePtrType pDevProfile; |
| VpProfilePtrType pAcProfile; |
| VpProfilePtrType pDcProfile; |
| VpProfilePtrType pRingProfile; |
| #else |
| /* Profiles must be copied into the line object. */ |
| uint16 profilesValid; |
| VpProfileDataType devProfile[VP792_DEV_PROFILE_LEN]; |
| VpProfileDataType acProfile[VP792_AC_PROFILE_LEN]; |
| VpProfileDataType dcProfile[VP792_DC_PROFILE_LEN]; |
| VpProfileDataType ringProfile[VP792_RING_PROFILE_LEN]; |
| #endif |
| |
| } ehInitDevice; |
| |
| #ifdef VP792_INCLUDE_TESTLINE_CODE |
| Vp792OpaquePmDevObjType opaquePmDevObj; |
| #endif |
| |
| } Vp792DeviceObjectType; |
| |
| /* Vp792-specific Line Object */ |
| typedef struct |
| { |
| |
| /* Number used by the Vp792 to uniquely identify this line: */ |
| uint8 channelId; |
| |
| /* Line termination type: */ |
| VpTermType termType; |
| |
| /* Customer-defined line identifier struct, returned in the event |
| * structure by VpGetEvent() when an event occurs on this line: */ |
| VpLineIdType lineId; |
| |
| /* A flag indicating whether VpInitLine() has completed: */ |
| bool lineInit; |
| |
| /* Struct for locally-maintained line-specific options: */ |
| struct { |
| VpOptionDtmfModeControlType dtmfControlMode; |
| VpOptionZeroCrossType zeroCross; |
| VpOptionPulseModeType pulseMode; |
| VpOptionEventMaskType eventMask; |
| VpOptionRingControlType ringControl; |
| VpOptionPcmTxRxCntrlType pcmTxRxCntrl; |
| VpOptionLoopbackType loopback; |
| uint16 afeConfig; /* cached AFE_CONFIG value for loopback option */ |
| uint32 debugSelect; |
| } options; |
| |
| struct { |
| #ifdef VP_COMMON_ADDRESS_SPACE |
| /* We only need to save profile pointers in the line object. */ |
| VpProfilePtrType pAc; |
| VpProfilePtrType pDc; |
| VpProfilePtrType pRinging; |
| VpProfilePtrType pRingCad; |
| VpProfilePtrType pTone; |
| VpProfilePtrType pMetering; |
| VpProfilePtrType pCallerId; |
| VpProfilePtrType pToneCad; |
| #else |
| /* Profiles must be copied into the line object. */ |
| uint16 valid; |
| VpProfileDataType ac[VP792_AC_PROFILE_LEN]; |
| VpProfileDataType dc[VP792_DC_PROFILE_LEN]; |
| VpProfileDataType ringing[VP792_RING_PROFILE_LEN]; |
| VpProfileDataType ringCad[VP792_RINGCAD_PROFILE_LEN]; |
| VpProfileDataType tone[VP792_TONE_PROFILE_LEN]; |
| VpProfileDataType metering[VP792_MTR_PROFILE_LEN]; |
| VpProfileDataType callerId[VP792_CID_PROFILE_LEN]; |
| VpProfileDataType toneCad[VP792_TONECAD_PROFILE_LEN]; |
| #endif |
| |
| } profiles; |
| |
| /* Bitmask indicating which line-specific event handlers are running. */ |
| uint16 eventHandlers; |
| |
| /* State variables for EhSetLineState() event handler: */ |
| struct { |
| bool waitForMeterAbort; |
| bool waitForSequencerReady; |
| VpLineStateType newState; |
| } ehSetLineState; |
| |
| /* Current API line state */ |
| VpLineStateType currentState; |
| |
| /* Currently-detected ongoing DTMF digit (if any): */ |
| uint16 dtmfDigitDetected; |
| |
| /* Sequencer state variables: */ |
| struct { |
| |
| /* If a sequencer-abort command has been sent to the SLAC, but the |
| VP792_EVID_SEQ event has not yet arrived, this is TRUE. */ |
| bool aborting; |
| |
| /* Event handlers which will be started only after the current |
| sequence is aborted: */ |
| uint16 deferredHandlers; |
| |
| /* Keeps track of what, if anything, is using the sequencer. */ |
| Vp792SequencerUseType activeSequence; |
| |
| /* Buffer for holding a new sequencer program while we wait for the |
| old sequence to be aborted: */ |
| #define _VP792_CMDSIZE_WR_SEQ_CTL 35 |
| uint16 program[_VP792_CMDSIZE_WR_SEQ_CTL]; |
| |
| /* Register values are cached here during hook mask and RX-disable |
| intervals: */ |
| uint16 lastDsh; |
| uint16 lastVpCfg2; |
| |
| bool hookMaskInterval; |
| } sequencer; |
| |
| /* State variables for VpSendSignal(): */ |
| struct { |
| |
| /* Stores the ongoing send signal type (if any), and the one that will |
| be applied when the sequencer becomes available. */ |
| VpSendSignalType currentSignal; |
| VpSendSignalType newSignal; |
| |
| /* Stores the value that was in the DRIVE_ST variable before the signal |
| started. */ |
| uint16 driveSt; |
| |
| /* State variables for Vp792SendSignal(VP_SENDSIG_MSG_WAIT_PULSE): */ |
| struct { |
| int16 voltage; |
| |
| struct { |
| struct { |
| uint16 v1; |
| uint16 vas; |
| uint16 ila; |
| } on; |
| struct { |
| uint16 v1; |
| uint16 vas; |
| uint16 ila; |
| } off; |
| |
| uint16 vasOffset; |
| uint16 rfd; |
| uint16 rptc; |
| } dcParams; |
| |
| bool readingDcParams; |
| bool aborting; |
| |
| uint16 requestIdx; /* for RD_DC_PARAMS request */ |
| } msgWait; |
| } sendSig; |
| |
| /* Caller ID state variables */ |
| struct { |
| |
| /* Currently active Caller ID profile. This will be the same as |
| profiles.pCidProfile if VpInitRing() was called, but it will be |
| different if VpSendCid() was called. */ |
| #ifdef VP_COMMON_ADDRESS_SPACE |
| VpProfilePtrType pCidProfile; |
| #else |
| uint16 cidProfileValid; |
| VpProfileDataType cidProfile[VP792_CID_PROFILE_LEN]; |
| #endif |
| |
| /* Sending data using FSK or DTMF? */ |
| bool isFsk; |
| |
| /* FSK data state */ |
| struct { |
| /* Whether the API should compute the checksum */ |
| bool autoChecksum; |
| |
| /* SLAC device buffer status bits */ |
| uint8 bufStatus; |
| |
| /* Preamble */ |
| uint16 seizureBits; |
| uint16 markBits; |
| |
| uint8 checksum; |
| } fsk; |
| |
| struct { |
| /* Message data buffer */ |
| bool nonempty; |
| uint8 buf[VP_SIZEOF_CID_MSG_BUFFER * 2]; |
| uint8 head; |
| uint8 tail; |
| } data; |
| |
| bool dtmfDetectInterval; |
| uint8 dtmfTones[2]; |
| } callerId; |
| |
| /* Metering state variables */ |
| struct { |
| bool active; |
| uint16 eventRate; |
| } metering; |
| } Vp792LineObjectType; |
| |
| /* Vp792 Group Device Object */ |
| |
| typedef struct |
| { |
| |
| VpDeviceIdType deviceId; |
| |
| /* Temporary storage for interrupt indication, while mailbox is busy. */ |
| uint16 intInd[2]; |
| |
| } Vp792GroupDeviceObjectType; |
| |
| #endif /* VP792_API_H */ |