📄 usbjtag.cpp
字号:
// usbjtag.cpp: implementation of the usbjtag class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DebugTool.h"
#include "usbjtag.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// include "amtxhal.h"
#include "amtxhal.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/****************************************/
// function: Initialize all parameter
// input:
// none
// output:
// none
/****************************************/
Cusbjtag::Cusbjtag()
{
// initialize amtxhal parameter
Status = AMTXHAL_STATUS_SUCCESS;
long iceHandle = 0;
long vrefLevel = 0;
long vrefVoltage = 0;
for(int i = 0; i < 128; i++)
{
tdiByteBuffer[i] = (char)0xff;
tdoByteBuffer[i] = (char)0xff;
}
// initialize amba scan parameter
LEON3_IO_AREA = 0xfff00000;
LEON3_CONF_AREA = 0xff000;
LEON3_AHB_SLAVE_CONF_AREA = (1 << 11);
base = 0x080ff000;
LEON3_AHB_CONF_WORDS = 8;
LEON3_APB_CONF_WORDS = 2;
LEON3_AHB_MASTERS = 8;
LEON3_AHB_SLAVES = 16;
LEON3_APB_SLAVES = 16;
LEON3_APBUARTS = 8;
// kenichi 11 2007.7.30 >>
irLength = 0;
addressCmd = 35; //
dataCmd = 33;
// <<
}
Cusbjtag::~Cusbjtag()
{
}
/****************************************/
// function: do ir path scan
// input:
// long handle
// long length
// char *buffer
// output:
// status
/****************************************/
long Cusbjtag::add_ir_scan_in(long handle, long length, char *buffer)
{
long Status;
Status = AMTXHAL_CMDQ_Add_jtag_scan(
handle, //long l_iceHandle,
AMTXHAL_PORT_IO_LEVEL_0, //long l_portID,
AMTXHAL_TARGET_ID_DEFAULT, //long l_targetID,
AMTXHAL_SCAN_ID_DEFAULT, //long l_scanID,
AMTXHAL_BOOLEAN_TRUE, //long l_scanInEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanOutEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanCheckEn,
AMTXHAL_JTAG_STATE_IRSHIFT, //long l_scanState, <- HERE YOU SELECT IR
length, //long l_scanLength,
buffer, //char *pc_scanInTdiByteBuffer,
buffer, //char *pc_scanCheckExpectedTdoByteBuffer,
buffer, //char *pc_scanCheckMaskedTdoByteBuffer,
AMTXHAL_JTAG_STATE_IDLE );
return Status;
}
/****************************************/
// function: do dr path scan
// input:
// long handle
// long length
// char *buffer
// output:
// status
/****************************************/
long Cusbjtag::add_dr_scan_in(long handle, long length, char *buffer)
{
long Status;
Status = AMTXHAL_CMDQ_Add_jtag_scan(
handle, //long l_iceHandle,
AMTXHAL_PORT_IO_LEVEL_0, //long l_portID,
AMTXHAL_TARGET_ID_DEFAULT, //long l_targetID,
AMTXHAL_SCAN_ID_DEFAULT, //long l_scanID,
AMTXHAL_BOOLEAN_TRUE, //long l_scanInEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanOutEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanCheckEn,
AMTXHAL_JTAG_STATE_DRSHIFT, //long l_scanState, <- HERE YOU SELECT IR
length, //long l_scanLength,
buffer, //char *pc_scanInTdiByteBuffer,
buffer, //char *pc_scanCheckExpectedTdoByteBuffer,
buffer, //char *pc_scanCheckMaskedTdoByteBuffer,
AMTXHAL_JTAG_STATE_IDLE );
return Status;
}
/****************************************/
// function: add dr path scan in but stay in dr
// input:
// long handle
// long length
// char *buffer
// output:
// status
/****************************************/
long Cusbjtag::add_dr_scan_in_stay(long handle, long length, char *buffer)
{
long Status;
Status = AMTXHAL_CMDQ_Add_jtag_scan(
handle, //long l_iceHandle,
AMTXHAL_PORT_IO_LEVEL_0, //long l_portID,
AMTXHAL_TARGET_ID_DEFAULT, //long l_targetID,
AMTXHAL_SCAN_ID_DEFAULT, //long l_scanID,
AMTXHAL_BOOLEAN_TRUE, //long l_scanInEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanOutEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanCheckEn,
AMTXHAL_JTAG_STATE_DRSHIFT, //long l_scanState, <- HERE YOU SELECT IR
length, //long l_scanLength,
buffer, //char *pc_scanInTdiByteBuffer,
buffer, //char *pc_scanCheckExpectedTdoByteBuffer,
buffer, //char *pc_scanCheckMaskedTdoByteBuffer,
AMTXHAL_JTAG_STATE_DRSHIFT );
return Status;
}
/****************************************/
// function: add dr path scan inout
// input:
// long handle
// long length
// char *buffer
// output:
// status
/****************************************/
long Cusbjtag::add_dr_scan_inout(long handle, long length, char *buffer)
{
long Status;
Status = AMTXHAL_CMDQ_Add_jtag_scan(
handle, //long l_iceHandle,
AMTXHAL_PORT_IO_LEVEL_0, //long l_portID,
AMTXHAL_TARGET_ID_DEFAULT, //long l_targetID,
AMTXHAL_SCAN_ID_DEFAULT, //long l_scanID,
AMTXHAL_BOOLEAN_TRUE, //long l_scanInEn,
AMTXHAL_BOOLEAN_TRUE, //long l_scanOutEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanCheckEn,
AMTXHAL_JTAG_STATE_DRSHIFT, //long l_scanState, <- HERE YOU SELECT IR
length, //long l_scanLength,
buffer, //char *pc_scanInTdiByteBuffer,
buffer, //char *pc_scanCheckExpectedTdoByteBuffer,
buffer, //char *pc_scanCheckMaskedTdoByteBuffer,
AMTXHAL_JTAG_STATE_IDLE );
return Status;
}
/****************************************/
// function: add dr path scan inout but stay in dr
// input:
// long handle
// long length
// char *buffer
// output:
// status
/****************************************/
long Cusbjtag::add_dr_scan_inout_stay(long handle, long length, char *buffer)
{
long Status;
Status = AMTXHAL_CMDQ_Add_jtag_scan(
handle, //long l_iceHandle,
AMTXHAL_PORT_IO_LEVEL_0, //long l_portID,
AMTXHAL_TARGET_ID_DEFAULT, //long l_targetID,
AMTXHAL_SCAN_ID_DEFAULT, //long l_scanID,
AMTXHAL_BOOLEAN_TRUE, //long l_scanInEn,
AMTXHAL_BOOLEAN_TRUE, //long l_scanOutEn,
AMTXHAL_BOOLEAN_FALSE, //long l_scanCheckEn,
AMTXHAL_JTAG_STATE_DRSHIFT, //long l_scanState, <- HERE YOU SELECT IR
length, //long l_scanLength,
buffer, //char *pc_scanInTdiByteBuffer,
buffer, //char *pc_scanCheckExpectedTdoByteBuffer,
buffer, //char *pc_scanCheckMaskedTdoByteBuffer,
AMTXHAL_JTAG_STATE_DRSHIFT );
return Status;
}
/****************************************/
// function: add write data to address in ram
// input:
// int addr
// int data
// output:
// BOOL type
/****************************************/
BOOL Cusbjtag::add_write_ram(int addr,int data)
{
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 = 0xe (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)0x06;
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;
// command write data
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;
}
else if (irLength == 6)
{
// command dr = 0x02
tdiByteBuffer[0] = (char)0x02;
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)0x06;
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;
// command write data
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 from addr in ram
// input:
// int addr
// output:
// unsigned int type
/****************************************/
BOOL Cusbjtag::add_read_ram(int addr)
{
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)0x00;
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;
// read data // 32 bit data // Split this read scan in two 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;
}
else if (irLength == 6)
{
// command ir = 0x2
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)0x00;
if (add_dr_scan_in(iceHandle, addressCmd, tdiByteBuffer) != AMTXHAL_STATUS_SUCCESS)
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -