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

📄 jtagdev.cpp

📁 里面有通过JTAG口对FLASH的烧写代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if(GroupList[i].strName == strGName) return true;
	}
	return false;
}


int CJTAGDev::GetGroup(CGroup & Grp)
{
	for(int i=0; i<nGroupNumber; i++)
	{
		if(GroupList[i].strName == Grp.strName) 
		{
			Grp.nFrom = GroupList[i].nFrom;
			Grp.nStep = GroupList[i].nStep;
			Grp.nEnd = GroupList[i].nEnd;
			return ERR_FALSE;
		}
	}
	return ERR_TRUE;
}

int CJTAGDev::AssignPin(CString strPinName, CString strPinNumber)
{
	strPinName.TrimLeft();
	strPinName.TrimRight();
	strPinNumber.TrimLeft();
	strPinNumber.TrimRight();
	for(int i=0; i<nPinNumber; i++)
	{
		if(PinTable[i].strName == strPinName)
		{
			PinTable[i].strNumber = strPinNumber;
			return ERR_FALSE;
		}
	}
	error = ERR_TRUE;
	AddLog("Pin Assignment Failure !");
	AddLog(CString(" - ") + strPinName);
	return error;
}

int CJTAGDev::ParseInst()
{
#ifdef _LOG
	fprintf(lp, "BSDL Parse of Instruction Part\n");
#endif
	Seek("INSTRUCTION_LENGTH");
	Pass("of");
	if(error) 
	{
		AddLog("Instruction Register ERROR !");
		return error;
	}
	Pass(strName);
	if(error)
	{
		AddLog("Device Name Mismatch in Instruction Register Section");
		return error;
	}
	Pass(":");
	Pass("entity");
	Pass("is");
	nInstLength = atoi(GetWord()); 
#ifdef _LOG
	fprintf(lp, "Instruction Length: %d\n", nInstLength);
#endif
	lBookMark = ftell(pBSDL);
	if(Find("BYPASS"))
	{
		Pass("(");
		nInstBypass = GetBin();
#ifdef _LOG
		fprintf(lp, "Get BYPASS: 0x%x\n", nInstBypass);
#endif
	}
	else
	{
		AddLog("NO BYPASS Instruction !");
		error = ERR_TRUE;
		return error;
	}
	if(Find("SAMPLE"))
	{
		Pass("(");
		nInstSample = GetBin();
#ifdef _LOG
		fprintf(lp, "Get SAMPLE/PRELOAD: 0x%x\n", nInstSample);
#endif
	}
	else
	{
		AddLog("NO SAMPLE/PRELOAD Instruction !");
		error = ERR_TRUE;
		return error;
	}
	if(Find("EXTEST"))
	{
		Pass("(");
		nInstExtest = GetBin();
#ifdef _LOG
		fprintf(lp, "Get EXTEST: 0x%x\n", nInstExtest);
#endif
	}
	else
	{
		AddLog("NO EXTEST Instruction !");
		error = ERR_TRUE;
		return error;
	}

	if(error) return error;
	if(Find("IDCODE")) // find optional IDCODE
	{
		Pass("(");
		nInstIdcode = GetBin();
		Seek("IDCODE_REGISTER");
		Seek("entity");
		Pass("is");
		Pass("\"");
		nIDCode = GetBin();
		nIDMask = nBinMask;
#ifdef _LOG
		fprintf(lp, "Get IDCode: 0x%lx\n", nIDCode);
#endif
	}
	else
	{
		nInstIdcode = -1;
		error = 0;
	}
	return error;
}

int CJTAGDev::Find(LPCSTR key)
{
	if(error) return NO_FIND;
	fseek(pBSDL, lBookMark, SEEK_SET);
	if(Seek(key) == FIND) 
	{
		error = ERR_FALSE;
		return FIND;
	}
	error = ERR_FALSE;
	return NO_FIND;
}

unsigned long CJTAGDev::GetBin()
{
	char aux;
	unsigned long value = 0;
	nBinMask = 0;
	for(int end = 0; !end; )
	{
		aux = fgetc(pBSDL);
		if(aux == EOF) return value;
		switch(aux)
		{
		case '0':
			value <<= 1;
			nBinMask <<= 1;
			nBinMask += 1;
			break;
		case '1':
			value <<= 1;
			nBinMask <<= 1;
			nBinMask += 1;
			value++;
			break;
		case 'x':
		case 'X':
			value <<= 1;
			nBinMask <<= 1;
			break;
		case ' ':
			break;
		default:
			end = 1;
		}
	}
	return (value);
}

int CJTAGDev::CheckID(unsigned long id)
{
#ifdef _LOG
	fprintf(lp, "JTAGDev::Check Device ID ...\n");
#endif

	if(nIDMask == 0) 
	{
		AddLog("NO ID code available\n");
		return ERR_FALSE;
	}

	if((id&nIDMask) == nIDCode)	
	{
		char aux[256];
		sprintf(aux, "ID Code Correct 0x%08lX\n\r\a", nIDCode);
		AddLog(aux);
		return ERR_FALSE;
	}
	else 
	{
		char aux[256];
		sprintf(aux, "ID CODE ERROR (0x%08lX) Should Be 0x%08lX\n\r\a", id, nIDCode);
		AddLog(aux);
		return ERR_TRUE;
	}
}

