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

📄 sysswitch.c

📁 基于如何开发MPC860处理器系统的核心业务模块QMC的开发程序
💻 C
字号:
#include "mpc860p.h"
#include "DS2154.h"
#include "MT908x0.h"
#include "ExtDeclare.h"
#include "config.h"
#include "arch/ppc/ivPpc.h"
void vSendMphToL1(unsigned short Signal,unsigned char PhLinkNo)
{;}
void DS2154Int(UINT8 irq_no)
{
	UINT32 base;
	UINT8 link, i, chipno;
	UINT16 Signal;
	UINT8 temp;
	link = 0xff;
	Signal = 0xff;
	
	for(i=0 ; i<4 ; i++)/**??????????**/
	{
		chipno = (irq_no - 1) * 4 + i;
		base = DS2154_ADRS(chipno);

		/* 内部故障*/

		/* 内部故障恢复*/

		/* 信号丢失或帧定位丢失*/
		*DS2154_SR1(base) = 0xf3; /* LOS */
		temp = *DS2154_SR1(base);
		*DS2154_SR1(base) = (temp&0xf3);
		if((temp&0xf3) != 0x00)
		{
		Signal = Loss_signal_or_loss_frame_align;
		link = chipno;
		break;
		}

		/* RAI */
		*DS2154_SR1(base) = 0x04;
		temp = *DS2154_SR1(base);
		*DS2154_SR1(base) = (temp&0x04);
		if((temp&0x04) == 0x04)
		{
		Signal = RAI;
		link = chipno;
		break;
		}

		/* AIS */
		*DS2154_SR1(base) = 0x08;
		temp = *DS2154_SR1(base);
		*DS2154_SR1(base) = (temp&0x08);
		if((temp&0x08) == 0x08)
		{
		Signal = AIS;
		link = chipno;
		break;
		}
		
		/* 正常帧Sa7 = 1/0 */
		*DS2154_SR2(base) = 0x02;
		temp = *DS2154_SR2(base);
		*DS2154_SR2(base) = (temp&0x02);
		if((temp&0x02) ==0x02)
		{
			if(*DS2154_RSa7(base) == 0x00) 
			{
			Signal = Normal_frames_Sa7_ZERO;
			link = chipno;
			*DS2154_RSa7(base) = 0xaa;
			break;
			}
			else if(*DS2154_RSa7(base) == 0xff) 
			{
			Signal = Normal_frames_Sa7_ONE;
			link = chipno;
			*DS2154_RSa7(base) = 0xaa;
			break;
			}
		}
	}
	if((link!=0xff)&&(Signal!=0xff))
		vSendMphToL1(Signal, link);
}

void DS2154_RegClear(void)
{
UINT32 base;
UINT8 temp;
int i, j;

for(i=0 ; i<4 ; i++)
{
	base = DS2154_ADRS(i);

	*DS2154_SR1(base) = 0xff;
	temp = *DS2154_SR1(base);
	*DS2154_SR1(base) = 0xff;

	*DS2154_SR2(base) = 0xff;
	temp = *DS2154_SR2(base);
	*DS2154_SR2(base) = 0xff;
	
	*DS2154_RIR(base) = 0xff;
	temp = *DS2154_RIR(base);
	*DS2154_RIR(base) = 0xff;

	*DS2154_RCR1(base) = 0x00;
 	*DS2154_RCR2(base) = 0x00;
 	*DS2154_TCR1(base) = 0x00;
 	*DS2154_TCR2(base) = 0x00;
 	*DS2154_CCR1(base) = 0x00;
 	*DS2154_TEST1(base) = 0x00;
 	*DS2154_IMR1(base) = 0x00;
 	*DS2154_IMR2(base) = 0x00;
 	*DS2154_LICR(base) = 0x00;
 	*DS2154_TEST2(base) = 0x00;
 	*DS2154_CCR2(base) = 0x00;
	*DS2154_CCR3(base) = 0x00;
	*DS2154_TSaCR(base) = 0x00;
	
 	*DS2154_TAF(base) = 0x00;
 	*DS2154_TNAF(base) = 0x00;
 	*DS2154_TCBR1(base) = 0x00;
 	*DS2154_TCBR2(base) = 0x00;
 	*DS2154_TCBR3(base) = 0x00;
 	*DS2154_TCBR4(base) = 0x00;
 	*DS2154_TIR1(base) = 0x00;
 	*DS2154_TIR2(base) = 0x00;
 	*DS2154_TIR3(base) = 0x00;
 	*DS2154_TIR4(base) = 0x00;
 	*DS2154_TIDR(base) = 0x00;
 	*DS2154_RCBR1(base) = 0x00;
 	*DS2154_RCBR2(base) = 0x00;
 	*DS2154_RCBR3(base) = 0x00;
 	*DS2154_RCBR4(base) = 0x00;

 	for( j= 0 ; j<=16 ; j++ )
 	{
 	*DS2154_TS(j,base) = 0x00;
	}

 	*DS2154_TSiAF(base) = 0x00;
 	*DS2154_TSiNAF(base) = 0x00;
 	*DS2154_TRA(base) = 0x00;
 	*DS2154_TSa4(base) = 0x00;
 	*DS2154_TSa5(base) = 0x00;
 	*DS2154_TSa6(base) = 0x00;
 	*DS2154_TSa7(base) = 0x00;
 	*DS2154_TSa8(base) = 0x00;
 	for( j=1 ; j<=32 ; j++ )
 	{
 	*DS2154_TC(j,base) = 0x00;

 	*DS2154_RC(j,base) = 0x00;
	}

 	*DS2154_TCC1(base) = 0x00;
 	*DS2154_TCC2(base) = 0x00;
 	*DS2154_TCC3(base) = 0x00;
 	*DS2154_TCC4(base) = 0x00;
 	*DS2154_RCC1(base) = 0x00;
 	*DS2154_RCC2(base) = 0x00;
 	*DS2154_RCC3(base) = 0x00;
 	*DS2154_RCC4(base) = 0x00;
 	*DS2154_CCR4(base) = 0x00;
  	*DS2154_CCR5(base) = 0x00;

 	*DS2154_TEST3(base) = 0x00;
/*		*DS2154_TEST4(base) = 0x00;*//* FOR 21554 */

}
}

