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

📄 jtagdlg.cpp

📁 原创
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -