📄 qmc__ext.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 + -