void DS2154_Init(void)
{
	UINT32 base;
	int i;
	UINT8 temp;

	DS2154_RegClear();

	for(i=0 ; i<4 ; i++)
	{
		base = DS2154_ADRS(i);
		
		*DS2154_TAF(base) = 0x1b;
		*DS2154_TNAF(base) = 0x5f;

		*DS2154_TSa7(base) = 0x00;
		*DS2154_TRA(base) = 0x00;
		*DS2154_TSaCR(base) = 0x22;
if(i==0){
		*DS2154_IMR1(base) = 0x1;/* SR1的所有变化均产生中断 */
		*DS2154_IMR2(base) = 0x0;/* SR2在接收CRC4复帧时产生中断 */
}
else{
	*DS2154_IMR1(base) = 0x0;/* SR1的所有变化均产生中断 */
		*DS2154_IMR2(base) = 0x0;/* SR2在接收CRC4复帧时产生中断 */
}
		/* 公共控制寄存器1 */
		*DS2154_CCR1(base) = 0x4c;/*0x5d;*/
		
		/* COMMON CONTROL REGISTER 2 */
		*DS2154_CCR2(base) = 0x10; /*0x54;0xd0;*/
		
		/* COMMON CONTROL REGISTER 3 */
		*DS2154_CCR3(base) = 0x82;
		myTimer(1);
		*DS2154_CCR3(base) = 0x92;
		myTimer(1);
		*DS2154_CCR3(base) = 0x82;
		
		/* COMMON CONTROL REGISTER 4 */
		*DS2154_CCR4(base) = 0x00;/*0x80*/
		
		/* 接收控制寄存器1 */
		*DS2154_RCR1(base) = 0x20;/*0xc4;*/
        myTimer(1);
		*DS2154_RCR1(base) = 0x21;/*new*/
	
		/* 接收控制寄存器2 */
		*DS2154_RCR2(base) = 0x06;/*0x46;*/
	
		/* 发送控制寄存器 */
		*DS2154_TCR1(base) = 0x08;
		
		/* 发送控制寄存器 */
		*DS2154_TCR2(base) = 0x02;
		
		/* LINE INTERFACE CONTROL REGISTER */
		*DS2154_LICR(base) = 0x80;

		/* COMMON CONTROL REGISTER 5 */
		*DS2154_CCR5(base) = 0x00;/*0x82*/
		myTimer(1);
		*DS2154_CCR5(base) = 0x80;/*n*/
		
		myTimer(2);
		*DS2154_SR1(base) = 0xff;
		temp = *DS2154_SR1(base);
		*DS2154_SR1(base) = (0xff&temp);

		*DS2154_SR2(base) = 0xff;
		temp = *DS2154_SR2(base);
		*DS2154_SR2(base) = (0xff&temp);
	
		*DS2154_RIR(base) = 0xff;
		temp = *DS2154_RIR(base);
		*DS2154_RIR(base) = (0xff&temp);
	}

	*SIMASK(vxImmrGet()) |= 0x20000000;
	intConnect(IV_IRQ1, (VOIDFUNCPTR)DS2154Int, 1);
/*	intConnect(IV_IRQ2, (VOIDFUNCPTR)DS2154Int, 2);
	intConnect(IV_IRQ3, (VOIDFUNCPTR)DS2154Int, 3);
	intConnect(IV_IRQ4, (VOIDFUNCPTR)DS2154Int, 4);*/
}

