📄 jtagdlg.cpp
字号:
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); //Select-DR-Scan
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Capture-DR
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Shift-DR
size=strlen(wrDR);
for(i=0;i<(size-1);i++)
{
tdi=(wrDR[i]==HIGH) ? TDI_H:TDI_L;
JTAG_SET(tdi|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(tdi|TMS_L|TCK_H);JTAG_DELAY(); //Shift-DR
rdDR[i]=JTAG_GET_TDO();
}
tdi=(wrDR[i]==HIGH) ? TDI_H:TDI_L; //i=S3C2410_MAX_CELL_INDEX
JTAG_SET(tdi|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(tdi|TMS_H|TCK_H);JTAG_DELAY(); //Exit1-DR
rdDR[i] = JTAG_GET_TDO();
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); //Update-DR
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Run-Test/Idle
}
#if 1
char rdDR[S4510_MAX_CELL_INDEX+1];
#endif
void CJtagDlg::JTAG_ShiftDRStateNoTdo(char *wrDR)
{
int size;
int i;
int tdi;
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); //Select-DR-Scan
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Capture-DR
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Shift-DR
size=strlen(wrDR);
for(i=0;i<(size-1);i++)
{
tdi=(wrDR[i]==HIGH) ? TDI_H:TDI_L;
JTAG_SET(tdi|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(tdi|TMS_L|TCK_H);JTAG_DELAY(); //Shift-DR
#if 1
rdDR[i]=JTAG_GET_TDO();
#endif
}
tdi=(wrDR[i]==HIGH) ? TDI_H:TDI_L; //i=S4510_MAX_CELL_INDEX
JTAG_SET(tdi|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(tdi|TMS_H|TCK_H);JTAG_DELAY(); //Exit1-DR
#if 1
rdDR[i] = JTAG_GET_TDO();
#endif
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); //Update-DR
//Run-Test/Idle
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Update-DR
}
void CJtagDlg::JTAG_Reset(void)
{
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY();
}
//put the processor into extest (drive pins) mode
void CJtagDlg::JTAG_Init(void)
{
JTAG_RunTestldleState();
JTAG_ShiftIRState(EXTEST);
//The initial value of pins will be defined here.
}
void CJtagDlg:: JTAG_ReadId(void)
{
int i;
char id[32];
U32 id32;
CString strCPUName,strTemp;
strCPUName.Empty();
strCpuId.Empty();
strTemp.Empty();
JTAG_Reset();
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // Select-DR Scan Status
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // Select-IR Scan Status
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Capture-IR Status
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Shift-IR Status
//S3C2410 IDCODE Instruction "1110"
JTAG_SET(TDI_L|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_L|TMS_L|TCK_H);JTAG_DELAY(); // '0'
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // '1'
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // '1'
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // '1', //Exit1-IR
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // Update_IR
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // Select-DR-Scan
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Capture-DR
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Shift-DR
for( i=0 ; i<=30 ; i++)
{
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); //Shift-DR
id[i]=(char)JTAG_GET_TDO();
}
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); //Exit1_DR
id[i]=(char)JTAG_GET_TDO(); // Get the last bit!
JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); // Update_DR
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY(); // Why 3 times?
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Run-Test/Idle
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Run-Test/Idle
JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Run-Test/Idle
id32=0;
for(i=31 ;i>=0 ;i--)
{
if(id[i]==HIGH)
id32 |= (1<<i);
}
switch(id32)
{
case 0x1f0f0f0f:
/*
Device ID = 0x1F0F0F0F
bit[0] = 1, always be 1, required by IEEE Std 1149.1
Manufacturer (bit[11:1]): 0x787 – SAMSUNG
Part number (bit[27:12]): 0xF0F0
Version (bit[31:28]) : 0x1
*/
strCPUName.Format("SAMSUNG 44b0/4510 ");
break;
default:
strCPUName.Format("Unknow CPU!");
strTemp.Format("Unknow CPU is detected!");
//exit(0);
break;
}
if(strTemp.IsEmpty())
{
strTemp.Format("CPU-%s(ID=0x%08x) is detected!\n\n", strCPUName, id32);
strCpuId.Format("0x%08x", id32);
GetDlgItem(IDC_EDIT1)->SetWindowText(strCpuId);
}
GetDlgItem(IDC_STATIC_DPARM)->SetWindowText(strCPUName);
AfxMessageBox(strTemp, MB_ICONINFORMATION | MB_OK);
}
/** Open the parallel ,install the driver**/
void CJtagDlg::OpenPpt(void)
{
if(!InstallGiveIo())
{
exit(0);
}
validPpt = GetValidPpt();
if(!validPpt)
{
AfxMessageBox("ERROR: Unable to find a parallel port");
exit(0);
}
SetPptCompMode();
}
//Erase the flash chip
void CJtagDlg::OnButtonEraseFlash()
{
// TODO: Add your control notification handler code here
if(iPrograming==1)
{
if(AfxMessageBox("正在烧写FLASH,确定退出吗?", MB_ICONINFORMATION | MB_OK | IDCANCEL) == MB_OK)
return;
}
if(strCpuId.IsEmpty()|| strFlashId.IsEmpty()||strFlashManuf.IsEmpty())
AfxMessageBox("请先检测CPU和FLASH型号!", MB_ICONINFORMATION | MB_OK);
else
NOR_EraseChip();
}
//Open the bin file
void CJtagDlg::OnButtonOpenFile()
{
// TODO: Add your control notification handler code here
CString title="导入烧写文件";
if(iPrograming==1)
{
if(AfxMessageBox("正在烧写FLASH,确定退出吗?", MB_ICONINFORMATION | MB_OK | IDCANCEL) == MB_OK)
return;
}
GetDlgItem(IDC_EDIT_FILE_CONTENT)->SetWindowText("");
CFileDialog dlg( TRUE , NULL,NULL,OFN_HIDEREADONLY,"Bin file (*.bin)|*.bin||");
dlg.m_ofn.lpstrTitle=title;//标题条
if(dlg.DoModal()==IDOK)
{
m_fileName=dlg.GetPathName();
GetDlgItem(IDC_EDIT4)->SetWindowText(m_fileName);
iFileSize = OpenImageFile(m_fileName, chrFileBuffer);
//显示烧写文件内容
DisplayImageFile(chrFileBuffer, iFileSize, 0);
}
else
{
return;
}
}
//Program the bin file
void CJtagDlg::OnButtonWriteFlash()
{
// TODO: Add your control notification handler code here
if(iPrograming==1)
{
if(AfxMessageBox("正在烧写FLASH,确定退出吗?", MB_ICONINFORMATION | MB_OK | IDCANCEL) == MB_OK)
return;
}
if(m_fileName.IsEmpty())
{
AfxMessageBox("请选择一个烧写文件!", MB_ICONINFORMATION | MB_OK);
}
else
{
if(strCpuId.IsEmpty() || strFlashId.IsEmpty() || strFlashManuf.IsEmpty())
AfxMessageBox("请先检测CPU和FLASH以确保JTAG可用!", MB_ICONINFORMATION | MB_OK);
else
pThreadProgram = ::AfxBeginThread(_ProgramFlashThread,this);
}
}
//Open the bin file and get the size of the file
int CJtagDlg::OpenImageFile(CString filename, U8 *buf)
{
U32 fileEnd,fileStart;
long i;
CString strTemp;
strTemp.Empty();
stream = fopen(filename,"rb");
if(stream == NULL)
{
AfxMessageBox("ERROR:can't find the file.");
exit(0);
}
fseek(stream,0L,SEEK_END);
fileEnd=ftell(stream);
fseek(stream,0L,SEEK_SET);
fileStart=ftell(stream);
iFileSize = fileEnd-fileStart; //fileend == peof+1
if(iFileSize > MAX_FILE_BUFFER)
{
strTemp.Format("文件长度为:%4.2fkByte大于%dkByte,打开文件出错!", iFileSize/1024.0, MAX_FILE_BUFFER/1024);
AfxMessageBox(strTemp, MB_ICONINFORMATION | MB_OK);
iFileSize=0;
}
else
{
for(i=0;i<iFileSize;i++)
{
if(feof(stream))
break;
buf[i] = fgetc(stream);
}
}
strTemp.Format("文件长度为:%4.2fkByte", iFileSize/1024.0);
GetDlgItem(IDC_STATIC_FILE_INFO)->SetWindowText(strTemp);
return iFileSize;
}
int CJtagDlg::DisplayImageFile(U8 *bufTemp,int size,int iType)
{
int i=0,j=0;
CString strTemp,strTemp1;
CString strLineTemp;
unsigned int uiReadBase=0;
char *pStopString;
strLineTemp.Empty();
strTemp.Empty();
if( iType==1 )
{
((CStatic *)GetDlgItem(IDC_EDIT_READ_ADDR))->GetWindowText(strTemp);
uiReadBase = ::strtol(strTemp, &pStopString,16);
}
strTemp.Empty();
for(i=0;i<size/16;i++)
{
strLineTemp.Format("0x%07X0: ", (uiReadBase>>4) + i);
strTemp += strLineTemp;
for(j=0;j<16;j++)
{
strTemp1.Format("%02X ", bufTemp[i*16+j]);
strTemp += strTemp1;
}
strTemp += "\r\n";
}
strLineTemp.Format("0x%07X0: ", (uiReadBase>>4) + size/16);
strTemp += strLineTemp;
for(j=0;j<size%16;j++)
{
strTemp += bufTemp[i*16+j];
}
if(iType==0)
{
GetDlgItem(IDC_EDIT_FILE_CONTENT)->SetWindowText(strTemp);
}
else
{
GetDlgItem(IDC_EDIT_FLASH_CONTENT)->SetWindowText(strTemp);
}
return size;
}
void CJtagDlg::OnButtonReadFlash()
{
// TODO: Add your control notification handler code here
if(iPrograming==1)
{
if(AfxMessageBox("正在烧写FLASH,确定退出吗?", MB_ICONINFORMATION | MB_OK | IDCANCEL) == MB_OK)
return;
}
if(strCpuId.IsEmpty() || strFlashId.IsEmpty() || strFlashManuf.IsEmpty())
AfxMessageBox("请先检测CPU和FLASH以确保JTAG可用!", MB_ICONINFORMATION | MB_OK);
else
pThreadProgram = ::AfxBeginThread(_ProgramFlashReadThread, this);
}
int CJtagDlg::OnCheckFlash(U8 *chrFileBuff,U8 *chrFlashBuff,int iLen)
{
// TODO: Add your control notification handler code here
unsigned int uiReadFlash=0;
int i=0;
int iGroupLen=0;
char *pStopString;
((CStatic *)GetDlgItem(IDC_EDIT_START_ADDR))->GetWindowText(strStartAddr);
uiReadFlash = ::strtol(strStartAddr, &pStopString,16);
//读FLASH数据
NOR_Reset();
//每隔16位读取FLASH值
if(iLen<200)
iGroupLen = 1;
else
iGroupLen = 16;
m_program.ShowWindow(TRUE);
m_program.SetRange32(0, iLen/iGroupLen);
GetDlgItem(IDC_STATIC_FLASH_STATE)->SetWindowText("正在校验......");
for(i=0; i<iLen/iGroupLen; i++)
{
chrFlashBuff[i*iGroupLen] = (unsigned char)NOR_RdHW(uiReadFlash);
uiReadFlash += iGroupLen;
m_program.SetPos(i);
}
for(i=0; i<iLen/iGroupLen; i++)
{
m_program.SetPos(i);
if(chrFlashBuff[i*iGroupLen] != chrFileBuff[i*iGroupLen])
return -1;
}
GetDlgItem(IDC_STATIC_FLASH_STATE)->SetWindowText("校验完成!");
return 0;
}
void CJtagDlg::OnButtonWriteTest()
{
// TODO: Add your control notification handler code here
int iWriteTestLen=8;
unsigned int uiReadFlash=0;
unsigned int uiTemp=0;
int i=0;
char *pStopString;
U8 chrFlash[8]={0xEA,0x00,0x00,0x2A,0xEA,0x00,0x00,0x1D};
U8 chrWrite[8]={0xEA,0x00,0x00,0x2A,0xEA,0x00,0x00,0x1D};
//U8 chrFlash[8]={0};
//U8 chrWrite[8]={0};
if(iPrograming==1)
{
if(AfxMessageBox("正在烧写FLASH,确定退出吗?", MB_ICONINFORMATION | MB_OK | IDCANCEL) == MB_OK)
return;
}
if(strCpuId.IsEmpty() || strFlashId.IsEmpty() || strFlashManuf.IsEmpty())
{
AfxMessageBox("请先检测CPU和FLASH以确保JTAG可用!", MB_ICONINFORMATION | MB_OK);
return ;
}
((CStatic *)GetDlgItem(IDC_EDIT_START_ADDR))->GetWindowText(strStartAddr);
uiReadFlash = ::strtol(strStartAddr, &pStopString,16);
uiTemp = uiReadFlash;
NOR_Init();
NOR_Program(uiTemp, chrWrite, iWriteTestLen);
if(OnCheckFlash(chrFlash, chrWrite, iWriteTestLen))
{
AfxMessageBox("写操作测试失败!", MB_ICONINFORMATION | MB_OK);
}
else
{
AfxMessageBox("写操作检验成功!", MB_ICONINFORMATION | MB_OK);
}
}
//加载
#include <winsvc.h>
void CJtagDlg::setUpDrive()
{
int i;
char namebuff[256];
SC_HANDLE sch,scm;
GetModuleFileName(NULL,namebuff,256);
i = strlen(namebuff);
while (namebuff[i] != '\\')
{
i--;
}
i++;
strcpy(&namebuff[i],"giveio.sys");
sch = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
scm = CreateService(sch,
"PRMonitor",
"PRMonitor",
SERVICE_START |SERVICE_STOP,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
namebuff,
0,
0,
0,
0,
0);
StartService(scm,NULL,NULL);
CloseServiceHandle(scm);
}
//卸载
void CJtagDlg::unloaderDrive()
{
SC_HANDLE sch ;
SERVICE_STATUS ss;
sch = OpenSCManager(NULL,0,0);
SC_HANDLE scm ;
scm = OpenService(sch,"PRMonitor",SERVICE_ALL_ACCESS);
ControlService(scm,SERVICE_CONTROL_STOP,&ss);
DeleteService(scm);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -