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

📄 ports.c

📁 VXWorks 系统通过模拟IO口配置FPGA芯片代码
💻 C
字号:
/*******************************************************/
/* file: ports.c                                       */
/* abstract:  This file contains the routines to       */
/*            output values on the JTAG ports, to read */
/*            the TDO bit, and to read a byte of data  */
/*            from the prom                            */
/*                                                     */
/*******************************************************/
#include "ports.h"
#include "stdio.h"
#include "drv/multi/ppc860Siu.h"

char * pXsvfData;
/* 初始化从串配置FPGA端口,initial slave serial configuration FPGA port */
void initFPGAPort(void)
{
	UINT32 immrVal = vxImmrGet();
	
	*PAPAR(immrVal) &=~(CCLK_SET | PROGB_SET);					/*设置PA0,PA2为通用IO模式*/
	*PADIR(immrVal) |= CCLK_SET | PROGB_SET;					/*PA0,PA2为输出*/
	*PADAT(immrVal) |= PROGB_SET;								/*PROGB初始状态为高电平*/
	
	*PCPAR(immrVal) &=~(INTB_SET | DIN_SET | DONE_SET);			/*设置PC4,PC5,PC12为通用IO模式*/
	*PCSO(immrVal) &=~(INTB_SET | DIN_SET | DONE_SET);
	*PCDIR(immrVal) |= DIN_SET;									/*PC5为输出*/
	*PCDIR(immrVal) &= ~(INTB_SET | DONE_SET);					/*PC4,PC12为输入*/
	*PCDAT(immrVal) &= ~(INTB_SET |DONE_SET );					/*INTB初始状态为低电平*/
	
	return;
}

/*恢复Port A,Port C为默认状态*/
void releaseFPGAPort(void)
{
	*PADIR(vxImmrGet()) &= ~(CCLK_SET | PROGB_SET);			/*恢复PA0,PA2为输入*/
	*PCDIR(vxImmrGet()) &= ~DIN_SET;							/*恢复PC5为输入*/
	
	return;
}

void updateFPGAPort(int portNum, int val)
{
	UINT32 immrVal = vxImmrGet();
	
	switch(portNum)
	{
		case CCLK:
			if(val == 1)
				*PADAT(immrVal) |= CCLK_SET;
			else
				*PADAT(immrVal) &= ~CCLK_SET;
			break;
		case PROGB:
			if(val == 1)
				*PADAT(immrVal) |= PROGB_SET;
			else
				*PADAT(immrVal) &= ~PROGB_SET;
			break;
		case DIN:
			if(val == 1)
				*PCDAT(immrVal) |= DIN_SET;
			else
				*PCDAT(immrVal) &= ~DIN_SET;
			break;
		default:
			break;
	}
	
	return;
}

unsigned char	readFPGAPort(int portNum)
{
	UINT32 immrVal = vxImmrGet();
	int	portData=0;
	
	switch(portNum)
	{
		case INTB:
			portData = (*PCDAT(immrVal)) & INTB_SET;
			break;
		case DONE:
			portData = (*PCDAT(immrVal)) & DONE_SET;
			break;

		case PROGB:
			portData = (*PADAT(immrVal)) & PROGB_SET;
			break;
		default:
			break;
	}
	if(portData == 0)
		return 0;
	else
		return 1;
}

/* toggle CCLK LH */
void pulseClock()
{
	updateFPGAPort(CCLK,0);			/* set the TCK port to low  */	
	updateFPGAPort(CCLK,1);			/* set the TCK port to high */

	return;
}


/* read in a byte of data from the prom */
void readByte(unsigned char *data)
{
	*data = *pXsvfData++;
	return;
}

void portdelay(int num)
{

	while(num--) 
		pulseClock();
}
void delay(int count)
{
	while(count--) ;
}
/* Wait at least the specified number of microsec.                           */
/* Use a timer if possible; otherwise estimate the number of instructions    */
/* necessary to be run based on the microcontroller speed.  For this example */
/* we pulse the TCK port a number of times based on the processor speed.     */
void waitTime(long microsec)
{
	static long tckCyclesPerMicrosec    = 1;
	long        tckCycles   = microsec * tckCyclesPerMicrosec;
	long        i;

	/* For systems with TCK rates >= 1 MHz;  This implementation is fine. */
	 for ( i = 0; i < tckCycles; ++i )
	{
	        pulseClock();
	}
	return;
}

void sendCfgByte(unsigned char data)
{
	unsigned char i;

	for(i=0;i<8;i++)
	{
		if((data>>i)&0x01)
			*PCDAT(vxImmrGet())  |= DIN_SET;
		else
			*PCDAT(vxImmrGet())  &= ~DIN_SET;
/*
		delay(1);
		*/
		pulseClock();
	}
	return;
}

void sendCfgByteF(unsigned char * data , int len)
{   
       FAST volatile UINT16 * pfpgadata;
	FAST volatile UINT16 * pfpgaclk;
	FAST  UINT8 tmp;
	FAST  unsigned char * pdata = data;
	FAST int datalen = len;

	
	pfpgadata =   PCDAT(vxImmrGet()) ;
	pfpgaclk   =   PADAT(vxImmrGet());

	
	while(datalen--)
	{     
	               tmp = *pdata++;
			
			(tmp&0x01) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x02) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x04) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x08) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x10) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x20) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x40) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;

			(tmp&0x80) ? (*pfpgadata |= DIN_SET) : (*pfpgadata  &= (~DIN_SET) );
			*pfpgaclk &= (~CCLK_SET);
			*pfpgaclk|= CCLK_SET ;
		
	}
}

/* old */


void setPort(short p,short val)
{
	UINT32 immrVal = vxImmrGet();
	
	switch(p)
	{
		case TCK:
			if(val == 0)
				*PBDAT(immrVal) &=~ TCK_SET;
			else
				*PBDAT(immrVal) |= TCK_SET;
			break;
			
		case TMS:
			if(val == 0)
				*PBDAT(immrVal) &=~ TMS_SET;
			else
				*PBDAT(immrVal) |= TMS_SET;
			break;
			
		case TDI:
			if(val == 0)
				*PBDAT(immrVal) &=~ TDI_SET;
			else
				*PBDAT(immrVal) |= TDI_SET;
			break;
			
		default:
			break;
	}
	return;
}

unsigned char readTDOBit(void)
{
	if((*PBDAT(vxImmrGet()) & TDO_SET) == 0)
		return 0;
	else
		return 1;
}

⌨️ 快捷键说明

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