📄 jtag.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 + -