亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jtag.cpp

?? c8051.rar
?? CPP
字號:
// jtag.cpp: implementation of the jtag class.
//根據silicon laboratorles 提供的 AN105應用手冊編寫而成
//硬件使用 altera ByteBlaster 和xilinx PARALLELIII 線纜
//手冊上理論支持如下器件:
//C8051F000, C8051F001, C8051F002,
//C8051F005, C8051F006, C8051F010, C8051F011,
//C8051F012, C8051F015, C8051F016,
//C8051F017, C8051F206, C8051F220,
//C8051F221, C8051F226, C8051F230,
//C8051F231, C8051F236, C8051F020,
//C8051F021, C8051F022, and C8051F023.
//
//測試通過:
//C8051f020
//
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "C8051JTAG.h"
#include "jtag.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

jtag::jtag()
{
	m_iCcabletype = ALTERABLASTER;
	m_nPort = (WORD)0x378;
	m_ucWriteValue = 0x00;
	b_TDONoInv = TRUE;
	SetPortVal(m_nPort, m_ucWriteValue, 1);				//SET TMS,TCK,TDI to low

	FLCN_LEN = 8;				//	8			// number of bits in FLASHCON
	FLD_RDLEN = 10;				//10			// number of bits in an FLASHDAT read
	FLD_WRLEN = 8;				//8			// number of bits in an FLASHDAT write
	FLA_LEN	= 16;				//16			// number of bits in FLASHADR
	FLSC_LEN = 8;				//8			// number of bits in FLASHSCL
	ucFCONBIT7 = 0;
}

jtag::~jtag()
{
}
/////////////////////////////////////////////////////////////////////////////
// jtag message handlers
//TCK函數
void jtag::TCK(bool bValue)
{
	unsigned char ucTemp;
	ucTemp = 0;
	ucTemp = 1<<m_woTCKPin;
	if(bValue)
	{
		m_ucWriteValue |= ucTemp; 
	}
	else
	{
		ucTemp = ~ucTemp;
		m_ucWriteValue &= ucTemp; 
	}
	SetPortVal(m_nPort, m_ucWriteValue, 1);
}

void jtag::TMS(bool bValue)
{
	unsigned char ucTemp;
	ucTemp = 0;
	ucTemp = 1<<m_woTMSPin;
	if(bValue)
	{
		m_ucWriteValue |= ucTemp; 
		
	}
	else
	{
		ucTemp = ~ucTemp;
		m_ucWriteValue &= ucTemp; 
	}
	SetPortVal(m_nPort, m_ucWriteValue, 1);

}

void jtag::TDI(bool bValue)
{
	unsigned char ucTemp;
	ucTemp = 0;
	ucTemp = 1<<m_woTDIPin;
	if(bValue)
	{
		m_ucWriteValue |= ucTemp; 
	}
	else
	{
		ucTemp = ~ucTemp;
		m_ucWriteValue &= ucTemp; 
	}
	SetPortVal(m_nPort, m_ucWriteValue, 1);
}

bool jtag::TDO()
{
	//獲得控制端口的值,保持高位值不變,將要輸出的值從低4位輸出,且使連接器上的電位狀態與想輸出的值一致
	DWORD temp_dwPortVal;
	unsigned int temp_aa,uiTempPin;
	GetPortVal(m_nPort+m_iTDOAddP, &temp_dwPortVal, 1); //reads a BYTE value from an I/O port
	temp_aa = (unsigned int)temp_dwPortVal;
	uiTempPin = 1<<m_wiTDOPin;
	//1
	if(uiTempPin & temp_aa)
	{
		if (b_TDONoInv)
		{
			return 1;
		}
		else
			return 0;
	}
	//0
	else
	{
		if (b_TDONoInv)
		{
			return 0;
		}
		else
			return 1;
	}
}

void jtag::JTAG_StrobeTCK()
{
	TCK(1);
	TCK(0);
}

void jtag::JTAG_Reset()
{
	TMS (1);
	JTAG_StrobeTCK ();								// move to Test Logic Reset state
	JTAG_StrobeTCK ();
	JTAG_StrobeTCK ();
	JTAG_StrobeTCK ();
	JTAG_StrobeTCK ();
	TMS (0);
	JTAG_StrobeTCK ();								// move to Run_Test/Idle state
}

