X-Git-Url: http://git.rot13.org//?a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag.c;h=20c43601947a6c68e1af09e4dd5b6085603a1fc5;hb=d7ad826230d336ad7b7bd20e47dccc26d7ad456f;hp=5abba15cb43d6cee14365179c5b8f38f1a01c690;hpb=3e4369fde16445c994da1b1efb332704aad0716d;p=goodfet diff --git a/firmware/apps/jtag/jtag.c b/firmware/apps/jtag/jtag.c index 5abba15..20c4360 100644 --- a/firmware/apps/jtag/jtag.c +++ b/firmware/apps/jtag/jtag.c @@ -1,7 +1,8 @@ -//GoodFET JTAG Application -//Handles basic I/O +/*! \file jtag.c + \author Travis Goodspeed + \brief Low-level JTAG +*/ -//Higher level left to client application. #include "platform.h" #include "command.h" @@ -13,8 +14,10 @@ void jtagsetup(){ P5DIR|=MOSI+SCK+TMS; P5DIR&=~MISO; P5OUT|=0xFFFF; + P5OUT=0; P4DIR|=TST; P2DIR|=RST; + msdelay(100); } int savedtclk=0; @@ -55,14 +58,19 @@ unsigned char jtagtrans8(unsigned char byte){ unsigned long jtagtransn(unsigned long word, unsigned int bitcount){ unsigned int bit; - unsigned int high=(word>>16); - SAVETCLK; + //0x8000 + unsigned long high=0x8000; + if(bitcount==20) + high=0x80000; + if(bitcount==16) + high= 0x8000; + SAVETCLK; for (bit = 0; bit < bitcount; bit++) { /* write MOSI on trailing edge of previous clock */ - if (word & 0x8000) + if (word & high) {SETMOSI;} else {CLRMOSI;} @@ -94,40 +102,6 @@ unsigned long jtagtransn(unsigned long word, return word; } -/* -//! Shift 16 bits in and out. -unsigned int jtagtrans16(unsigned int word){ //REMOVEME - unsigned int bit; - SAVETCLK; - - for (bit = 0; bit < 16; bit++) { - // write MOSI on trailing edge of previous clock - if (word & 0x8000) - {SETMOSI;} - else - {CLRMOSI;} - word <<= 1; - - if(bit==15) - SETTMS;//TMS high on last bit to exit. - - CLRTCK; - SETTCK; - // read MISO on trailing edge - word |= READMISO; - } - RESTORETCLK; - - // exit state - CLRTCK; - SETTCK; - // update state - CLRTMS; - CLRTCK; - SETTCK; - - return word; -}*/ //! Stop JTAG, release pins void jtag_stop(){ @@ -137,7 +111,7 @@ void jtag_stop(){ unsigned int drwidth=20; //! Shift all bits of the DR. -unsigned long jtag_dr_shift(unsigned long in){ +unsigned long jtag_dr_shift20(unsigned long in){ // idle SETTMS; CLRTCK; @@ -151,14 +125,26 @@ unsigned long jtag_dr_shift(unsigned long in){ SETTCK; // shift DR, then idle - return(jtagtransn(in,drwidth)); + return(jtagtransn(in,20)); } //! Shift 16 bits of the DR. unsigned int jtag_dr_shift16(unsigned int in){ - //This name is deprecated, kept around to find 16-bit dependent code. - return jtag_dr_shift(in); + // idle + SETTMS; + CLRTCK; + SETTCK; + // select DR + CLRTMS; + CLRTCK; + SETTCK; + // capture IR + CLRTCK; + SETTCK; + + // shift DR, then idle + return(jtagtransn(in,16)); } @@ -186,7 +172,7 @@ unsigned char jtag_ir_shift8(unsigned char in){ //! Handles a monitor command. void jtaghandle(unsigned char app, unsigned char verb, - unsigned char len){ + unsigned long len){ switch(verb){ //START handled by specific JTAG case STOP: