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

📄 jtag.c

📁 ARM的Flash烧写程序代码
💻 C
字号:
//------------------------------------------------------------------------------// 拳老疙   : jtag.c// 橇肺璃飘 : jflash-s3c44b0x// 汲  疙   : jflash-s3c44b0x 狼 jtag 涝免仿 风凭捞促. // // 盔历磊   : 蜡康芒 (林)力捞村叼矩萍 frog@falinux.com// 盔历磊 	: ATMEL Co, LTD - flash uploader// 盔历磊 	: (c) R.Longo - tp_003.c// 荐沥		: 辣傣硅 (林)硅崔沥焊烹脚 dadpeat@naver.com// 荐沥老	: 2003 斥 9岿 7老// 盔历累鼻 : (林)力捞村叼矩萍 //            捞 橇肺弊伐 筋胶狼 俺累 棺 犁 硅器甫 倾侩 钦聪促.//            俺累等 橇肺弊伐狼 惑诀利 捞侩档 倾侩 钦聪促. //            俺累等 橇肺弊伐狼 傍俺绰 鞘夸窍促搁 窍瘤 臼酒档 邓聪促. // 犁历累鼻 : GPL俊 蝶抚聪促.// 林  狼   : //------------------------------------------------------------------------------// 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;//------------------------------------------------------------------------// 汲 疙 : JTAG 牢磐其捞胶 凯扁 // 概 拌 : 绝澜// 馆 券 : 绝澜// 林 狼 : 绝澜//------------------------------------------------------------------------unsigned int JTAG_Open(void){    JTAG_DOValue   = JTAG_DEFALT;    // IO 康开狼 荤侩 鼻茄 且寸     if( ioperm( STANDARD_LPT1,          // 佬绊 静妨绰 霉锅掳 器飘                             3,          // 矫累绢靛饭胶 何磐狼 肮荐                                  1 ))        // 器飘 竣技胶 鼻茄( 1 捞搁 倾侩, 0 捞搁 秦力 )    {	       perror( "ioperm" );		       return FALSE;    }            return TRUE;}//------------------------------------------------------------------------// 汲 疙 : JTAG 牢磐其捞胶 摧扁 // 概 拌 : 绝澜// 馆 券 : 绝澜// 林 狼 : //------------------------------------------------------------------------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 );}	//------------------------------------------------------------------------// 汲 疙 : JTAG狼 CLK 器飘甫 ON/OFF 矫挪促...// 概 拌 : vptrMng	: JTAG 力绢 沥焊 皋葛府 林家//         state	: 0 -> OFF, 弊寇 ON   		// 馆 券 : 器飘 蔼// 林 狼 : 绝澜 //------------------------------------------------------------------------void JTAG_TCK(unsigned int state){	if(state) JTAG_DOValue |=   JTAG_IO_TCK;	else JTAG_DOValue &= (~JTAG_IO_TCK);		JTAG_prnout();}//------------------------   ------------------------------------------------// 汲 疙 : JTAG狼 TMS 器飘甫 ON/OFF 矫挪促...// 概 拌 : vptrMng	: JTAG 力绢 沥焊 皋葛府 林家//         state	: 0 -> OFF, 弊寇 ON   		// 馆 券 : 器飘 蔼// 林 狼 : 绝澜 //------------------------------------------------------------------------void JTAG_TMS(unsigned int state){	if(state) JTAG_DOValue |= JTAG_IO_TMS;	else JTAG_DOValue &= (~JTAG_IO_TMS);	JTAG_prnout();}//------------------------------------------------------------------------// 汲 疙 : JTAG狼 TDI 器飘甫 ON/OFF 矫挪促...// 概 拌 : vptrMng	: JTAG 力绢 沥焊 皋葛府 林家//         state	: 0 -> OFF, 弊寇 ON   		// 馆 券 : 器飘 蔼// 林 狼 : 绝澜 //------------------------------------------------------------------------void JTAG_TDI(unsigned int state){	if(state) JTAG_DOValue |= JTAG_IO_TDI;	else JTAG_DOValue &= (~JTAG_IO_TDI);	JTAG_prnout();}//------------------------------------------------------------------------// 汲 疙 : JTAG狼 TDO 器飘甫 烹秦辑 DATA甫 佬绰促...// 概 拌 : vptrMng	: JTAG 力绢 沥焊 皋葛府 林家//         state	: 0 -> OFF, 弊寇 ON   		// 馆 券 : 器飘 蔼// 林 狼 : 绝澜 //------------------------------------------------------------------------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 + -