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

📄 jtagdev.cpp

📁 里面有通过JTAG口对FLASH的烧写代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// JTAGDev.cpp: implementation of the CJTAGDev class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FluteD.h"

#include "Pin.h"
#include "Group.h"

#include "JTAGDev.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CJTAGDev::CJTAGDev()
{
	pInChain = NULL;
	pOutChain = NULL;
	nPinNumber = 0;
	nGroupNumber = 0;
	error = ERR_FALSE;
	nBSRLength = 0;
	nInstLength = 0;
}

CJTAGDev::~CJTAGDev()
{
	// destroy temp files !
}

void CJTAGDev::Init(int * in, int *out, int index )
{
	pInChain = (in + index);
	pOutChain = (out + index);
	nPinNumber = 0;
	nGroupNumber = 0;
	error = ERR_FALSE;
	nBSRLength = 0;
	nInstLength = 0;
}

int CJTAGDev::SetBSDL(LPCTSTR szFileName, LPCTSTR pkg)
{
#ifdef _LOG
	fprintf(lp, "JTAGDev::Setup BSDL ...\n");
#endif
	pBSDL = TrimBSDL(szFileName);
	if(pBSDL==NULL) 
	{
		error =  ERR_TRUE;
		return ERR_TRUE;
	}
	strPackage = CString(pkg);
	Parse();
	fclose(pBSDL);
	return (error);
}


int CJTAGDev::Seek(LPCTSTR key)
{
	char buf[1024];
	if(error) return ERR_TRUE;
	do
	{
		if(fscanf(pBSDL, "%s", buf) == EOF) 
		{	
			error = ERR_TRUE;
			return NO_FIND;
		}
	} while (_stricmp(buf, key) != 0);
	return FIND;
}

CString CJTAGDev::GetWord()
{
	char buf[1024];
	if(fscanf(pBSDL, "%s", buf)==EOF) 
	{
		error = ERR_TRUE;
		return CString("");
	}
	return (CString(buf));
}

FILE * CJTAGDev::TrimBSDL(LPCTSTR szFileName)
{
	FILE *fp_org, *fp_trim;
	char buf_pre, buf, aux;
	fp_org = fopen(szFileName, "rb");
	fp_trim = fopen(BSDL_TMP1, "w+b");
	if(fp_org == NULL || fp_trim == NULL) return NULL;
	fread(&buf_pre, 1, 1, fp_org);
	while(fread(&buf, 1, 1, fp_org))
	{
		if(buf == '-' && buf_pre == '-') // ignore comment
		{
			while(fread(&aux, 1 ,1 , fp_org)) if(aux == 10 ) break; 
			fread(&buf_pre, 1, 1, fp_org);
			continue;
		}
	
		if(buf_pre < 32) buf_pre = 32; // cut off control characters
		fwrite(&buf_pre, 1, 1, fp_trim);

		switch(buf) // add space before special characters
		{
		case '"':
		case '&':
		case '(':
		case ')':
		case '*':
		case ',':
		case ':':
		case ';':
		case '<':
		case '=':
		case '>':
			if(buf_pre != ' ')
			{
				buf_pre = 32;
				fwrite(&buf_pre, 1, 1, fp_trim);
			}
		}

		switch(buf_pre) // add space behind special characters
		{
		case '"':
		case '&':
		case '(':
		case ')':
		case '*':
		case ',':
		case ':':
		case ';':
		case '<':
		case '=':
		case '>':
			if(buf != ' ')
			{
				buf_pre = 32;
				fwrite(&buf_pre, 1, 1, fp_trim);
			}
		}

		buf_pre = buf;

	};
	fwrite(&buf_pre, 1, 1, fp_trim);
	fclose(fp_org);
	fclose(fp_trim);

	// second trim pass 
	fp_org = fopen(BSDL_TMP1, "rt");
	fp_trim = fopen(BSDL_TMP2, "w+t");
	if(fp_org == NULL || fp_trim == NULL) return NULL;
	char word_pre[1024], word_now[1024], word_next[1024];
	fscanf(fp_org, "%s", word_pre);
	fscanf(fp_org, "%s", word_now);
	while(fscanf(fp_org, "%s", word_next) != EOF)
	{
		if(stricmp(word_now, "&") == 0 && 
			stricmp(word_pre, "\"") == 0 &&
			stricmp(word_next, "\"") == 0)
		{
			word_now[0]=0;
			word_pre[0]=0;
			word_next[0]=0;
		}
		if(word_pre[0]) fprintf(fp_trim, "%s ", word_pre);
		strcpy(word_pre, word_now);
		strcpy(word_now, word_next);
	}
	fprintf(fp_trim, "%s ", word_pre);
	fprintf(fp_trim, "%s ", word_now);
	fclose(fp_org);
	fclose(fp_trim);
	return fopen(BSDL_TMP2, "rt");
}

int CJTAGDev::Pass(LPCTSTR key)
{
	char buf[1024];
	if(error) return ERR_TRUE;
	if(fscanf(pBSDL, "%s", buf)==EOF) 
	{	
		error = ERR_TRUE;
		AddLog("Syntax ERROR ! ");
		AddLog(CString(" - ") + CString(key) + CString(" NOT found"));
		return ERR_TRUE;
	}
	error = _stricmp(buf, key);
	return (error);
}

int CJTAGDev::Parse()
{
	Seek("entity");
	strName = GetWord();
#ifdef _LOG
	fprintf(lp, "Get Device: %s\n", strName);
#endif
	ParsePort();
	ParseStd();
	ParsePackag();
	ParseInst();
	ParseBSR();
#ifdef _LOG
	if(error == ERR_FALSE) 
		fprintf(lp, "BSDL Parse OK\n");
#endif
	return error;	
}

int CJTAGDev::ParsePort()
{
	if(error) return error;
	int nPinType, nPinStack;
	CString strPinType, strPinName, strPinDim;
	CString strOP;
#ifdef _LOG
	fprintf(lp, "BSDL Parse of Port Part\n");
#endif
	Seek("PHYSICAL_PIN_MAP");
	if(strPackage.IsEmpty())
	{
		Pass(":");
		Pass("string");
		Pass(":");
		Pass("=");
		Pass("\"");
		strPackage = GetWord();
	}
	Seek("port");
	Pass("(");
	while(1)
	{
		nPinStack = 0;
		do
		{
			do strPinName = GetWord(); while (!strPinName.Compare(";")); // ignore ";"
			if(!strPinName.Compare(")"))
			{
				Pass(";");
				return error;
			}
			strPinName.TrimLeft();
			strPinName.TrimRight();
			PinTable[nPinNumber+(nPinStack++)] = CPin(strPinName);
			strOP = GetWord();
			if(strOP.Compare(",") && strOP.Compare(":"))
			{
				AddLog("Port Description ERROR !");
				error = ERR_TRUE;
				return error;
			}
		} while(strOP.Compare(":"));
		strPinType = GetWord();
		if(!strPinType.CompareNoCase("IN")) nPinType = PIN_IN;
		else if(!strPinType.CompareNoCase("OUT")) nPinType = PIN_OUT;
		else if(!strPinType.CompareNoCase("BUFFER")) nPinType = PIN_BUFFER;
		else if(!strPinType.CompareNoCase("INOUT")) nPinType = PIN_INOUT;
		else if(!strPinType.CompareNoCase("LINKAGE")) nPinType = PIN_LINKAGE;
		else nPinType = PIN_NA;
		strPinDim = GetWord(); 
		if(!strPinDim.CompareNoCase("BIT"))
		{
			for(int i = 0 ; i < nPinStack; i++ )
				PinTable[nPinNumber+i].nType = nPinType;
			nPinNumber += nPinStack;
		}
		if(!strPinDim.CompareNoCase("BIT_VECTOR"))
		{
			int i,j;
			Pass("(");
			int num1 = atoi(LPCTSTR(GetWord()));
			int step;
			if(!GetWord().CompareNoCase("TO")) step = 1;
			else step = -1;
			int num2 = atoi(LPCTSTR(GetWord()));
			Pass(")");
			int width = (num2 - num1)*step + 1;
			for(i=0; i<nPinStack; i++)
			{
				AddGroup(CGroup(PinTable[nPinNumber+i].strName, num1, step, num2));
			}
			for(i=1; i< width; i++)
			{
				for(j=0; j < nPinStack; j++)
				{
					PinTable[nPinNumber+i*nPinStack+j] = PinTable[nPinNumber+j];
				}
			}
			
			for(i=0; i< width; i++)
			{
				char dim_buf[16];
				_itoa((num1 + i*step),dim_buf,10);
				CString dim = CString(dim_buf);
				for(j=0; j < nPinStack; j++)
				{
					PinTable[nPinNumber+i*nPinStack+j].strName += dim;
					PinTable[nPinNumber+i*nPinStack+j].nType = nPinType;
				}
			}
			nPinNumber += nPinStack*width;
		}
	}
}

int CJTAGDev::ParseStd()
{
#ifdef _LOG
	fprintf(lp, "BSDL Parse of STD Part\n");
#endif
	Seek("use");
	if(GetWord().CompareNoCase("STD_1149_1_1994.all"))
	{
		// unknown standard
		error = ERR_TRUE;
		AddLog("Unknown Standard !");
		return error;
	};
	return ERR_FALSE;
}

int CJTAGDev::ParsePackag()
{
	CString strPinName;
	CGroup Grp;
	char dim_buf[16];
	if(error) return error;
#ifdef _LOG
	fprintf(lp, "BSDL Parse of Package Part\n");
#endif
	Seek("PHYSICAL_PIN_MAP");
	Seek(strPackage);
	if(error)
	{
		AddLog("Unknown Package !");
		return error;
	}
	Seek("PIN_MAP_STRING");
	Seek("\"");
	while(1)
	{
		do strPinName = GetWord();
		while(!strPinName.Compare(")") || !strPinName.Compare(","));
		if(!strPinName.Compare("\"")) return error;
		Pass(":");
		if(IsGroup(strPinName)) 
		{
			Grp.strName = strPinName;
			GetGroup(Grp);
			Pass("(");
			for(int i = Grp.nFrom; i != (Grp.nEnd + Grp.nStep); i+=Grp.nStep)
			{
				_itoa(i, dim_buf, 10);
				AssignPin(strPinName+CString(dim_buf), GetWord());
				GetWord();
			}
			if(!GetWord().Compare("\"")) return error;
		}
		else
		{
			AssignPin(strPinName, GetWord());
			if(!GetWord().Compare("\"")) return error;
		}
	}
}


int CJTAGDev::AddGroup(CGroup Grp)
{
	if(nGroupNumber >= MAX_GROUP) 
	{
		error = ERR_TRUE;
		AddLog("Too Many Groups !");
		return ERR_TRUE;
	}
	GroupList[nGroupNumber++] = Grp;
	return ERR_FALSE;
}

BOOL CJTAGDev::IsGroup(CString strGName)
{
	for(int i=0; i<nGroupNumber; i++)
	{

⌨️ 快捷键说明

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