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

📄 jtagflash.cpp

📁 里面有通过JTAG口对FLASH的烧写代码
💻 CPP
字号:
// JTAGFlash.cpp: implementation of the CJTAGFlash class.
//
//////////////////////////////////////////////////////////////////////

#include	"StdAfx.h"
#include	"FluteD.h"

#include	"Pin.h"
#include 	"Group.h"	
#include	"JTAGDev.h"
#include	"JTAGPort.h"
#include	"FCDFile.h"
#include	"JTAGChain.h"

#include	"JTAGFlash.h"

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


CJTAGFlash::CJTAGFlash()
{
	error = ERR_FALSE;
}

int CJTAGFlash::SetAddr(long ad)
{
	UINT32 addr = ad;
	for(int i = 0; i<nAddrWidth; i++)
	{
		pAddrPin[i] -> Oe(1);
		pAddrPin[i] -> Write((int)addr&0x01);
		addr >>= 1;
	}
	return 0;
}

int CJTAGFlash::GetData(BYTE *buf)
{
	int i,j;
	BYTE *pdt;
	BYTE data;
	pdt = buf;
	for(i = 0; i < nDataWidth; i++)	
	{
		for(j=0, data=0 ; j<8; j++)
		{
			data >>= 1;
			if(pDataPin[ i*8 + j ] -> Read())
			{
				data |= 0x80;
			}
		}
		*pdt = data;
		pdt++;
	}
	return ERR_FALSE;
}

int CJTAGFlash::SetData(BYTE * buf)
{
	int i,j;
	BYTE *pdt;
	BYTE data;
	pdt = buf;
	for(i = 0; i < nDataWidth; i++)	
	{
		data = *pdt;
		for(j=0; j<8; j++)
		{
			pDataPin[ i*8 + j ] -> Write((int)(data&0x01));
			data >>= 1;
		}
		pdt++;
	}
	return ERR_FALSE;
}

int CJTAGFlash::Standby(void)
{
	pWRPin -> Oe(1);
	pWRPin -> Write(1);
	pRDPin -> Oe(1);
	pRDPin -> Write(1);
	pCSPin -> Oe(1);
	pCSPin -> Write(1);
	return 0;
}

int CJTAGFlash::ToRead(long addr)
{
	SetAddr(addr);
	for(int i = 0; i < nDataWidth * 8; i++)	pDataPin[i] -> Oe(0);
	pRDPin -> Oe(1);
	pRDPin -> Write(0);
	pCSPin -> Oe(1);
	pCSPin -> Write(0);
	return 0;
}

int CJTAGFlash::ToWrite(long addr)
{
	for(int i = 0; i < nDataWidth * 8; i++)	pDataPin[i] -> Oe(1);
	// falling edge is used to latch address, so it shoul be high initial
	pWRPin -> Oe(1);    
	pWRPin -> Write(1);
	pCSPin -> Oe(1);
	pCSPin -> Write(0);
	
	return 0;
}


int CJTAGFlash::Dump()
{
	printf("Flash data width: %d Byte(s)\n", nDataWidth);
	printf("Flash address width: %d \n", nAddrWidth);
	if(flag_verbose)
	{
		printf("Address pins map:\n");
		for(int i=0; i<nAddrWidth; i++)
		{
			printf("ADDRESS%-2d  BSDL pin name:%-s\n", i, pAddrPin[i] -> strName);
		}
		printf("Data pins map:\n");
		for(i=0; i< nDataWidth * 8; i++)
		{
			printf("DATA%-2d  BSDL pin name:%-s\n", i, pDataPin[i] -> strName);
		}
	}
	return 0;
}

int CJTAGFlash::Setup(CFCDFile *fcd, CJTAGChain *chain)
{
	int i;
	AddLog("\n[Setup Flash Pin Map]\n");	

	nAddrWidth = fcd -> nAddrWidth;
	nDataWidth = fcd -> nDataWidth;

	// Setup Address Map
	
	for(i=0; i<nAddrWidth; i++)
	{
		pAddrPin[i] = chain -> Device.GetPin(fcd -> AddrPin[i]);
		if(pAddrPin[i] == NULL)
		{
			AddLog("Miss Pin of Flash Address !\n");
			return ERR_TRUE;
		}
		if(pAddrPin[i] -> nAssigned) 
		{
			AddLog("Address Pin Re-assigned !\n");
			return ERR_TRUE;
		}
		else
			pAddrPin[i] -> nAssigned++;
		if(pAddrPin[i] -> nType != PIN_OUT && pAddrPin[i] -> nType != PIN_INOUT)
		{
			AddLog("Address Pin Type ERROR !\n");
			return ERR_TRUE;
		}
	}
	
	// Setup Data Map
	
	for(i=0; i< (nDataWidth * 8); i++)
	{
		pDataPin[i] = chain -> Device.GetPin( fcd -> DataPin[i] );
		if(pDataPin[i] == NULL)
		{
			AddLog("Miss Pin of Flash Data !\n");
			return ERR_TRUE;
		}
		if(pDataPin[i] -> nAssigned) 
		{
			AddLog("Data Pin Re-assigned !\n");
			return ERR_TRUE;
		}
		else
			pDataPin[i] -> nAssigned++;
		if(pDataPin[i] -> nType != PIN_INOUT)
		{
			AddLog("Data Pin Type ERROR !\n");
			return ERR_TRUE;
		}
	}
	
	// Setup RD Map
	
	pRDPin = chain -> Device.GetPin(fcd -> RDPin);
	if(pRDPin == NULL)
	{
		AddLog("NO Pin of Flash RD !\n");
		return ERR_TRUE;
	}
	if(pRDPin -> nAssigned)
	{
		AddLog("RD Pin Re-assigned !\n");
		return ERR_TRUE;
	}
	else
		pRDPin -> nAssigned++; 
	if(pRDPin -> nType != PIN_OUT && pRDPin -> nType != PIN_INOUT)
	{
		AddLog("RD Pin Type ERROR !\n");
		return ERR_TRUE;
	}
	
	// Setup WR Map
	
	pWRPin = chain -> Device.GetPin( fcd -> WRPin);
	if(pWRPin == NULL)
	{
		AddLog("NO Pin of Flash WR !\n");
		return ERR_TRUE;
	}
	if(pWRPin -> nAssigned)
	{
		AddLog("WR Pin Re-assigned !\n");
		return ERR_TRUE;
	}
	else
		pWRPin -> nAssigned++; 
	if(pWRPin -> nType != PIN_OUT && pWRPin -> nType != PIN_INOUT)
	{
		AddLog("WR Pin Type ERROR !\n");
		return ERR_TRUE;
	}
	
	// Setup CS Map

	pCSPin = chain -> Device.GetPin( fcd -> CSPin);
	if(pCSPin == NULL)
	{
		AddLog("NO Flash CS Map Pin !\n");
		return ERR_TRUE;
	}
	if(pCSPin -> nAssigned)
	{
		AddLog("CS Pin Re-assigned !\n");
		return ERR_TRUE;
	}
	else
		pCSPin -> nAssigned++; 
	if(pCSPin -> nType != PIN_OUT && pCSPin -> nType != PIN_INOUT)
	{
		AddLog("CS Pin Type ERROR !\n");
		return ERR_TRUE;
	}

	return ERR_FALSE;

}

⌨️ 快捷键说明

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