void vSendL1Signal(UINT16 Signal, UINT8 PhLinkNo)
{
	UINT32 base;
	
	base = DS2154_ADRS(PhLinkNo);
	switch (Signal)
	{
	/* 正常帧Sa7 = 1 */
	case Normal_frames_Sa7_ONE:
		*DS2154_TSa7(base) = 0xff;
		break;
	/* 正常帧Sa7 = 0 */
	case Normal_frames_Sa7_ZERO:
		*DS2154_TSa7(base) = 0x00;
		break;
	/* RAI */
	case RAI:
		*DS2154_TRA(base) = 0xff;
		break;
	/* AIS */
	case AIS:
		break;
	default: break;
	}
}

void MT90840_Init(void)
{
	UINT32 base;

	base = MT90840_ADRS;

	*MT90840_IMSR(base) = 0x78;/* 00 MT90840 工作模式设置 */
	*MT90840_TIMR(base) = 0x00;/* 02 时间方式选择 */
	*MT90840_ALSR(base) = 0xb0;/* 04 告警状态设置 */
	*MT90840_GPMR(base) = 0x04;/* 03 S/P 端口极性 */

	/* TPCM High 初始化*/
	*MT90840_CR(base) = 0xe0;  /* 01 */ 
	*MT90840_GPMR(base) |= 0x05;
	myTimer(1);
	if((*MT90840_GPMR(base))&0x01 == 0x01)*MT90840_GPMR(base) &= 0xfe;

	/* RPCM High 初始化*/
	*MT90840_CR(base) = 0x60;
	*MT90840_GPMR(base) |= 0x25;
	myTimer(1);
	if((*MT90840_GPMR(base))&0x01 == 0x01)*MT90840_GPMR(base) &= 0xfe;
}

void vConnectSlot(UINT8 ConnectType, UINT8 LELinkNo, UINT8 LESlotNo,
	UINT8 USERLinkNo, UINT8 USERSlotNo)
{
	UINT8 	STioNo, STioSlot;
	UINT16 	STioChannel, PDioChannel;
	UINT32	base;

	base = MT90840_ADRS;

	/* 选择串行流1-8 */
	STioNo = LELinkNo / 2;
	/* LE时隙对应的串行流上的物理时隙 */
	STioSlot = LESlotNo * (LELinkNo % 2 + 1);
	/* 计算RPCM地址 */
	STioChannel = (UINT16)STioNo * 64 + (UINT16)STioSlot;
	/* 计算TPCM地址 */
	PDioChannel = (UINT16)USERLinkNo + (UINT16)USERSlotNo * 64;
	
	switch (ConnectType)
	{
	case CONNECT_LE_TO_USER:
		*MT90840_CR(base) = (UINT8) ((PDioChannel & 0xff80)>>7)
					| CR_SEL2 | CR_SEL0 & (~(CR_SEL1|CR_HA11));
		*TPCMH(PDioChannel) = (UINT8)((STioChannel & 0xff00)>>8) 
					| TPCM_OE_CTo0 & (~(TPCM_PPBY|TPCM_MC|TPCM_CTO|TPCM_AB9));
		*MT90840_CR(base) = (UINT8)((PDioChannel & 0xff80)>>7) 
					| CR_SEL2 & (~(CR_SEL1|CR_SEL0|CR_HA11));
		*TPCML(PDioChannel) = (UINT8) (STioChannel & 0xff);
		break;
	case CONNECT_USER_TO_LE:
		*MT90840_CR(base) = (UINT8)((STioChannel & 0xff80)>>7)
					| CR_SEL0 & (~(CR_SEL2|CR_SEL1|CR_HA11));
		*RPCMH(STioChannel) = (UINT8)((PDioChannel & 0xff00)>>8) 
					| RPCM_OE | RPCM_DC & (~RPCM_MC);
		*MT90840_CR(base) = (UINT8)((PDioChannel & 0xff80)>>7) 
					& (~(CR_SEL2|CR_SEL1|CR_SEL0|CR_HA11|CR_HA10|CR_HA9));
		*RPCML(STioChannel) = (UINT8) (PDioChannel & 0xff);
		break;
	case CONNECT_BOTH_DIR:
		*MT90840_CR(base) = (UINT8)((PDioChannel & 0xff80)>>7) 
					| CR_SEL2 | CR_SEL0 & (~(CR_SEL1|CR_HA11));
		*TPCMH(PDioChannel) = (UINT8)((STioChannel & 0xff00)>>8) 
					| TPCM_OE_CTo0 & (~(TPCM_PPBY|TPCM_MC|TPCM_CTO|TPCM_AB9));
		*MT90840_CR(base) = (UINT8) ((PDioChannel & 0xff80)>>7)
					| CR_SEL2 & (~(CR_SEL1|CR_SEL0|CR_HA11));
		*TPCML(PDioChannel) = (UINT8) (STioChannel & 0xff);
		*MT90840_CR(base) = (UINT8)((STioChannel & 0xff80)>>7) 
					| CR_SEL0 & (~(CR_SEL2|CR_SEL1|CR_HA11));
		*RPCMH(STioChannel) = (UINT8)((PDioChannel & 0xff00)>>8) 
					| RPCM_OE | RPCM_DC & (~RPCM_MC);
		*MT90840_CR(base) = (UINT8) ((PDioChannel & 0xff80)>>7) 
					& (~(CR_SEL2|CR_SEL1|CR_SEL0|CR_HA11|CR_HA10|CR_HA9));
		*RPCML(STioChannel) = (UINT8) (PDioChannel & 0xff);
		break;
	default: break;
	}
}

void vDisConnectSlot(UINT8 DisConnectType, UINT8 LELinkNo, UINT8 LESlotNo,
	UINT8 USERLinkNo, UINT8 USERSlotNo)
{
	UINT8 STioNo, STioSlot;
	UINT16 STioChannel, PDioChannel;
	UINT32 base;

	base = MT90840_ADRS;
	STioNo = LELinkNo / 2;
	STioSlot = LESlotNo * (LELinkNo % 2 + 1);
	STioChannel = (UINT16)STioNo * 64 + (UINT16)STioSlot;
	PDioChannel = (UINT16)USERLinkNo + (UINT16)USERSlotNo * 64;

	switch (DisConnectType)
	{
	case DISCONNECT_LE_TO_USER:
		*MT90840_CR(base) = (UINT8)((PDioChannel & 0xff80)>>7) 
					| CR_SEL2 | CR_SEL0 & (~(CR_SEL1|CR_HA11));
		*TPCMH(PDioChannel) &= ~(TPCM_OE_CTo0);
			/*(UINT8 (STioChannel & 0xff00)>>8) 
				& (~(TPCM_OE_CTo0|TPCM_PPBY|TPCM_MC|TPCM_CTO|TPCM_AB9));
		*MT98840_CR(base) = (UINT8 (PDioChannel & 0xff80)>>7) 
					| CR_SEL2 & (~(CR_SEL1|CR_SEL0|CR_HA11));
		*TPCML(PDioChannel) = UINT8 (STioChannel & 0xff);*/
		break;
	case DISCONNECT_USER_TO_LE:
		*MT90840_CR(base) = (UINT8)((STioChannel & 0xff80)>>7) 
					| CR_SEL0 & (~(CR_SEL2|CR_SEL1|CR_HA11));
		*RPCMH(STioChannel) &= ~(RPCM_OE);
			/*(UINT8 (PDioChannel & 0xff00)>>8) 
				| RPCM_DC & (~(RPCM_OE|RPCM_MC));
		*MT90840_CR(base) = (UINT8 (PDioChannel & 0xff80)>>7) 
					& (~(CR_SEL2|CR_SEL1|CR_SEL0|CR_HA11|CR_HA10|CR_HA9));
		*RPCML(STioChannel) = UINT8 (PDioChannel & 0xff);*/
		break;
	case DISCONNECT_BOTH_DIR:
		*MT90840_CR(base) = (UINT8)((PDioChannel & 0xff80)>>7) 
					| CR_SEL2 | CR_SEL0 & (~(CR_SEL1|CR_HA11));
		*TPCMH(PDioChannel) &= ~(TPCM_OE_CTo0);
			/*(UINT8 (STioChannel & 0xff00)>>8) 
				& (~(TPCM_OE_CTo0|TPCM_PPBY|TPCM_MC|TPCM_CTO|TPCM_AB9));
		*MT98840_CR(base) = (UINT8 (PDioChannel & 0xff80)>>7) 
					| CR_SEL2 & (~(CR_SEL1|CR_SEL0|CR_HA11));
		*TPCML(PDioChannel) = UINT8 (STioChannel & 0xff);*/
		*MT90840_CR(base) = (UINT8)((STioChannel & 0xff80)>>7) 
					| CR_SEL0 & (~(CR_SEL2|CR_SEL1|CR_HA11));
		*RPCMH(STioChannel) &= ~(RPCM_OE);
			/*(UINT8 (PDioChannel & 0xff00)>>8) 
				| RPCM_DC & (~(RPCM_OE|RPCM_MC));
		*MT90840_CR(base) = (UINT8 (PDioChannel & 0xff80)>>7) 
					& (~(CR_SEL2|CR_SEL1|CR_SEL0|CR_HA11|CR_HA10|CR_HA9));
		*RPCML(STioChannel) = UINT8 (PDioChannel & 0xff);*/
		break;
	default: break;
	}
}

⌨️ 快捷键说明

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