unsigned int jtag::JTAG_IR_Scan(unsigned int instruction, int num_bits)
{
	unsigned int retval;							// JTAG instruction read
	int i;											// JTAG IR bit counter
	retval = 0x0;
	TMS(1);
	JTAG_StrobeTCK ();								// move to SelectDR
	TMS(1);
	JTAG_StrobeTCK ();								// move to SelectIR
	TMS(0);
	JTAG_StrobeTCK ();								// move to Capture_IR
	TMS(0);
	JTAG_StrobeTCK ();								// move to Shift_IR state
	for (i=0; i < num_bits; i++) 
	{
		TDI(instruction & 0x01);					// shift IR, LSB-first
		instruction = instruction >> 1;
		retval = retval >> 1;
		if (TDO()) 
		{
			retval |= (0x01 << (num_bits - 1));
		}
		if (i == (num_bits - 1))
		{
			TMS(1);								// move to Exit1_IR state
		}
		JTAG_StrobeTCK();
	}
	TMS(1);
	JTAG_StrobeTCK ();								// move to Update_IR
	TMS(0);
	JTAG_StrobeTCK ();								// move to RTI state
	return retval;
}

unsigned long jtag::JTAG_DR_Scan(unsigned long dat, int num_bits)
{
	unsigned long retval; // JTAG return value
	int i; // JTAG DR bit counter

	retval = 0x0L;
	TMS(1);
	JTAG_StrobeTCK (); // move to SelectDR
	TMS(0);
	JTAG_StrobeTCK (); // move to Capture_DR
	TMS(0);
	JTAG_StrobeTCK (); // move to Shift_DR state
	for (i=0; i < num_bits; i++)
	{
		TDI(dat & 0x01); // shift DR, LSB-first
		dat = dat >> 1;
		retval = retval >> 1;
		if(TDO()) 
		{
			retval |= (0x01L << (num_bits - 1));
		}
		if ( i == (num_bits - 1))
		{
			TMS(1); // move to Exit1_DR state
		}
		JTAG_StrobeTCK();
	}
	TMS(1);
	JTAG_StrobeTCK (); // move to Update_DR
	TMS(0);
	JTAG_StrobeTCK (); // move to RTI state
	return retval;
}

void jtag::JTAG_IWrite(unsigned int ireg, unsigned long dat, int num_bits)
{
	int done;							// TRUE = write complete; FALSE otherwise
	JTAG_IR_Scan (ireg, INST_LENGTH);	// load IR with <ireg>
	dat |= (0x03L << num_bits);			// append ‘WRITE’ opcode to data
										// load DR with <dat>
	JTAG_DR_Scan (dat, num_bits + 2);	// initiate the JTAG write
	
	// load DR with ‘0’, and check for BUSY bit to go to ‘0’.
	do
	{
		done = !(JTAG_DR_Scan (0x0L, 1)); // poll for JTAG_BUSY bit
	} while (!done);
}

unsigned long jtag::JTAG_IRead(unsigned int ireg, int num_bits)
{
	unsigned long retval;						// value returned from READ operation
	int done;									// TRUE = write complete; FALSE otherwise
	JTAG_IR_Scan (ireg, INST_LENGTH);			// load IR with <ireg>
	// load DR with read opcode (0x02)
	JTAG_DR_Scan (0x02L, 2);					// initiate the JTAG read
	do 
	{
		done = !(JTAG_DR_Scan (0x0L, 1));		// poll for JTAG_BUSY bit
	} while (!done);
	retval = JTAG_DR_Scan (0x0L, num_bits + 1); // allow poll operation to
	// read remainder of the bits
	retval = retval >> 1;						// shift JTAG_BUSY bit off the end
	return retval;
}

int jtag::FLASH_ByteWrite(unsigned long addr, unsigned char dat)
{
	unsigned long testval;						// holds result of FLASHDAT read
	int done;									// TRUE/FALSE flag
	int retval;									// TRUE if operation successful
	JTAG_IWrite (FLASHSCL, 0x81L, FLSC_LEN);	// set FLASHSCL based on SYSCLK
	// frequency (2MHz = 0x86)
	// set FLASHADR to address to write to
	JTAG_IWrite (FLASHADR, (unsigned long) addr, FLA_LEN);
	JTAG_IWrite (FLASHCON, 0x10L|ucFCONBIT7, FLCN_LEN);	// set FLASHCON for FLASH Write
	// operation (0x10)
	// initiate the write operation
	JTAG_IWrite (FLASHDAT, (unsigned long) dat, FLD_WRLEN);
	JTAG_IWrite (FLASHCON, 0x0L|ucFCONBIT7, FLCN_LEN);		// set FLASHCON for ‘poll’ operation
	do 
	{
		done = !(JTAG_IRead (FLASHDAT, 1));		// poll for FLBusy to de-assert
	} while (!done);
	testval = JTAG_IRead (FLASHDAT, 2);			// read FLBusy and FLFail
	retval = (testval & 0x02) ? FALSE:TRUE;		// FLFail is next to LSB
	return retval;								// return FLASH Pass/Fail
}

int jtag::FLASH_PageErase(unsigned long addr)
{
	unsigned long testval;						// holds result of FLASHDAT read
	int done;									// TRUE/FALSE flag
	int retval;									// TRUE if operation successful
	JTAG_IWrite (FLASHSCL, 0x81L, FLSC_LEN);	// set FLASHSCL based on SYSCLK
	// frequency (2MHz = 0x86)
	// set FLASHADR to address within page to erase
	JTAG_IWrite (FLASHADR, (unsigned long) addr, FLA_LEN);
	JTAG_IWrite (FLASHCON, 0x20L|ucFCONBIT7, FLCN_LEN);	// set FLASHCON for FLASH Erase
	// operation (0x20)
	JTAG_IWrite (FLASHDAT, 0xa5L, FLD_WRLEN);	// set FLASHDAT to 0xa5 to initiate
	// erase procedure
	JTAG_IWrite (FLASHCON, 0x0L|ucFCONBIT7, FLCN_LEN);		// set FLASHCON for ‘poll’ operation
	do 
	{
		done = !(JTAG_IRead (FLASHDAT, 1));		// poll for FLBusy to de-assert
	} while (!done);
	testval = JTAG_IRead (FLASHDAT, 2);			// read FLBusy and FLFail
	retval = (testval & 0x02) ? FALSE: TRUE;	// FLFail is next to LSB
	// set return value based on FLFail bit
	return retval;								// return FLASH Pass/Fail
}

int jtag::FLASH_ByteRead(unsigned long addr, unsigned char *pdat)
{
	unsigned long testval;								// holds result of FLASHDAT read
	int done;											// TRUE/FALSE flag
	int retval;											// TRUE if operation successful
	JTAG_IWrite (FLASHSCL, 0x80L, FLSC_LEN);			// set FLASHSCL based on SYSCLK
	// frequency (2MHz = 0x86)
	// set FLASHADR to address to read from
	JTAG_IWrite (FLASHADR, (unsigned long) addr, FLA_LEN);
	JTAG_IWrite (FLASHCON, 0x02L|ucFCONBIT7, FLCN_LEN);			// set FLASHCON for FLASH Read
	// operation (0x02)
	JTAG_IRead (FLASHDAT, FLD_RDLEN);					// initiate the read operation
	JTAG_IWrite (FLASHCON, 0x0L|ucFCONBIT7, FLCN_LEN);				// set FLASHCON for ‘poll’ operation
	do 
	{

		done = !(JTAG_IRead (FLASHDAT, 1));				// poll for FLBUSY to de-assert

	} while (!done);
	testval = JTAG_IRead (FLASHDAT, FLD_RDLEN);			// read the resulting data
	retval = (testval & 0x02) ? FALSE: TRUE;			// FLFail is next to LSB
	testval = testval >> 2;								// shift data.0 into LSB position
	*pdat = (unsigned char) testval;					// place data in return location
	return retval;										// return FLASH Pass/Fail
}

unsigned char jtag::CableSetup(unsigned char ucCabtype)
{
	DWORD DWTemp;
	switch(ucCabtype)
	{
	case ALTERABLASTER:
		{
			m_wiTDOPin = 7;
			m_iTDOAddP = 1;
			m_woTCKPin = 0;
			m_woTMSPin = 1;
			m_woTDIPin = 6;
			b_TDONoInv = FALSE;
			SetPortVal(m_nPort+2, 0x0f, 1);				//244使能 OE = 0,
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取
			DWTemp = DWTemp & 0x08;
			if (!DWTemp)									//DB25-15為低,連接OK
			{
				OutputDebugString("DB25-15連接OK");
			}
			else
			{
				OutputDebugString("DB25-15與GND連接失敗!");
				return 1;						
			}

			//判斷DB25 7-10腳是否相連
			SetPortVal(m_nPort, 0x20, 1);				//設置DB25-7為高,以讀取DB25-10的電平
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取
			DWTemp = DWTemp & 0x40;						//DB25-10為高,連接OK
			if (DWTemp)									
			{
				OutputDebugString("DB25-7 -- 10 高測試OK");
			}
			else
			{
				OutputDebugString("DB25-7 -- 10 連接失敗");
				return 2;						
			}

			SetPortVal(m_nPort, 0x00, 1);				//設置DB25-7為高,以讀取DB25-10的電平
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取
			DWTemp = DWTemp & 0x40;						//DB25-10為低,連接OK
			if (!DWTemp)									
			{
				OutputDebugString("DB25-7 -- 10 低測試OK");
			}
			else
			{
				OutputDebugString("DB25-7 -- 10 連接失敗");
				return 3;						
			}
			
		}break;
	case PARALLELIII:
		{
			m_wiTDOPin = 4;
			m_iTDOAddP = 1;
			m_woTCKPin = 1;
			m_woTMSPin = 2;
			m_woTDIPin = 0;
			b_TDONoInv = TRUE;
			SetPortVal(m_nPort, 0x40, 1);				//設置DB25-8為高,以讀取Db25- 11,12引腳電平, 74125 C腳低(使能)
			GetPortVal(m_nPort+1,&DWTemp,1);			//讀取11,12電平, 0X1x xxxx
			if ((DWTemp | 0x7F)==0x7F)					//11腳為低
			{
				TRACE("連接11(低)腳成功!");
			}
			else
			{
				TRACE("連接11(低)腳失敗!");
				return 3;
			}

			if ((DWTemp & 0x20)==0x20)					//13腳為高
			{
				TRACE("連接31腳成功!");
			}
			else
			{
				TRACE("連接13腳失敗!");
				return 4;
			}

		}break;
	default:
		{
			TRACE("Error select cable type!!!");
		}
	}
	JTAG_Reset ();							// Reset the JTAG state machine on DUT
	return 0;

}