int CJTAGDev::ParseBSR()
{
	CString strPin, strType, strSafe;
	CString strCell;
	int i, j, aux;
#ifdef _LOG
	fprintf(lp, "BSDL Parse of BSR Part\n");
#endif
	Seek("BOUNDARY_LENGTH");
	Seek("is");
	nBSRLength = atoi(GetWord()); 
#ifdef _LOG
	fprintf(lp, "BSR Length: %d\n", nBSRLength);
#endif
	Seek("BOUNDARY_REGISTER");
	Seek("is");
	Pass("\"");
	lBookMark = ftell(pBSDL);
	int p;
	for(i=0; i<MAX_CELL; i++) 
	{ 
		nSafeMask[i] = 0;
		nSafePatten[i] = 0;
	}
	j = 0;
	do 
	{
		j++;
		strCell = GetWord();
		i = atoi(strCell);
		Pass("(");
		GetWord(); // pass VHDL Cell
		Pass(",");
		strPin = GetItem();
		// Pass(","); included in GetItem
		strType = GetWord();
		Pass(",");
		strSafe = GetWord();

		if(strSafe.Compare("0") == 0)
		{
			nSafeMask[i] = 1;
			nSafePatten[i] = 0;
		}
		else if(strSafe.Compare("1") == 0)
		{
			nSafeMask[i] = 1;
			nSafePatten[i] = 1;
		}
		else
		{
			nSafeMask[i] = 0;
			nSafePatten[i] = 1;
		}

		if(!strType.CompareNoCase("INPUT"))
		{
			p=SearchPin(strPin);
			if(error)
			{
				return error;
			}
			else 
			{
				PinTable[p].pInCell = pInChain + i;
				PinTable[p].nInCell = i;
			}
		}
		if(!strType.CompareNoCase("OUTPUT2"))
		{
			p=SearchPin(strPin);
			if(error)
			{
				return error;
			}
			else 
			{
				PinTable[p].pOutCell = pOutChain + i;
				PinTable[p].nOutCell = i;
			}
		}
		if(!strType.CompareNoCase("OUTPUT3"))
		{
			p=SearchPin(strPin);
			if(error)
			{
				return error;
			}
			else 
			{
				PinTable[p].pOutCell = pOutChain + i;
				PinTable[p].nOutCell = i;
				Pass(",");
				aux = atoi(GetWord());
				PinTable[p].pCtrlCell = pOutChain + aux;
				PinTable[p].nCtrlCell = aux;
				Pass(",");
				PinTable[p].nAct = !atoi(GetWord());
				Pass(",");
				GetWord();
			}
		}
		Pass(")");
	} while(GetWord().Compare("\"") != 0);

	if(j != nBSRLength)
	{
		AddLog("Miss Pin 1");
		error = ERR_TRUE;
	}
	return error;
}


int CJTAGDev::SearchPin(CString name)
{
	for(int i=0; i<nPinNumber; i++)
	{
		if(PinTable[i].strName == name) return i;
	}
	return -1;
}

CPin * CJTAGDev::GetPin(LPCTSTR szPNo)
{
	for(int i=0; i<nPinNumber; i++)
	{
		if(!PinTable[i].strNumber.CompareNoCase(szPNo))
			return &(PinTable[i]);
	}
	return NULL;
}

int CJTAGDev::SetSafe()
{
	if(!pOutChain) return ERR_TRUE;
	for(int i=0; i<nBSRLength; i++)
	{
		*(pOutChain + i) = nSafePatten[i];
	}
	return ERR_FALSE;
}

CString CJTAGDev::GetItem()
{
	CString value, next;
	value = GetWord();
	next = CString("");
	do
	{
		value += next;
		next = GetWord();
		if(next.Compare(")") == 0 || next.Compare("(") == 0)  
			next = CString("");
	} while (next.Compare(",") != 0);
	return value;
}

int CJTAGDev::Dump()
{
	printf("Device name:%s		Device package:%s\n", strName, strPackage);
	printf("Devicd ID:0x%lX		Device ID mask:0x%lX\n", nIDCode, nIDMask);
	printf("Instruction length:%d\n", nInstLength);
	printf("Instruction BYPASS:0x%lX\n", nInstBypass);
	printf("Instruction EXTEST:0x%lX\n", nInstExtest);
	printf("Instruction IDCODE:0x%lX\n", nInstIdcode);
	printf("Instruction SAMPLE:0x%lX\n", nInstSample);
	printf("Total %d pins\n", nPinNumber);
	if(flag_verbose)
	{
		for(int i=0; i<nPinNumber; i++)
		{
			printf("#%3d	%-12s %-12s In:%3d Out:%3d Ctrl:%3d\n",
				i, PinTable[i].strName, PinTable[i].TypeName(), PinTable[i].nInCell, PinTable[i].nOutCell, PinTable[i].nCtrlCell);
		}
	}
	return 0;
}

⌨️ 快捷键说明

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