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

📄 usbjtag.cpp

📁 usb-jtag转换,sparc芯片反汇编,sparc芯片调试的工具,可以对芯片内的gpio,sdram,flash进行读写,还可以一次下载64K大小的数据,反汇编,在线调试.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			
		// command ir = 0x3 
		tdiByteBuffer[0] = (char)0x03;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

		// read data // 32 bit data                                      // Split this read scan.
		tdiByteBuffer[0] = (char)0x00;                                   // Note :only the 32bits util data 
		tdiByteBuffer[1] = (char)0x00;                                   // will be written to the SCOB buffer.
		tdiByteBuffer[2] = (char)0x00;                                   // 
		tdiByteBuffer[3] = (char)0x00;                                   //
		if (add_dr_scan_inout_stay(iceHandle, 32, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		// read data // Cmd bit                                          //
		tdiByteBuffer[0] = (char)0x00;                                   //
		if (add_dr_scan_in(iceHandle, dataCmd-32, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
	}
		
	return TRUE;        
}

/****************************************/
// function: add write data to addr in flash
// input: 
//			int addr
//			int data
// output:
//			BOOL type
/****************************************/
BOOL Cusbjtag::add_write_flash(int addr, int data)
{
	if((addr%2)==1)
	{
		AfxMessageBox("Error: address must be even number!");
		return FALSE;
	}
	char caddr[4], coutput[4];

	caddr[0]=(addr & 0xFF);
	caddr[1]=(addr & 0xFF00) / 0x100;
	caddr[2]=(addr & 0xFF0000) / 0x10000;
	caddr[3]=(addr & 0xFF000000) / 0x1000000;

 	coutput[0]=(data & 0xFF);
	coutput[1]=(data & 0xFF00) / 0x100;
	coutput[2]=(data & 0xFF0000) / 0x10000;
	coutput[3]=(data & 0xFF000000) / 0x1000000;

	// kenichi 04 2007.7.30 >>
	if (irLength == 10)
	{
		// command ir = 0x0e (10)
		tdiByteBuffer[0] = (char)0x0e;
		tdiByteBuffer[1] = (char)0x00;	
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = 0x102 (9)
		tdiByteBuffer[0] = (char)0x02;
		tdiByteBuffer[1] = (char)0x01;	
		if (add_dr_scan_in(iceHandle, irLength - 1, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command ir = 0x0c (10)
		tdiByteBuffer[0] = (char)0x0c;
		tdiByteBuffer[1] = (char)0x00;	
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = addr (35)
		tdiByteBuffer[0] = (char)caddr[0];
		tdiByteBuffer[1] = (char)caddr[1];	
		tdiByteBuffer[2] = (char)caddr[2];
		tdiByteBuffer[3] = (char)caddr[3];
		tdiByteBuffer[4] = (char)0x05;
		if (add_dr_scan_in(iceHandle, addressCmd, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command ir = 0x0e (10)
		tdiByteBuffer[0] = (char)0x0e;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = 0x103(9)
		tdiByteBuffer[0] = (char)0x03;
		tdiByteBuffer[1] = (char)0x01;
		if (add_dr_scan_in(iceHandle, irLength - 1 , tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command ir = 0x0c (10)
		tdiByteBuffer[0] = (char)0x0c;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// output
		tdiByteBuffer[0] = (char)coutput[0];
		tdiByteBuffer[1] = (char)coutput[1];	
		tdiByteBuffer[2] = (char)coutput[2];
		tdiByteBuffer[3] = (char)coutput[3];
		tdiByteBuffer[4] = (char)0x00;
		if (add_dr_scan_in(iceHandle, 33, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
	}
	else if( irLength == 6)
	{

		// command ir = 0x02 
		tdiByteBuffer[0] = (char)0x02;
		tdiByteBuffer[1] = (char)0x00;	
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = addr (35)
		tdiByteBuffer[0] = (char)caddr[0];
		tdiByteBuffer[1] = (char)caddr[1];	
		tdiByteBuffer[2] = (char)caddr[2];
		tdiByteBuffer[3] = (char)caddr[3];
		tdiByteBuffer[4] = (char)0x05;
		if (add_dr_scan_in(iceHandle, addressCmd, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

		// command ir = 0x03 
		tdiByteBuffer[0] = (char)0x03;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// output
		tdiByteBuffer[0] = (char)coutput[0];
		tdiByteBuffer[1] = (char)coutput[1];	
		tdiByteBuffer[2] = (char)coutput[2];
		tdiByteBuffer[3] = (char)coutput[3];
		tdiByteBuffer[4] = (char)0x00;
		if (add_dr_scan_in(iceHandle, dataCmd, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
	}
	// << 2007.7.31
			
	return TRUE;
}

/****************************************/
// function: add read data to addr in flash
// input: 
//			int addr
//			int data
// output:
//			BOOL type
/****************************************/
BOOL Cusbjtag::add_read_flash(int addr)
{
	// the addr is 2 boudary ?
	if((addr%2)==1)
	{
		AfxMessageBox("Can not read ,addr is must odd number!");
		return -1;
	}
			
	char caddr[4] ;
        
	caddr[0]=(addr & 0xFF);
	caddr[1]=(addr & 0xFF00) / 0x100;
	caddr[2]=(addr & 0xFF0000) / 0x10000;
	caddr[3]=(addr & 0xFF000000) / 0x1000000;

	// kenichi 04 2007.7.30 >>	
	if ( irLength == 10)
	{
		// command ir = 0x0e (10);
		tdiByteBuffer[0] = (char)0x0e;
		tdiByteBuffer[1] = (char)0x00;	
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = 0x102 (9)
		tdiByteBuffer[0] = (char)0x02;
		tdiByteBuffer[1] = (char)0x01;	
		if (add_dr_scan_in(iceHandle, irLength - 1, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command ir = 0x0c (10)
		tdiByteBuffer[0] = (char)0x0c;
		tdiByteBuffer[1] = (char)0x00;	
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = addr (35)
		tdiByteBuffer[0] = (char)caddr[0];
		tdiByteBuffer[1] = (char)caddr[1];	
		tdiByteBuffer[2] = (char)caddr[2];
		tdiByteBuffer[3] = (char)caddr[3];
		tdiByteBuffer[4] = (char)0x01;
		if (add_dr_scan_in(iceHandle, addressCmd, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

		// command ir = 0x0e (10)
		tdiByteBuffer[0] = (char)0x0e;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = 0x103(9)
		tdiByteBuffer[0] = (char)0x03;
		tdiByteBuffer[1] = (char)0x01;
		if (add_dr_scan_in(iceHandle, irLength - 1, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command ir = 0x0c (10)
		tdiByteBuffer[0] = (char)0x0c;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

		// output
		tdiByteBuffer[0] = (char)0x00;
		tdiByteBuffer[1] = (char)0x00;	
		tdiByteBuffer[2] = (char)0x00;
		tdiByteBuffer[3] = (char)0x00;
		if (add_dr_scan_inout_stay(iceHandle, 32, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		// read data // Cmd bit                                          //
		tdiByteBuffer[0] = (char)0x00;                                   //
		if (add_dr_scan_in(iceHandle, dataCmd-32, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

	}
	else if (irLength == 6)
	{
		// command ir = 0x02 
		tdiByteBuffer[0] = (char)0x02;
		tdiByteBuffer[1] = (char)0x00;	
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		
		// command dr = addr (35)
		tdiByteBuffer[0] = (char)caddr[0];
		tdiByteBuffer[1] = (char)caddr[1];	
		tdiByteBuffer[2] = (char)caddr[2];
		tdiByteBuffer[3] = (char)caddr[3];
		tdiByteBuffer[4] = (char)0x01;
		if (add_dr_scan_in(iceHandle, addressCmd, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

		// command ir = 0x03 (10)
		tdiByteBuffer[0] = (char)0x0c;
		tdiByteBuffer[1] = (char)0x00;
		if (add_ir_scan_in(iceHandle, irLength, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;

		// output
		tdiByteBuffer[0] = (char)0x00;
		tdiByteBuffer[1] = (char)0x00;	
		tdiByteBuffer[2] = (char)0x00;
		tdiByteBuffer[3] = (char)0x00;
		tdiByteBuffer[4] = (char)0x00;
		if (add_dr_scan_inout_stay(iceHandle, 32, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
		// read data // Cmd bit                                          //
		tdiByteBuffer[0] = (char)0x00;                                   //
		if (add_dr_scan_in(iceHandle, dataCmd-32, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
			return false;
	}
	// << 2007.7.30	  
	
	return true;
	
}

/****************************************/
// function: open jtagkey and initialize it
//			 check whether it is connected
// input: 
//			none
// output:
//			openjtagtype type
/****************************************/
OpenJtagType Cusbjtag::OpenJtag()
{
	// open ICE (get ice handle)
    Status = AMTXHAL_ICE_Open(&iceHandle);
    if (Status == AMTXHAL_STATUS_SUCCESS)
    {
		// init the JTAG Port (JTAGkey)
		Status = AMTXHAL_ICE_Init(iceHandle, AMTXHAL_ICE_CONFIG_ID_DEFAULT);
		if (Status == AMTXHAL_STATUS_SUCCESS)
		{
			// Check Vref (check if the Port has a connection)
			Status = AMTXHAL_PORT_GetVref(iceHandle, AMTXHAL_PORT_ID_DEFAULT, &vrefLevel, &vrefVoltage);
			if (Status == AMTXHAL_STATUS_SUCCESS)
			{
				if (vrefLevel == AMTXHAL_PORT_IO_LEVEL_1)
				{ 
					return IceOpenSuccess;
				}
				else
					return IceNotConnection;
			}
		}
		else
			return IceNotInitialized ;
	}
	else
    // printf("Amontec AmtXHAL : ICE is not available!");
		return IceNotAvailable;

    return IceFaile;
}

/****************************************/
// function: close jtagkey
// input: 
//			none
// output:
//			BOOL type
/****************************************/
BOOL Cusbjtag::CloseJtag()
{
	if (AMTXHAL_ICE_Close(iceHandle) == AMTXHAL_STATUS_SUCCESS)
		return true;
	else
		return false;
}

/****************************************/
// function: write data to address in ram
// input: 
//			int addr
//			int data
// output:
//			BOOL type
/****************************************/
BOOL Cusbjtag::UsbJtagWrite(int addr,int data)
{
	// enable stream
	if (AMTXHAL_CMDQ_Clr(iceHandle) != AMTXHAL_STATUS_SUCCESS)
		return false;
	if (AMTXHAL_CMDQ_SetAutoExeWhenFullEn(iceHandle, AMTXHAL_CMDQ_AUTOEXEWHENFULL_TRUE) != AMTXHAL_STATUS_SUCCESS)
		return false;

	// add write command to CMDQ
	if (!add_write_ram(addr,data))
		return false;

	// finalize stream
	if (AMTXHAL_CMDQ_Exe(iceHandle) != AMTXHAL_STATUS_SUCCESS)
		return false;
	if (AMTXHAL_CMDQ_Clr(iceHandle) != AMTXHAL_STATUS_SUCCESS)
		return false;

	// disable stream
	if (AMTXHAL_CMDQ_SetAutoExeWhenFullEn(iceHandle, AMTXHAL_CMDQ_AUTOEXEWHENFULL_FALSE) != AMTXHAL_STATUS_SUCCESS)
		return false;

	return TRUE;
}

/****************************************/
// function: read data from addr in ram
// input: 
//			int addr
// output:
//			unsigned int type
/****************************************/
unsigned int Cusbjtag::UsbJtagRead(int addr)
{
	char scob[4]; // SCan Output Byte buffer
	long numBytesReturned = 0;
	unsigned int nReturn=1;
	unsigned char tmp[4] = {0x00};

	// enable stream
	if (AMTXHAL_CMDQ_Clr(iceHandle) != AMTXHAL_STATUS_SUCCESS)
		return 0xffffffff;
	if (AMTXHAL_CMDQ_SetAutoExeWhenFullEn(iceHandle, AMTXHAL_CMDQ_AUTOEXEWHENFULL_TRUE) != AMTXHAL_STATUS_SUCCESS)
		return 0xffffffff;

	// intitialize the Scan Output buffer (SCOB)
	if (AMTXHAL_SCOB_Initialize(iceHandle, scob, 4 ) != AMTXHAL_STATUS_SUCCESS)
		return 0xffffffff;

	// add write command to CMDQ
	if (!add_read_ram(addr))
		return 0xffffffff;

	// finalize stream
	if (AMTXHAL_CMDQ_Exe(iceHandle) != AMTXHAL_STATUS_SUCCESS)
		return 0xffffffff;
	if (AMTXHAL_CMDQ_Clr(iceHandle) != AMTXHAL_STATUS_SUCCESS)
		return 0xffffffff;

	// finalize the Scan Output buffer (SCOB)
	if (AMTXHAL_SCOB_Finalize(iceHandle, &numBytesReturned) != AMTXHAL_STATUS_SUCCESS)
		return 0xffffffff;

	// SCOB data to nReturn buffer
	if (numBytesReturned != 4)
	{
	 // print an error
		return 0xffffffff;
	}
	else
	{
		tmp[0] = (unsigned char)scob[0];
		tmp[1] = (unsigned char)scob[1];
  		tmp[2] = (unsigned char)scob[2];
  		tmp[3] = (unsigned char)scob[3];
		nReturn  = ((unsigned int )tmp[3]) << 24;
		nReturn += ((unsigned int )tmp[2]) << 16;
		nReturn += ((unsigned int )tmp[1]) << 8;
		nReturn += ((unsigned int )tmp[0]) ;
	}

	// disable stream
	if (AMTXHAL_CMDQ_SetAutoExeWhenFullEn(iceHandle, AMTXHAL_CMDQ_AUTOEXEWHENFULL_FALSE) != AMTXHAL_STATUS_SUCCESS)

⌨️ 快捷键说明

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