⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmc__ext.c

📁 基于vxworks操作系统的电话语音平台系统
💻 C
字号:
/************************************************************************/
/*                                                              		*/
/*                                                              		*/
/* (C) Copyright Bangyan Information Technology Ltd, 2000/9.            */
/*  All right reserved                                          		*/
/*                                                              		*/
/* Author: Zhuguosheng 	                                  				*/
/*                                                              		*/
/* Description:                                                 		*/
/*     Driver Set - QMC hdlc specific routines.            				*/
/*                                                              		*/
/* Routines                                                     		*/
/*                                                              		*/
/************************************************************************/

#include "PUB\PUB_INCL.H"
#include "PUB\PUB__MSG.H"
#include "PUB\MODULERS.H"
#include "PUB\PUB_Defi.H"
#include "DRVS\DRV860\PUB\NETCOMM.H"
#include "DRVS\DRV860\PUB\D860_PUB.H"
#include "DRVS\DRV860\PUB\MPC860.H"
#include "DRVS\DRV860\PUB\MASKS860.h"
#include "DRVS\DRV860\QMC\QMC.H"

#ifdef _VXWORKS_RTOS
extern SEM_ID SemQMCHdlcSend_ID[64];
#endif


extern UC LedSwitchOnOrOff( UC action, UC led );
extern VOID SendLetterToMail(UC sender,UC receiver,UC msg_type,UI port_num,UI len,VOID *data);

extern BOOL HTBIsMpuActive( VOID );
extern BOOL IsFromMpu( UC channel_num );
extern VOID HTB_Proc( UC *recvmsg );

extern UC QmcIsReinitiating;

/*Extern function from file COMM\COM_PROC.C*/
extern VOID CommHdlcRecvMsuHdl(UI hdlc,UI len,VOID*data);




extern VOID InitQmcScc(VOID);
extern SI hdlc_qmc_tx(SI channel_num, VOID *buf, SI length, SI int_ena);
extern VOID qmc_mgr_interrupt(SI scc_num);
extern QMC_TABLE        qmc_table;

BOOL DrvQmcInitiate( VOID );
BOOL DrvQmcSendMsu( SI channel_num, VOID *buf, SI length );
VOID DrvRecvMsu( SI channel_num, VOID *buf, SI length );


BOOL DrvQmcInitiate( VOID )
{
	UC i;

	for( i=0; i<NUM_OF_CHANNELS; i++ )
	{
	       ClearWatchDog();
		qmc_table[i].init_flag = 0;
	}
	scc_init( GLB_SCC_0, 0, 0 );
	scc_init( GLB_SCC_3, 0, 0 );

	InitQmcScc();

/*#define QMC_HDLC_LOOPBACK*/
#ifdef QMC_HDLC_LOOPBACK
	scc_loopback(GLB_SCC_0);
	scc_loopback(GLB_SCC_3);
#endif

	scc_start(GLB_SCC_0);
	scc_start(GLB_SCC_3);

	return TRUE;
}

BOOL DrvQmcSendMsu( SI channel_num, VOID *buf, SI length )
{
	UC i;
	UC *SMsg;
	char temp_str[30];
	char msg_str[300] = "QMC Send:";

	if( QmcIsReinitiating==0 )
	{
#ifdef _VXWORKS_RTOS
		semTake(SemQMCHdlcSend_ID[channel_num],WAIT_FOREVER);
#endif

		#if 1
		if(length<300)
		{
			SMsg=(UC*)buf;
			sprintf(temp_str, " chan%d [len=%d]", channel_num, length);
			strcat(msg_str, temp_str);
			for(i=0; i<20 && i<length; i++)
			{
				sprintf(temp_str, " %02X", SMsg[i]);
				strcat(msg_str, temp_str);
			}
			if(channel_num>18 && channel_num<40)
				BYPrintf(msg_str);
		}
		#endif

		hdlc_qmc_tx(channel_num, buf, length, 1);

#ifdef _VXWORKS_RTOS
		semGive(SemQMCHdlcSend_ID[channel_num]);
#endif
	}
}

VOID DrvRecvMsu( SI channel_num, VOID *buf, SI length )
{
	UC i;
	UC* Msg;
	char temp_str[30];
	char msg_str[300] = "QMC Recv:";

	if( IsFromMpu( channel_num ) )	/*如果是从另一个mpu的数据*/
	{
		HTB_Proc(buf);		/*HTB入口函数*/
		LedSwitchOnOrOff( 1, 1 );
		return;
	}else
	{
		if( !HTBIsMpuActive() )		/*如果是备用板,则屏蔽该事件*/
			return;
	}

	#if 1
	if(length<300)
	{
		Msg=(UC*)buf;
		sprintf(temp_str, " chan%d [len=%d]", channel_num, length);
		strcat(msg_str, temp_str);
		for(i=0; i<20 && i<length; i++)
		{
			sprintf(temp_str, " %02X", Msg[i]);
			strcat(msg_str, temp_str);
		}
		if(channel_num>18 && channel_num<40)
			BYPrintf(msg_str);
	}
	#endif

	if( QmcIsReinitiating==0 )
	{
		if( channel_num < MAX_BRDS_PER_MOD )
			LedSwitchOnOrOff( 1, 1 );
		else 
			LedSwitchOnOrOff( 1, 2 );

		CommHdlcRecvMsuHdl(channel_num, length, buf);
	}
}

VOID QmcPollingEvtHdl(VOID)
{
	if( QmcIsReinitiating==0 )
	{
		qmc_mgr_interrupt(GLB_SCC_0);
		qmc_mgr_interrupt(GLB_SCC_3);
	}
}


UL GetShortPacketNumber( UI hdlc )
{
	return QmcShortPacketNum[hdlc];
}

UL GetCrcErrorNumber( UI hdlc )
{
	return QmcCrcErrorNum[hdlc];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -