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