📄 t38fax.c
字号:
/*printf("Port 0x%08x %s FAX Relay %s\n", gPort, pDir, "SEP");*/
faxDebug(dbgClass, gPort, " %s FAX Relay %s\n", pDir, "SEP (Selective polling)");
break;
case T38_FAX_STATE_SUB0:
case T38_FAX_STATE_SUB1:
/*printf("Port 0x%08x %s FAX Relay %s\n", gPort, pDir, "SUB");*/
faxDebug(dbgClass, gPort, " %s FAX Relay %s\n", pDir, "SUB (Subaddress)");
break;
case T38_FAX_STATE_TSI0:
case T38_FAX_STATE_TSI1:
/*printf("Port 0x%08x %s FAX Relay %s\n", gPort, pDir, "TSI");*/
faxDebug(dbgClass, gPort, " %s FAX Relay %s\n", pDir, "TSI (Transmitting subscriber identification)");
break;
default :
break;
}
}
else
{
switch(faxRelayState & 0xFF)
{
case 0x00:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "Idle");
break;
case 0x01:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "No signal message from IP--entered idle");
break;
case 0x02:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CNG received from PCM");
break;
case 0x03:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CNG sent to PCM from IP");
break;
case 0x04:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CED received from PCM");
break;
case 0x05:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "CED sent to PCM from IP");
break;
/* 统计实际协商出的速率的debug信息 */
case T38_FAX_SPEED_2400_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 2400 demodulation");
break;
case T38_FAX_SPEED_2400_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 2400 remodulation");
break;
case T38_FAX_SPEED_4800_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 4800 demodulation");
break;
case T38_FAX_SPEED_4800_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.27 ter 4800 remodulation");
break;
case T38_FAX_SPEED_7200_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 7200 demodulation");
break;
case T38_FAX_SPEED_7200_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 7200 remodulation");
break;
case T38_FAX_SPEED_9600_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 9600 demodulation");
break;
case T38_FAX_SPEED_9600_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.29 9600 remodulation");
break;
case T38_FAX_SPEED_7200_S_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 short train demodulation");
break;
case T38_FAX_SPEED_7200_S_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 short train remodulation");
break;
case T38_FAX_SPEED_7200_L_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 long train demodulation (V.33)");
break;
case T38_FAX_SPEED_7200_L_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 7200 long train remodulation (V.33)");
break;
case T38_FAX_SPEED_9600_S_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 short train demodulation");
break;
case T38_FAX_SPEED_9600_S_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 short train remodulation");
break;
case T38_FAX_SPEED_9600_L_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 long train demodulation (V.33)");
break;
case T38_FAX_SPEED_9600_L_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 9600 long train demodulation (V.33)");
break;
case T38_FAX_SPEED_12000_S_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 short train demodulation");
break;
case T38_FAX_SPEED_12000_S_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 short train remodulation");
break;
case T38_FAX_SPEED_12000_L_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 long train demodulation (V.33)");
break;
case T38_FAX_SPEED_12000_L_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 12000 long train remodulation (V.33)");
break;
case T38_FAX_SPEED_14400_S_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 short train demodulation");
break;
case T38_FAX_SPEED_14400_S_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 short train remodulation");
break;
case T38_FAX_SPEED_14400_L_DE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 long train demodulation (V.33)");
break;
case T38_FAX_SPEED_14400_L_RE:
faxDebug(dbgClass, gPort, " FAX Relay %s\n", "V.17 14400 long train remodulation (V.33)");
break;
default :
break;
}
}
}
/*-----------------------------
* destroyChannel - 清除一个通道,
*
* Description:
*
* Argument:
* int portNo - portNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
*
* Return:
*
* Modified history
*------------------------------
* 2006-3-20 17:13 ZhengaQishan Created.
*
**/
int destroyChannel(int portNo)
{
int result = SENDTOM803xxOK;
result = (int)Disable_Channel_Processing((UINT8)portNo);
m_port[portNo].status = SWITCH_TYPE;
if (SENDTOM803xxOK == result)
{
result = sendSuperMsg(CMD_DESTROY_CHAN | 0xFF, (m_port[portNo].Channel)%PORTS_OF_CHIP, 0,0, (UINT8)portNo);
}
else
{
printf("destroyChannel: Disable Channel VOPENA is failed!\n");
}
return(result);
}
/*-----------------------------
* createChannel - 创建一个T.38 FAX 通道,
*
* Description:
*
* Argument:
* int portNo - portNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
* TYPE_OF_CHANNEL type - 通道类型
* Return:
*
* Modified history
*------------------------------
* 2006-3-20 17:13 ZhengaQishan Created.
*
**/
int createChannel(int portNo, TYPE_OF_CHANNEL type)
{
int result = SENDTOM803xxOK;
int chanType;
if (T38_FAX_CHAN == type)
{
gpT38FaxParameter[portNo]->bearerInformation = CODER_TYPE_T38;
chanType = 0x007; /*switch to T38 FAX Mode*/
}
else if(VOICE_CHAN == type)
{
chanType = 0x0002; /*switch to voice Mode*/
}
else
return (ERROR_ARGUMENT);
result = sendSuperMsg( CMD_CREATE_CHAN | 0xFF, (UINT16)chanType, (m_port[portNo].Channel)%PORTS_OF_CHIP,0, (UINT8)portNo);
if (SENDTOM803xxOK == result)
{
if (T38_FAX_CHAN == type)
{
/*通道切换成功后,要使能通道*/
if (SENDTOM803xxOK == result)
OpenChannel((UINT8)portNo, 1);
else
printf("createChannel: set FAX operation is failed!\n");
}
}
else
printf("createChannel: create Chan is failed!\n");
if (SENDTOM803xxOK != result)
printf("createChannel: open chan is failed!\n");
return(result);
}
/*-----------------------------
* sendMsgForChangeChanType - 切换通道的类型(T.38 FAX or Voice)
*
* Description:
*
* Argument:
* Argument : msg -- Message ID of Message
* p0 -- Parameter 1 of Messge
* p1 -- Parameter 2 of Message
* p2 -- Parameter 3 of Message
* PortNo -- No. Of The Specified Port
*
* 说明:
* 以前的驱动代码以portNo为参数,它们之间的关系是: portNo = (slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
* Return:
*
* Modified history
*------------------------------
* 2006-3-18 10:13 ZhengaQishan Created.
*
**/
int sendSuperMsg(UINT16 msg, UINT16 p0, UINT16 p1, UINT16 p2, UINT8 portNo)
{
UINT16 put, *TxBoxBase;
int Return_Flag = SENDTOM803xxOK;
#if SEM_FLAG
semTake(M803xxQueueSem[portNo/8], WAIT_FOREVER);
#endif
put = m_OpenChannelMailboxQueue[portNo].QPut;
if(m_OpenChannelMailboxQueue[portNo].QCount < m_OpenChannelMailboxQueue[portNo].QSize)
{
TxBoxBase = (UINT16 *)m_OpenChannelMailboxQueue[portNo].QAddr;
TxBoxBase[put++] = p2;
TxBoxBase[put++] = p1;
TxBoxBase[put++] = p0;
TxBoxBase[put++] = msg;
if(M80320_Debug[portNo] == 1)
M80320_PRINTF("channel %d change mode!\n\n",p0);
/*超过总长,就清0,此队列的消息必须4bytes对齐*/
if (put >= m_OpenChannelMailboxQueue[portNo].QSize)
put = 0;
m_OpenChannelMailboxQueue[portNo].QPut = put;
m_OpenChannelMailboxQueue[portNo].QCount += 4;
if((M80320_OpenChanMsgFlag == 1) && (drv_DebugPortNo == portNo))
printf("PortNo(%d) (Snd) Msg: 0x%-8x P0: 0x%-8x, P1: 0x%-8x, P2: 0x%-8x\n", portNo, msg, p0, p1, p2);
if((m_port[portNo].tx_cmd_requested == 1)&&
(PinStatus[CON_TO_DP[m_port[portNo].Channel].chip] == TRUE)&&
(m_port[portNo].Ackok == 1))
{
if(SendFlag[portNo] == 0)
{
SendFlag[portNo] = 1;
if (ERROR == fwdJobAdd ((FUNCPTR)SendMBoxMessage, (int)(CON_TO_DP[m_port[portNo].Channel].chip)&0xff,0,(int)portNo,0,0))
{
if(M80320_Debug[portNo] == 1)
M80320_PRINTF("Port %d JobAdd Err\n", m_port[portNo].Channel);
}
}
else
{
if(M80320_Debug[portNo] == 1)
M80320_PRINTF("SendMsgToOpenChannelQueue: SendFlag[%d] = 1\n", portNo);
}
}
}
else
{
OpenChanMsgFull[portNo]++;
printf("PortNo %d is full!\n", portNo);
Return_Flag = OPEN_QUEUE_FULL;
}
#if SEM_FLAG
semGive(M803xxQueueSem[portNo/8]);
#endif
return Return_Flag;
}
/*-----------------------------
* changeChanType - 切换通道的类型(T.38 FAX or Voice)
*
* Description:
*
* Argument:
* UINT8 portNo - 等于(slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
* TYPE_OF_SWITCH type - 改变的类型
*
* 说明:
* 以前的驱动代码以portNo为参数,它们之间的关系是: portNo = (slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
* Return:
*
* Modified history
*------------------------------
* 2006-3-18 10:13 ZhengaQishan Created.
*
**/
int changeChanType(UINT8 portNo, TYPE_OF_SWITCH type)
{
UINT16 mode;
int result = SENDTOM803xxOK;
#if 0
if (((m_port[portNo].ExpectServiceType == Fax) && (type == SWITCH_TO_T38_FAX)) ||
((m_port[portNo].ExpectServiceType == Voice) && (type == SWITCH_TO_VOICE)))
return(result);
#endif
if(m_port[portNo].Active != LFXS_DOWN)
result = Disable_Channel_Processing(portNo);
switch(type)
{
case SWITCH_TO_T38_FAX:
m_port[portNo].ExpectServiceType = Fax;
gpT38FaxParameter[portNo]->bearerInformation = CODER_TYPE_T38;
mode = 0x0007;
break;
case SWITCH_TO_VOICE:
m_port[portNo].ExpectServiceType = Voice;
/*切换到语音通道,此参数与用户配置有关*/
mode = 0x0002;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -