📄 usbjtag.cpp
字号:
// 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 + -