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

📄 nib.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
字号:
/*-------------------------------------------------------*/
/* nib.c                                                 */
/*-------------------------------------------------------*/
#include "nib.h"
#include "structure.h"
#include "command.h"
#include "psos.h"


#define SBOX_BASE_ADDR 0x100

unsigned char BufToReportNibStatePanel[64];
unsigned char BufToReportNibStateNM[64];

extern System_Data   SystemData;
extern void my_Delay(unsigned long int dly_ms);
extern unsigned char PanelOK;
extern unsigned char Connected; 

static unsigned char Sbox[256] =
{ 58, 234, 104, 254,  51, 233, 136,  26,
 131, 207, 225, 127, 186, 226,  56,  18,
 232,  39,  97, 149,  12,  54, 229, 112,
 162,   6, 130, 124,  23, 163,  38,  73,
 190, 122, 109,  71, 193,  81, 143, 243,
 204,  91, 103, 189, 205,  24,   8, 201,
 255, 105, 239,   3,  78,  72,  74, 132,
  63, 180,  16,   4, 220, 245,  92, 198,
  22, 171, 172,  76, 241, 106,  47,  60,
  59, 212, 213, 148, 208, 196,  99,  98,
 113, 161, 249,  79,  46, 170, 197,  86,
 227,  57, 147, 206, 101, 100, 228,  88,
 108,  25,  66, 121, 221, 238, 150, 246,
 138, 236,  30, 133,  83,  69, 222, 187,
 126,  10, 154,  19,  42, 157, 194,  94,
  90,  31,  50,  53, 156, 168, 115,  48,
  41,  61, 231, 146, 135,  27,  43,  75,
 165,  87, 151,  64,  21, 230, 188,  14,
 235, 195,  52,  45, 184,  68,  37, 164,
  28, 199,  35, 237, 144, 110,  80,   0,
 153, 158,  77, 217, 218, 141, 111,  95,
  62, 215,  33, 116, 134, 223, 107,   5,
 142,  93,  55,  17, 210,  40, 117, 214,
 167, 119,  36, 191, 240, 176,   2, 183,
 248, 252, 129,   9, 177,   1, 118, 145,
 125,  15, 200, 160, 242, 203, 120,  96,
 209, 247, 224, 181, 152,  34, 179,  32,
  29, 166, 219, 123,  89, 159, 174,  49,
 251, 211, 182, 202,  67, 114,   7, 244,
 216,  65,  20,  85,  13,  84, 139, 185,
 173,  70,  11, 175, 128,  82,  44, 250,
 140, 137, 102, 253, 178, 169, 155, 192};

void WriteSBox(void)
{
	int i;

	for(i=0;i<256;i++)
	{
		NIB_ADDRESS_LOW_REG =i;
		NIB_ADDRESS_HIGH_REG=1;

		NIB_DATA_LOW_REG    =Sbox[i];
		NIB_DATA_HIGH_REG   =0;

		NIB_ACTION_REG      =0;
	}


	NIB_ADDRESS_LOW_REG =16;
	NIB_ADDRESS_HIGH_REG=0;

	NIB_DATA_LOW_REG    =1;
	NIB_DATA_HIGH_REG   =0;

	NIB_ACTION_REG      =0;
}

int TestNib(void)
{
	unsigned char volatile TestVal;

	NIB_TEST_REG=0x55;	
	TestVal=NIB_TEST_REG;
	if(TestVal!=0x55)
		return -1;

	NIB_TEST_REG=0xAA;	
	TestVal=NIB_TEST_REG;
	if(TestVal!=0xAA)
		return -1;

	return 0;
}

void ResetNib(void)
{
	int volatile i;	
	
	NIB_RESET_REG=0;
	
	/*for(i=0;i<10000;i++);*/

	my_Delay(10);/*by xu*/

	NIB_RESET_REG=1;
}
unsigned char GetNibVer(void)
{
	return NIB_VERSION_REG;
	/*return 0x20;*/
	/*return 0x10;*/
}

void Config_Nib(void)
{
	int            i;
	unsigned short Reg;
	unsigned char  RegChar;

	unsigned short DeltaList[]={0,20,40,80,160,320};

	/*-------------------------------------------------------*/
	/* E3/DS3接口                                            */
	/*-------------------------------------------------------*/
	RegChar             =SystemData.NetworkPort.E3DS3Type;
	NIB_ADDRESS_LOW_REG =3;
	NIB_ADDRESS_HIGH_REG=0;

	NIB_DATA_LOW_REG    =RegChar;
	NIB_DATA_HIGH_REG   =0;

	NIB_ACTION_REG      =0;
	/*-------------------------------------------------------*/
	/* ASI 码率                                              */
	/*-------------------------------------------------------*/
	/*Reg=27000 * 8 * 188 / (SystemData.NetworkPort.ASIRate*100) - 1;*/
	/*Reg=27000 * 8 * 188 / (SystemData.NetworkPort.ASIRate*100);*/
	Reg=(unsigned short)(270UL * 8 * 188 / SystemData.NetworkPort.ASIRate);
	NIB_ADDRESS_LOW_REG =0;
	NIB_ADDRESS_HIGH_REG=0;
	NIB_DATA_LOW_REG    =(unsigned char)(Reg&0xFF);
	NIB_DATA_HIGH_REG   =(unsigned char)((Reg&0xFF00)>>8);
	NIB_ACTION_REG      =0;

	/*-------------------------------------------------------*/
	/* 2004-12-20 修改,适应baco的扰码器                   */
	/*-------------------------------------------------------*/
	if(SystemData.NetworkPort.ASIRate>500)
	{
		NIB_ADDRESS_LOW_REG =0x11;
		NIB_ADDRESS_HIGH_REG=0;
		NIB_DATA_LOW_REG    =1;               /*NIB_DATA_LOW_REG    =0; by xu*/
		NIB_DATA_HIGH_REG   =0;
		NIB_ACTION_REG      =0;
	}
	else
	{
		NIB_ADDRESS_LOW_REG =0x11;
		NIB_ADDRESS_HIGH_REG=0;
		NIB_DATA_LOW_REG    =1;
		NIB_DATA_HIGH_REG   =0;
		NIB_ACTION_REG      =0;
	}

	/*-------------------------------------------------------*/
	/* PCR 延时                                              */
	/*-------------------------------------------------------*/
	i=SystemData.NetworkPort.PCRDelay / 20;

	Reg= 27000 * DeltaList[i] /300;

	NIB_ADDRESS_LOW_REG =2;
	NIB_ADDRESS_HIGH_REG=0;

	NIB_DATA_LOW_REG    =(unsigned char)(Reg&0xFF);;
	NIB_DATA_HIGH_REG   =(unsigned char)((Reg&0xFF00)>>8);

	NIB_ACTION_REG      =0;

	/*------------------------------------------------------*/
	/* 半帧数据量                                           */
	/*------------------------------------------------------*/
	Reg= 20 * SystemData.NetworkPort.ASIRate * 100 / 8 / 188;

	NIB_ADDRESS_LOW_REG =1;
	NIB_ADDRESS_HIGH_REG=0;

	NIB_DATA_LOW_REG    =(unsigned char)(Reg&0xFF);;
	NIB_DATA_HIGH_REG   =(unsigned char)((Reg&0xFF00)>>8);

	NIB_ACTION_REG      =0;

	WriteSBox();

	ResetNib();
}

unsigned char  GetNibState(void)
{	
	NIB_ADDRESS_LOW_REG =4;
	NIB_ADDRESS_HIGH_REG=0;

	return NIB_ACTION_REG;	
}

