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