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

📄 jtag.cpp

📁 ARM核的边界扫描(JTAG)的实现,此代码在s3c2400上测试通过
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		readData += ReadBit() << bit;
	}
	readData += ReadLastBit() << (bits-1);		// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
	return readData;
}

//////////////////////////////////////////////////////////////////////////////
// Read                                                                     //
//////////////////////////////////////////////////////////////////////////////
void Read(void *readData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	unsigned int *pReadData = (unsigned int *)readData;
	int bits = dataLength;
	//printf("Read %d\n", bits);
	while (bits)
	{
		unsigned int tmpReadData = 0;
		for (int bit=0; bit<32; bit++)
		{
			if (!bits) break;		// do all bits
			if (--bits)
				tmpReadData += ReadBit() << bit;
			else
				tmpReadData += ReadLastBit() << bit;			// do last bit
		}
		*pReadData++ = tmpReadData;
	}
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}

//////////////////////////////////////////////////////////////////////////////
// Read                                                                     //
//////////////////////////////////////////////////////////////////////////////
void Read(unsigned char *readData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Read %d\n", bits);
	while (--bits)
	{
		*readData++ = ReadBit();
	}
	*readData++ = ReadLastBit();		// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}
















//////////////////////////////////////////////////////////////////////////////
// Write                                                                //
//////////////////////////////////////////////////////////////////////////////
void Write(unsigned int writeData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Write %d\n", bits);
	while (--bits)		// do all except last bit
	{
		WriteBit(writeData & 1);
		writeData >>= 1;
	}
	WriteLastBit(writeData & 1);			// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}

//////////////////////////////////////////////////////////////////////////////
// Write                                                                //
//////////////////////////////////////////////////////////////////////////////
void Write(const void *writeData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Write %d\n", bits);
	const unsigned int *pWriteData = (const unsigned int *)writeData;
	while (bits)
	{
		unsigned int tmpWriteData = *pWriteData++;
		for (int intbits=32; intbits; intbits--)
		{
			if (!bits) break;		// do all bits
			if (--bits)
				WriteBit(tmpWriteData & 1);
			else
				WriteLastBit(tmpWriteData & 1);		// do last bit
			tmpWriteData >>= 1;
		}
	}
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}

//////////////////////////////////////////////////////////////////////////////
// Write                                                                    //
//////////////////////////////////////////////////////////////////////////////
void Write(const unsigned char *writeData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Write %d\n", bits);
	while (--bits)		// do all except last bit
	{
		WriteBit(*writeData++);
	}
	WriteLastBit(*writeData++);			// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}










//////////////////////////////////////////////////////////////////////////////
// Transfer                                                                 //
//////////////////////////////////////////////////////////////////////////////
unsigned int Transfer(unsigned int writeData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Transfer %d\n", bits);
	unsigned int readData = 0;
	for (int bit=0; bit<bits-1; bit++)		// do all except last bit
	{
		readData += TransferBit(writeData & 1) << bit;
	}
	readData += TransferLastBit(writeData & 1) << (bits-1);		// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
	return readData;
}

//////////////////////////////////////////////////////////////////////////////
// Transfer                                                                 //
//////////////////////////////////////////////////////////////////////////////
void Transfer(const void *writeData, void *readData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	const unsigned int *pWriteData = (const unsigned int *)writeData;
	unsigned int *pReadData = (unsigned int *)readData;
	int bits = dataLength;
	//printf("Transfer %d\n", bits);
	while (bits)
	{
		unsigned int tmpReadData = 0;
		unsigned int tmpWriteData = *pWriteData++;
		for (int bit=0; bit<32; bit++)
		{
			if (!bits) break;		// do all bits
			if (--bits)
				tmpReadData += TransferBit(tmpWriteData & 1) << bit;
			else
				tmpReadData += TransferLastBit(tmpWriteData & 1) << bit;		// do last bit
			tmpWriteData >>= 1;
		}
		*pReadData++ = tmpReadData;
	}
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}

//////////////////////////////////////////////////////////////////////////////
// Transfer                                                                 //
//////////////////////////////////////////////////////////////////////////////
void Transfer(void *transferData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	unsigned int *pTransferData = (unsigned int *)transferData;
	int bits = dataLength;
	//printf("Transfer %d\n", bits);
	while (bits)
	{
		unsigned int tmpReadData = 0;
		unsigned int tmpWriteData = *pTransferData;
		for (int bit=0; bit<32; bit++)
		{
			if (!bits) break;		// do all bits
			if (--bits)
				tmpReadData += TransferBit(tmpWriteData & 1) << bit;
			else
				tmpReadData += TransferLastBit(tmpWriteData & 1) << bit;		// do last bit
			tmpWriteData >>= 1;
		}
		*pTransferData++ = tmpReadData;
	}
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}

//////////////////////////////////////////////////////////////////////////////
// Transfer                                                             //
//////////////////////////////////////////////////////////////////////////////
void Transfer(const unsigned char *writeData, unsigned char *readData)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Transfer %d\n", bits);
	while (--bits)		// do all except last bit
	{
		*readData++ = TransferBit(*writeData++);
	}
	*readData++ = TransferLastBit(*writeData++);		// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}

//////////////////////////////////////////////////////////////////////////////
// Transfer                                                             //
//////////////////////////////////////////////////////////////////////////////
void Transfer(unsigned char *data)
{
	NextState(TMS_SELECT);
	NextState(TMS_CAPTURE);
	NextState(TMS_SHIFT);
	int bits = dataLength;
	//printf("Transfer %d\n", bits);
	while (--bits)		// do all except last bit
	{
		*data = TransferBit(*data);
		data++;
	}
	*data = TransferLastBit(*data);		// do last bit
	NextState(TMS_UPDATE);
	NextState(TMS_IDLE);
}







//////////////////////////////////////////////////////////////////////////////
// Close                                                                    //
//////////////////////////////////////////////////////////////////////////////
void Close()
{
	printf("JTAG::Close\n");

	Reset();
	OUTP(1,1,1);
	//_outp(PORT+2, 0);	// ~2G
}

//////////////////////////////////////////////////////////////////////////////
// InitGiveIO                                                               //
//////////////////////////////////////////////////////////////////////////////
// activate GIVEIO driver for direct port access
int InitGiveIO()
{
	OSVERSIONINFO osvi;
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	GetVersionEx(&osvi);
	if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) return 0;
	HANDLE h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (h == INVALID_HANDLE_VALUE) { fprintf(stderr, "Error opening giveio driver!\n"); return -1; }
	CloseHandle(h);
	return 0;
}

//////////////////////////////////////////////////////////////////////////////
// Init                                                                     //
//////////////////////////////////////////////////////////////////////////////
int Init()
{
	// init direct I/O access
	if (InitGiveIO()) return -1;

	// init port
	OUTP(1,1,1);
	_outp(PORT+2, 2);		// ~2G

	// test JTAG interface
	/*
	if ((_inp(PORT+1) & (1<<6 | 1<<5)) != (1<<6 | 1<<5)) { fprintf(stderr, "Cannot detect JTAG interface or is unpowered!\n"); return -1; }
	_outp(PORT, 0xFF ^ (1<<5 | 1<<7));
	if (_inp(PORT+1) & (1<<6 | 1<<5)) { fprintf(stderr, "Cannot detect JTAG interface or is unpowered!\n"); return -1; }
	*/

	// reset
	ResetToIdle();

	// default command/chain after reset
	currentCommand = -1;	//Device::IDCODE;
	currentDataChain = -1;	//Device::EBS_CHAIN;
	//dataLength = ;


	return 0;
}

//////////////////////////////////////////////////////////////////////////////
// ~Namespace                                                               //
//////////////////////////////////////////////////////////////////////////////
}

⌨️ 快捷键说明

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