unsigned short GetMaxRate(void)
{
	unsigned char  volatile t1,t2;
	unsigned short TmpRate;

	NIB_ADDRESS_LOW_REG =7;
	NIB_ADDRESS_HIGH_REG=0;
	t1=NIB_ACTION_REG;	
	
	NIB_ADDRESS_LOW_REG =8;
	NIB_ADDRESS_HIGH_REG=0;
	t2=NIB_ACTION_REG;	
	
	TmpRate=(unsigned short)(t2<<8) + t1;
	TmpRate=TmpRate*188*44.736*4*10/(4096*193);

	/*
	if(GetNibVer()>=0x12)
		TmpRate/=2;
	*/

	return TmpRate;
}

unsigned short GetAverageRate(void)
{
	unsigned char  volatile t1,t2;
	unsigned short TmpRate;

	NIB_ADDRESS_LOW_REG =5;
	NIB_ADDRESS_HIGH_REG=0;
	t1=NIB_ACTION_REG;	
	

	NIB_ADDRESS_LOW_REG =6;
	NIB_ADDRESS_HIGH_REG=0;
	t2=NIB_ACTION_REG;	
	
	TmpRate=(unsigned short)(t2<<8) + t2;
	TmpRate=TmpRate*SystemData.NetworkPort.ASIRate/65535;

	return TmpRate;
}

unsigned short GetPort7InputRate(void)
{
	unsigned short Port7InRate;
	unsigned char  Rate_H,Rate_L;
	unsigned short Rate1,Rate2,Rate3;
	float          Val,t1,t2;
	unsigned char  Tmp;

	Tmp=*(unsigned char *)0x04020B0A;

	Rate_L=*(unsigned char *)0x04020B04;
	Rate_H=*(unsigned char *)0x04020B05;		
	Rate1=(((unsigned short)Rate_H)<<8) + Rate_L;

	Rate_L=*(unsigned char *)0x04020B08;
	Rate_H=*(unsigned char *)0x04020B09;
	Rate3=(((unsigned short)Rate_H)<<8) + Rate_L;

	if(Rate3==0)
		Port7InRate  =0;
	else
	{
		t1=(float)Rate1;
		t2=(float)Rate3;

		Val=t1 / t2;


		if(GetNibVer()>=0x12)
			Port7InRate  = (unsigned short )(Val *  1743) * 447 / 1103 * 100 / 81;
		else
			Port7InRate  = (unsigned short )(Val *  1743) * 447 / 1103;
	}

	*(unsigned char *)0x04020B0A=0;
	*(unsigned char *)0x04020B0A=1;

	return Port7InRate;
}

void TK_NibMonitor(void)
{
	MESSAGE  Msg,PanelMsg;
	Packet   *PanelPck,*NmPck;	

	Cmd_Report_Network_Info Cmd;

	unsigned char  NibState;
	unsigned short TmpRate;
	unsigned short MaxRate=0;
	unsigned short AverageRate;
	unsigned short Port7InRate;

	int            i;

	int            ThreadHold;
	int            Alarm;

	int            CloseAlarm=1;

	for(;;)
	{
		MaxRate=0;
		/*------------------------------------------------------------------------*/
		/*提取一秒钟内的最大的瞬时码率                                            */
		/*------------------------------------------------------------------------*/
		for(i=0;i<29;i++)
		{
			TmpRate=GetMaxRate();
			if(TmpRate>MaxRate)
				MaxRate=TmpRate;

			my_Delay(10);/*by xu*/
		}

		/*-----------------------------------------------------------------------*/
		/*读取NIB状态                                                            */
		/*-----------------------------------------------------------------------*/	
		NibState=GetNibState();

		/*-----------------------------------------------------------------------*/
		/*统计平均码率                                                           */
		/*-----------------------------------------------------------------------*/
		AverageRate=GetAverageRate();

		/*-----------------------------------------------------------------------*/
		/*统计端口7的输入码率                                                    */
		/*-----------------------------------------------------------------------*/
		Port7InRate=GetPort7InputRate();


		Cmd.Port7InRate       = Port7InRate;
		Cmd.NetworkState      = NibState;
		Cmd.MaxOutputRate     = MaxRate;
		Cmd.AverageOutputRate = AverageRate;

#if SC_SD_DEBUG_MODE==DBG_XN
		/*Display("nibstate=0x%x,av=%dK,mv=%dK,p7=%dK\n",NibState,AverageRate*100,MaxRate*100,Port7InRate*100);*/
#endif

#if 1
		/*-----------------------------------------------------------*/
		/*判断是否需要上报告警                                       */
		/*-----------------------------------------------------------*/
		Alarm=0;
		if(~NibState&0xE0) /*高三位为0 */
		{
			Alarm=1;
		}
		else
		{
			ThreadHold=SystemData.NetworkPort.PCRDelay/20;

			for(i=ThreadHold;i<5;i++)
			{
				if(~NibState&(0x01<<i))
				{
					Alarm=1;
					break;
				}
			}
		}

		if(Alarm)
		{
			/*-------------------------------------------------------*/
			/*屏蔽第一次的告警                                       */
			/*-------------------------------------------------------*/
			if(CloseAlarm)
				CloseAlarm=0;
			else
			{
				Msg.Flag   =0x55185518;
				Msg.Length =16;
				Msg.MsgType=(~NibState&0x000000FF); /* 位为1表示告警 */
				Msg.Pdata  =0;

				SendQueue(QN_ALARM,(unsigned long *)&Msg);
			}
		}

#endif

		/*-----------------------------------------------------------*/
		/* report the information to panel and NM                    */
		/*-----------------------------------------------------------*/
		if(PanelOK)
		{
			/*PanelPck=(Packet *)MemAlloc(RNG2ID,"TK_NibMonitor",sizeof(Packet) - 4 + sizeof(Cmd_Report_Network_Info));*/
			PanelPck=(Packet *)BufToReportNibStatePanel;
			if(PanelPck!=NULL)
			{
				PanelPck->Command			=COMMAND_REPORT_NIBINFO;
				PanelPck->DeviceType		=DEVICE_TYPE_MULTIPLEXER;
				PanelPck->DeviceIdt         =SystemData.EthernetPara.IP;
				PanelPck->PacketIdt         =0;

				PanelPck->Result            =0;

				PanelPck->PacketHeadLength=sizeof(Packet)- 4;
				PanelPck->PacketLength=sizeof(Packet)- 4 + sizeof(Cmd_Report_Network_Info);

				MemCopy((unsigned char *)&PanelPck->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_Network_Info));

				PanelMsg.Flag=0x00;
				PanelMsg.MsgType=MSG_MONI;
				PanelMsg.Length=PanelPck->PacketLength;
				PanelMsg.Pdata=(unsigned char *)PanelPck;

				SendQueue(QN_PANELSEND,&PanelMsg);
			}

		}

		if(Connected)
		{
			/*NmPck=(Packet *)MemAlloc(RNG2ID,"TK_NibMonitor",sizeof(Packet) - 4 + sizeof(Cmd_Report_Network_Info));*/
			NmPck=(Packet *)BufToReportNibStateNM;
			if(NmPck!=NULL)
			{
				NmPck->Command			=COMMAND_REPORT_NIBINFO;
				NmPck->DeviceType		=DEVICE_TYPE_MULTIPLEXER;
				NmPck->DeviceIdt         =SystemData.EthernetPara.IP;
				NmPck->PacketIdt         =0;

				NmPck->Result            =0;

				NmPck->PacketHeadLength=sizeof(Packet)- 4;
				NmPck->PacketLength=sizeof(Packet)- 4 + sizeof(Cmd_Report_Network_Info);

				MemCopy((unsigned char *)&NmPck->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_Network_Info));

				Msg.Flag=0x00;
				Msg.MsgType=MSG_MONI;
				Msg.Length=NmPck->PacketLength;
				Msg.Pdata=(unsigned char *)NmPck;

				SendQueue(QN_TCPIPSEND,&Msg);
			}
		}
	}
}

⌨️ 快捷键说明

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