unsigned long jtag::JtagGetIDCode()
{
		unsigned long ulid;
		JTAG_IR_Scan (RESET, INST_LENGTH);					// Reset the DUT
		JTAG_IR_Scan (IDCODE, INST_LENGTH);					// load IDCODE into IR and HALT the DUT
		ulid = JTAG_DR_Scan (0x0L, IDCODE_LEN);					// read the IDCODE
		
		TRACE("ID號是:0x%08X",ulid);
		return ulid;
}

void jtag::ResetCpu()
{
	JTAG_Reset ();												// Reset the JTAG state machine on DUT
	JTAG_IR_Scan (IDCODE&0x0FFF, INST_LENGTH);					// Reset the DUT
}

int jtag::SelectCPU(unsigned int uiCouType)
{
	switch(uiCouType)
	{
		case C8051F020:
			{
				FLA_LEN	= 16;				//16			// number of bits in FLASHADR			
			}break;
		case C8051F120:
			{
				FLA_LEN	= 17;				//17			// number of bits in FLASHADR
			}break;

	}
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品在线免费| 久久久精品日韩欧美| 国产日韩欧美一区二区三区乱码| 亚洲人成网站在线| 国产精品99久久久久久久vr | 91精品国产全国免费观看| 国产精品伦理在线| 国产伦精品一区二区三区在线观看 | 在线免费观看不卡av| 久久影视一区二区| 青青草国产精品97视觉盛宴| 色综合天天综合狠狠| 中文字幕欧美国产| 国产尤物一区二区| 欧美videofree性高清杂交| 一区二区在线看| 91麻豆免费观看| 亚洲欧美在线高清| 成人久久视频在线观看| www国产精品av| 激情文学综合网| 欧美电影免费提供在线观看| 亚洲国产精品麻豆| 欧美日韩卡一卡二| 亚洲一区二区三区爽爽爽爽爽 | 成人av网站在线| 久久久久国产精品人| 国产一区啦啦啦在线观看| 欧美一级二级在线观看| 青椒成人免费视频| 欧美mv日韩mv亚洲| 国产美女精品一区二区三区| 精品久久久久一区二区国产| 国内精品国产成人国产三级粉色 | 日韩你懂的在线播放| 毛片不卡一区二区| 久久久美女毛片| 高潮精品一区videoshd| 国产精品三级视频| 91啪亚洲精品| 亚洲综合激情小说| 日韩一区二区在线看| 精品一区二区三区免费播放| 精品精品国产高清a毛片牛牛 | 国产精品网友自拍| 99久久99久久综合| 亚洲成人动漫在线观看| 7777精品伊人久久久大香线蕉超级流畅| 日本伊人色综合网| 久久久久国色av免费看影院| 国产成人高清在线| 一区二区三区日韩在线观看| 这里只有精品99re| 国产不卡在线一区| 亚洲二区在线观看| 久久精品在这里| 91麻豆免费在线观看| 日韩国产欧美在线视频| 久久久久久久久久久久久久久99 | 中文字幕一区日韩精品欧美| 一本一本大道香蕉久在线精品 | 久久99精品久久只有精品| 久久综合成人精品亚洲另类欧美 | 在线亚洲一区二区| 青青青伊人色综合久久| 国产精品人人做人人爽人人添| 色999日韩国产欧美一区二区| 午夜精品久久久久久久久久久| 欧美精品一区二区不卡| 色综合天天在线| 狠狠狠色丁香婷婷综合激情| 亚洲三级理论片| 精品美女被调教视频大全网站| av成人动漫在线观看| 美脚の诱脚舐め脚责91 | 精品处破学生在线二十三| 99精品国产99久久久久久白柏| 蜜桃视频免费观看一区| 最新国产精品久久精品| 久久亚洲一区二区三区明星换脸 | 欧美一级片在线观看| 成人永久免费视频| 日本视频免费一区| 最新中文字幕一区二区三区| 精品欧美一区二区在线观看| 欧日韩精品视频| 国产成人午夜99999| 日本不卡视频在线| 亚洲香肠在线观看| 国产精品护士白丝一区av| 欧美电视剧在线看免费| 欧美色区777第一页| 91欧美激情一区二区三区成人| 久久精品国产99久久6| 首页亚洲欧美制服丝腿| 亚洲精品国久久99热| 欧美激情自拍偷拍| 国产欧美一区二区精品性| 日韩免费观看高清完整版| 欧美三级资源在线| 日本高清不卡aⅴ免费网站| 成人av影视在线观看| 国产呦萝稀缺另类资源| 精品一区二区免费看| 日本成人在线看| 五月婷婷另类国产| 亚洲福利国产精品| 亚洲成人资源网| 亚洲狠狠爱一区二区三区| 亚洲最新在线观看| 亚洲一区av在线| 亚洲va韩国va欧美va| 一区二区三区中文在线| 一个色在线综合| 亚洲成人动漫av| 三级不卡在线观看| 欧美bbbbb| 激情综合色丁香一区二区| 免费观看91视频大全| 久久91精品久久久久久秒播| 看国产成人h片视频| 麻豆精品一区二区三区| 国产一区不卡在线| 成人av电影在线网| aaa亚洲精品| 欧美日韩免费电影| 日韩视频免费观看高清在线视频| 日韩午夜在线影院| 久久久久国产精品人| ㊣最新国产の精品bt伙计久久| 亚洲欧美日韩一区| 日韩电影免费在线| 国产一区二区三区av电影 | 香蕉影视欧美成人| 免费精品视频在线| 国产不卡在线播放| 欧美视频在线播放| 日韩欧美高清在线| 国产精品久久久久久一区二区三区 | 日产国产高清一区二区三区| 激情偷乱视频一区二区三区| 成人一级黄色片| 欧美唯美清纯偷拍| 欧美成人国产一区二区| 国产精品久久久久久福利一牛影视| 亚洲精品中文字幕乱码三区| 奇米影视一区二区三区| 成人性色生活片| 欧美巨大另类极品videosbest| 久久综合五月天婷婷伊人| 亚洲精品免费在线播放| 久久超碰97中文字幕| 99精品热视频| 精品国产一区二区三区四区四| 亚洲欧美怡红院| 免费在线成人网| 91麻豆产精品久久久久久 | 一区二区不卡在线视频 午夜欧美不卡在 | 国产成人精品三级麻豆| 91福利在线播放| 久久精品男人的天堂| 亚洲第一成年网| 岛国一区二区在线观看| 欧美一区二区三区四区视频| 国产精品久久久久毛片软件| 美女爽到高潮91| 日本道色综合久久| 久久精品一二三| 蜜桃一区二区三区四区| 欧美亚洲高清一区二区三区不卡| 久久午夜色播影院免费高清| 日韩精品成人一区二区三区| 欧美日韩免费高清一区色橹橹 | 午夜精品免费在线观看| 日韩电影在线观看电影| 欧美国产欧美综合| 国产亚洲一二三区| 日本va欧美va欧美va精品| 91成人国产精品| ●精品国产综合乱码久久久久 | 精品日产卡一卡二卡麻豆| 亚洲一区二区精品3399| 波多野结衣中文字幕一区二区三区| 日韩一区二区三区在线观看| 亚洲制服丝袜在线| 91久久精品一区二区三区| 国产精品丝袜91| 国产成+人+日韩+欧美+亚洲| 久久午夜国产精品| 日韩高清电影一区| 欧美片网站yy| 一个色在线综合| 欧美午夜精品一区二区三区| 亚洲免费观看在线观看| 一本久久精品一区二区| 亚洲欧美综合在线精品| 99久久综合99久久综合网站| 国产精品无圣光一区二区| 成人午夜免费av| 亚洲天堂中文字幕|