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

📄 main.cpp

📁 ARM核的边界扫描(JTAG)的实现,此代码在s3c2400上测试通过
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////
// main.cpp                                                                 //
//////////////////////////////////////////////////////////////////////////////
/*
	JTAG flash utility
	GP32
*/

//////////////////////////////////////////////////////////////////////////////
// Includes                                                                 //
//////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include "Device.h"

//////////////////////////////////////////////////////////////////////////////
// Defines                                                                  //
//////////////////////////////////////////////////////////////////////////////
//#define FLASH_MANUFACTURER		0xBF
//#define FLASH_DEVICE_CODE		0xD7

//////////////////////////////////////////////////////////////////////////////
// Variables                                                                //
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
// ReadMemory                                                               //
//////////////////////////////////////////////////////////////////////////////
/*unsigned int ReadMemory(unsigned int address)
{
	SetAddress(address);
	readScan[PNOE_OUT] = 0;
	readScan[PDATA_CON0_15] = 1;
	JtagTransferData(EXTEST, writeScan, readScan, EXTEST_LENGTH);
	JtagTransferData(EXTEST, writeScan, readScan, EXTEST_LENGTH);
	unsigned int data = 0;
	for (int i=0; i<lengthof(PDATA_IN); i++) data += writeScan[PDATA_IN[i]] << i;
	return data;
}

//////////////////////////////////////////////////////////////////////////////
// WriteMemory                                                              //
//////////////////////////////////////////////////////////////////////////////
void WriteMemory(unsigned int address, unsigned int data)
{
	SetAddress(address);
	readScan[PNWE_OUT] = 0;
	readScan[PDATA_CON0_15] = 0;
	for (int i=0; i<lengthof(PDATA_OUT); i++) readScan[PDATA_OUT[i]] = data >> i & 1;
	JtagTransferData(EXTEST, writeScan, readScan, EXTEST_LENGTH);
	readScan[PNWE_OUT] = 1;
	JtagTransferData(EXTEST, writeScan, readScan, EXTEST_LENGTH);
}

//////////////////////////////////////////////////////////////////////////////
// Delay                                                                    //
//////////////////////////////////////////////////////////////////////////////
void Delay(int ticks)
{
	DWORD nCnt = GetTickCount();
	while (nCnt + ticks >= GetTickCount());
}

//////////////////////////////////////////////////////////////////////////////
// FlashInit                                                                //
//////////////////////////////////////////////////////////////////////////////
int FlashInit()
{
	// SoftWare ID Entry
	for (int k=20; ; k--)
	{
		if (k == 0) { fprintf(stderr, "Timeout\n"); return -1; }

		WriteMemory(0x5555,0xaa);
		WriteMemory(0x2aaa,0x55);
		WriteMemory(0x5555,0x90);
		
		Delay(2);
		
		unsigned char ManufactureCode = ReadMemory(0);
		unsigned char DeviceCode = ReadMemory(1);

		printf("ManufactureCode=%02X, DeviceCode=%02X\n", ManufactureCode, DeviceCode);

		if ((ManufactureCode == FLASH_MANUFACTURER) && (DeviceCode != FLASH_DEVICE_CODE)) break;
	}

	//SoftWare ID Exit
	WriteMemory(0x5555,0xaa);
	WriteMemory(0x2aaa,0x55);
	WriteMemory(0x5555,0xF0);
	Delay(10);

/*
	//Chip-Erase
	WriteMemory(0x5555,0xaa);
	WriteMemory(0x2aaa,0x55);
	WriteMemory(0x5555,0x80);
	WriteMemory(0x5555,0xaa);
	WriteMemory(0x2aaa,0x55);
	WriteMemory(0x5555,0x10);
	Delay(80);
*/
/*
	return 0;
}

//////////////////////////////////////////////////////////////////////////////
// FlashWrite                                                               //
//////////////////////////////////////////////////////////////////////////////
int FlashWrite(const char *filename)
{
	printf("Reading firmware...\n");

	unsigned char *pData;
	long totalSize;
	{
		FILE *f = fopen(filename, "rb");
		if (!f) { fprintf(stderr, "Error opening file!\n"); return -1; }
		fseek(f, 0, SEEK_END);
		totalSize = ftell(f);
		fseek(f, 0, SEEK_SET);
		pData = new unsigned char[totalSize];
		fread(pData, totalSize, 1, f);
		fclose(f);
	}

	printf("Erasing firmware...\n");

	if (FlashInit()) return -1;

return 0;
	printf("Programming firmware...\n");

	unsigned char *arBuffer = pData;
	int WriteSize = totalSize;

/*
	//unsigned char arBuffer[READ_BUFFER_SIZE];  //32kbyte
	int freeSize = totalSize;
	int WriteSize;
	int dataOffset = 0;

	do
	{
		if (freeSize >= READ_BUFFER_SIZE)
		{
			WriteSize = READ_BUFFER_SIZE;
			freeSize -= READ_BUFFER_SIZE;
		}
		else 
		{
			WriteSize = freeSize;
			freeSize = 0;
		}

		// buffer俊 烙矫 汗荤 
		unsigned char *arBuffer = pData + dataOffset;
		//memcpy(arBuffer, pData + dataOffset, WriteSize);
		dataOffset += WriteSize;//next write offset
*/		
		// write command
