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

📄 jtag.c

📁 ADS模拟JTAG口烧写FLASH的工具
💻 C
字号:
//------------------------------------------------------------------------------// jtag.c//------------------------------------------------------------------------------// JTAG IO Pin^^//                                        //                                        //   JTAG TDI   ______[200]______  D0 (LPT1)//    (PIN 5)                         (PIN 2)//                                        //   JTAG TCK   ______[200]______  D1 (LPT1)//    (PIN 9)                         (PIN 3)//                                        //   JTAG TMS   ______[200]______  D2 (LPT1)//    (PIN 7)                         (PIN 4)////   JTAG nTRST ______[200]______  D3 (LPT1)//    (PIN 3)                         (PIN 5)////   JTAG TDO   ______[200]______  SELECT (LPT1)//    (PIN 11)                       (PIN 13)////   JTAG GND   ------------------ GND (LPT1)//    (PIN 14)                        (PINS 18..25)////******************************************************************************////******************************************************************************#include <stdio.h>#include <stdlib.h>#include <asm/io.h>#include <unistd.h>#include <string.h>#include <memory.h>#include "jtag.h"//******************************************************************************////******************************************************************************unsigned char  JTAG_DOValue;//------------------------------------------------------------------------//------------------------------------------------------------------------unsigned int JTAG_Open(void){    JTAG_DOValue   = JTAG_DEFALT;    // IO 康开狼 荤侩 鼻茄 且寸     if( ioperm( STANDARD_LPT1,          // 佬绊 静妨绰 霉锅掳 器飘                             3,          // 矫累绢靛饭胶 何磐狼 肮荐                                  1 ))        // 器飘 竣技胶 鼻茄( 1 捞搁 倾侩, 0 捞搁 秦力 )    {	       perror( "ioperm" );		       return FALSE;    }            return TRUE;}//------------------------------------------------------------------------//------------------------------------------------------------------------void JTAG_Close(void){    // IO 康开狼 荤侩 鼻茄 且寸     if( ioperm( STANDARD_LPT1,          // 佬绊 静妨绰 霉锅掳 器飘                             3,          // 矫累绢靛饭胶 何磐狼 肮荐                                  0 ));       // 器飘 竣技胶 鼻茄( 1 捞搁 倾侩, 0 捞搁 秦力 )}//------------------------------------------------------------------------//------------------------------------------------------------------------void JTAG_prnout(void){	 	outb( JTAG_DOValue, STANDARD_LPT1 );}//------------------------------------------------------------------------//------------------------------------------------------------------------unsigned char JTAG_prnin(void){	return inb( STANDARD_LPT1 + 1 );}	//------------------------------------------------------------------------ //------------------------------------------------------------------------void JTAG_TCK(unsigned int state){	if(state) JTAG_DOValue |=   JTAG_IO_TCK;	else JTAG_DOValue &= (~JTAG_IO_TCK);		JTAG_prnout();}//------------------------   ------------------------------------------------//------------------------------------------------------------------------void JTAG_TMS(unsigned int state){	if(state) JTAG_DOValue |= JTAG_IO_TMS;	else JTAG_DOValue &= (~JTAG_IO_TMS);	JTAG_prnout();}//------------------------------------------------------------------------//------------------------------------------------------------------------void JTAG_TDI(unsigned int state){	if(state) JTAG_DOValue |= JTAG_IO_TDI;	else JTAG_DOValue &= (~JTAG_IO_TDI);	JTAG_prnout();}//------------------------------------------------------------------------//------------------------------------------------------------------------unsigned int JTAG_TDO(void){	return( JTAG_prnin() & JTAG_IO_TDO ) ? HIGH : LOW ;}void JTAG_HW_Reset(void){	JTAG_DOValue &= (~JTAG_IO_TRST);	JTAG_prnout();	usleep(1000000);	JTAG_DOValue |= JTAG_IO_TRST;	JTAG_prnout();}	void JTAG_Reset(void){	int lp;	 	// Test-Logic-Reset 惑怕肺 官槽促...	JTAG_TMS( HIGH );	for( lp = 0; lp <= 5; lp++ )	{		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	}		// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );}void JTAG_Shift_ir(unsigned int instruction, unsigned int idle){	// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Select-IR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		//Capture-IR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Shift-IR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(instruction & 0x1) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(instruction & 0x2) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(instruction & 0x4) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	if(instruction & 0x8) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );		JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );  // 付瘤阜 厚飘 客 Exit1-IR	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update IR	// Run-Test/ldle 惑怕肺 官槽促...	if(idle)	{		JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	}}void JTAG_Shift_dr_4_bits(unsigned int data){	// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		//Shift-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	if(data & 0x1) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(data & 0x2) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(data & 0x4) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	if(data & 0x8) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );  // 付瘤阜 厚飘 客 Exit1-IR	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );}void JTAG_IDCode(unsigned int *idcode){	unsigned int loop;	unsigned int readvalue;		readvalue = 0;	// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );			//Shift-DR 惑怕肺 父电促...	JTAG_TDI( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		for(loop = 0; loop < 31; loop++)	{		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(JTAG_TDO()) readvalue |= (0x1 << loop);			}	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );  // 付瘤阜 厚飘 客 Exit1-IR	if(JTAG_TDO()) readvalue |= 0x80000000;	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	*idcode = readvalue;}void JTAG_Step(unsigned int instruction, unsigned int *data){	unsigned int loop, readvalue, compare;		readvalue = 0;	// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );			//Shift-DR 惑怕肺 父电促...	JTAG_TDI( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		JTAG_TDI( LOW  ); //debug speed, signal BRKPT = LOW	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	for(loop = 0; loop < 31; loop++)	{		compare = 0x80000000 >> loop;				if(instruction & compare) JTAG_TDI( HIGH );		else JTAG_TDI( LOW );				JTAG_TCK( LOW  ); JTAG_TCK( HIGH );				if(JTAG_TDO()) readvalue |= compare;			}	JTAG_TMS( HIGH ); 	if(instruction & 0x1) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // 付瘤阜 厚飘 客 Exit1-DR	if(JTAG_TDO()) readvalue |= 0x1;	JTAG_TDI( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	*data = readvalue;	}void JTAG_Step_System_Speed(unsigned int instruction){	unsigned int loop;		// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );			//Shift-DR 惑怕肺 父电促...	JTAG_TDI( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		JTAG_TDI( HIGH ); //system speed, signal BRKPT = HIGH	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	for(loop = 0; loop < 31; loop++)	{				if(instruction & (0x80000000 >> loop)) JTAG_TDI( HIGH );		else JTAG_TDI( LOW );				JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					}	JTAG_TMS( HIGH ); 	if(instruction & 0x1) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // 付瘤阜 厚飘 客 Exit1-DR	JTAG_TDI( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	}void JTAG_Read_Bkru(unsigned int address, unsigned int *data){	unsigned int loop, readvalue;		readvalue = 0;	// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );			//Shift-DR 惑怕肺 父电促...	JTAG_TDI( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	if(address & 0x1) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					if(address & 0x2) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );						if(address & 0x4) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );						if(address & 0x8) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					if(address & 0x10) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					JTAG_TMS( HIGH ); 	JTAG_TDI( LOW  ); //Read Bkru	JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // 付瘤阜 厚飘 客 Exit1-DR	JTAG_TDI( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Shift-DR 惑怕肺 父电促...	JTAG_TDI( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		for(loop = 0; loop < 31; loop++)	{		JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		if(JTAG_TDO()) readvalue |= (0x1 << loop);	}	JTAG_TMS( HIGH ); 	JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // 付瘤阜 厚飘 客 Exit1-DR	if(JTAG_TDO()) readvalue |= 0x80000000;	JTAG_TDI( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	*data = readvalue;	}void JTAG_Write_Bkru(unsigned int address, unsigned int data){	unsigned int loop;		// Select-DR-Scan 惑怕肺 父电促...	JTAG_TMS( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Capture-DR 惑怕肺 父电促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );	//Shift-DR 惑怕肺 父电促...	JTAG_TDI( LOW  ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH );		for(loop = 0; loop < 32; loop++)	{				if(data & (0x1 << loop)) JTAG_TDI( HIGH );		else JTAG_TDI( LOW );				JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					}	if(address & 0x1) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					if(address & 0x2) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );						if(address & 0x4) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );						if(address & 0x8) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					if(address & 0x10) JTAG_TDI( HIGH );	else JTAG_TDI( LOW );	JTAG_TCK( LOW  ); JTAG_TCK( HIGH );					JTAG_TMS( HIGH ); 	JTAG_TDI( HIGH  ); //Write Bkru	JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // 付瘤阜 厚飘 客 Exit1-DR	JTAG_TDI( HIGH ); JTAG_TCK( LOW  ); JTAG_TCK( HIGH ); // Update DR	// Run-Test/ldle 惑怕肺 官槽促...	JTAG_TMS( LOW  ); JTAG_TCK( LOW  );	JTAG_TCK( HIGH );	}

⌨️ 快捷键说明

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