?? 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 + -