/*		for (int i=0; i<WriteSize; i++)
		{
			WriteMemory(0x5555,0xAA);
			WriteMemory(0x2AAA,0x55);
			WriteMemory(0x5555,0xA0);
int m_nAddressCount = i;			
			WriteMemory(m_nAddressCount, arBuffer[i]);

			int k = 0;
			while ((ReadMemory(m_nAddressCount) & 0x80) != (arBuffer[i] & 0x80))
			{
				WriteMemory( m_nAddressCount, arBuffer[i]);
				if (++k >= 20) return -1;
			}

			//m_nAddressCount++;
		}
/*	} while (freeSize > 0);
*/
/*	return 0;
}
*/

//////////////////////////////////////////////////////////////////////////////
// main                                                                     //
//////////////////////////////////////////////////////////////////////////////
int main()
{
	if (Device::Init()) return -1;
	atexit(Device::Close);


	// init pins
	/*for (int i=0; i<lengthof(writeScan); i++) writeScan[i] = 0;
	for (int i=0; i<lengthof(PNCAS_OUT); i++) writeScan[PNCAS_OUT[i]] = 1;
	for (int i=0; i<lengthof(PNGCS_OUT); i++) writeScan[PNGCS_OUT[i]] = 1;
	writeScan[PNOE_OUT] = 1;
	writeScan[PNWE_OUT] = 1;
	writeScan[PSCKE_+_OUT] = 1;
	writeScan[PSCLK_+_OUT] = 1;*/

	// flash
	//if (FlashWrite("C:\\Programs\\Dev\\GP32\\Emulators\\geepee32\\fw100k.bin")) return -1;

	/*for (int i=0; i<16; i++)
	{
		printf("%02X", ReadMemory(i) & 0xFF);
	}*/


	Device::Test();


	//Device::debug.Exec(, 1);


	//printf("%08X\n", Device::id.Read());


	while (!kbhit())
	{
		printf("\r");
		//device.Sample();
		
		//printf("%08X\n", device.ReadRegister(15));

		//device.Test();
		//Device::Halt();

		/*unsigned int address =
			ScanValue(readScan, PADDR_OUT, lengthof(PADDR_OUT)) +
			0x2000000 * ScanChipSelect(readScan, PNGCS_OUT, lengthof(PNGCS_OUT));	// naaaah
		printf("%08X", address);
		*/

		//printf("%d", device.boundaryScanData[PDATA_CON[0]]);
		//printf("%d %08X\n", device.GetChipSelect(), device.GetAddress());

		//printf("%d %d\n", device.RamSelected(), device.RomSelected());
		
		// nGCS6 = 0x0C000000
/*		switch (device.GetChipSelect())
		{
			case -1:
				break;
			default:
				printf("%d %08X\n", device.GetChipSelect(), 0x02000000*device.GetChipSelect() + device.GetAddress());
				break;
		}*/

		//for (int i=lengthof(PADDR_OUT)-1; i>=0; i--) printf("%d", readScan[PADDR_OUT[i]]);
		//for (int i=lengthof(PDATA_IN)-1; i>=0; i--) printf("%d", readScan[PDATA_IN[i]]);
	}


	return 0;
}

⌨️ 快捷键说明

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