X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=6ba361ac7c4586eedd40d46f20162128ab179583;hp=965c2626eef287344aaff2bed93d6b53dda390a4;hb=9afcc58660c97fb70b2f214e2008a86deac531b1;hpb=1283fdb830f9ecd0e27e10ef66927562aff674a7 diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 965c262..6ba361a 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -1,50 +1,35 @@ /*! \file jtag430x2.c \author Travis Goodspeed - - This is an implementation of the MSP430X2 JTAG protocol - for the GoodFET project at http://goodfet.sf.net/ - - See the license file for details of proper use. + \brief MSP430X2 JTAG (20-bit) */ #include "platform.h" #include "command.h" -#include "jtag.h" +#include "jtag430.h" +#include "jtag430x2.h" -unsigned char jtagid; +void jtag430x2_handle_fn( uint8_t const app, + uint8_t const verb, + uint32_t const len); -//! Get the JTAG ID -unsigned char jtag430x2_jtagid(){ - jtag430_resettap(); - return jtagid=jtag_ir_shift8(IR_BYPASS); -} -//! Start JTAG, take pins -unsigned char jtag430x2_start(){ - jtagsetup(); - - //Known-good starting position. - //Might be unnecessary. - SETTST; - SETRST; - - delay(0xFFFF); - - //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG - CLRRST; - delay(10); - CLRTST; - delay(5); - SETTST; - msdelay(5); - SETRST; - P5DIR&=~RST; - - delay(0xFFFF); - - //Perform a reset and disable watchdog. - return jtag430x2_jtagid(); -} +// define the jtag430x2 app's app_t +app_t const jtag430x2_app = { + + /* app number */ + JTAG430X2, + + /* handle fn */ + jtag430x2_handle_fn, + + /* name */ + "JTAG430X2", + + /* desc */ + "\tThe JTAG430X2 app extends the basic JTAG app with support\n" + "\tfor 20-bit MSP430 devices.\n" +}; + //! Grab the core ID. unsigned int jtag430_coreid(){ @@ -87,46 +72,48 @@ void jtag430x2_writemem(unsigned long adr, SETTCLK; //init state }else{ - while(1) P1OUT^=1; //loop if locked up + while(1) PLEDOUT^=PLEDPIN; //loop if locked up } } //! Read data from address unsigned int jtag430x2_readmem(unsigned long adr){ unsigned int toret=0; + //unsigned int tries=5; - do{ + while(1){ + //do{ jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); - }while(!(jtag_dr_shift16(0) & 0x0301)); - - if(jtag_dr_shift16(0) & 0x0301){ - // Read Memory - CLRTCLK; - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); - if(adr>=0x100){ + //}while(!(jtag_dr_shift16(0) & 0x0301)); + + if(jtag_dr_shift16(0) & 0x0301){ + // Read Memory + CLRTCLK; + jtag_ir_shift8(IR_CNTRL_SIG_16BIT); + + //if(adr>=0x100){ jtag_dr_shift16(0x0501);//word read - }else{ - jtag_dr_shift16(0x0511);//byte read + //}else{ + //jtag_dr_shift16(0x0511);//byte read + //} + + jtag_ir_shift8(IR_ADDR_16BIT); + jtag_dr_shift20(adr); //20 + + jtag_ir_shift8(IR_DATA_TO_ADDR); + SETTCLK; + CLRTCLK; + toret = jtag_dr_shift16(0x0000); + + SETTCLK; + + //Cycle a bit. + CLRTCLK; + SETTCLK; + return toret; } - - jtag_ir_shift8(IR_ADDR_16BIT); - jtag_dr_shift20(adr); //20 - - jtag_ir_shift8(IR_DATA_TO_ADDR); - SETTCLK; - CLRTCLK; - toret = jtag_dr_shift16(0x0000); - - SETTCLK; - - //Cycle a bit. - CLRTCLK; - SETTCLK; - }else{ - return 0xBABE; } - - return toret; + //return toret; } //! Syncs a POR. @@ -187,30 +174,38 @@ unsigned int jtag430x2_fusecheck(){ //! Handles MSP430X2 JTAG commands. Forwards others to JTAG. -void jtag430x2handle(unsigned char app, - unsigned char verb, - unsigned char len){ +void jtag430x2_handle_fn( uint8_t const app, + uint8_t const verb, + uint32_t const len) +{ register char blocks; unsigned int i,val; - unsigned long at; + unsigned long at, l; //jtag430_resettap(); + if(verb!=START && jtag430mode==MSP430MODE){ + (*(jtag430_app.handle))(app,verb,len); + return; + } + switch(verb){ case START: //Enter JTAG mode. - do cmddata[0]=jtag430x2_start(); - while(cmddata[0]==00 || cmddata[0]==0xFF); + //do + cmddata[0]=jtag430x2_start(); + //while(cmddata[0]==00 || cmddata[0]==0xFF); //MSP430 or MSP430X if(jtagid==MSP430JTAGID){ - jtag430mode=MSP430MODE; - drwidth=16; + debugstr("ERROR, using JTAG430X2 instead of JTAG430!"); + return; }else if(jtagid==MSP430X2JTAGID){ jtag430mode=MSP430X2MODE; drwidth=20; }else{ + debugstr("JTAG version unknown."); txdata(app,NOK,1); return; } @@ -225,31 +220,28 @@ void jtag430x2handle(unsigned char app, break; case JTAG430_READMEM: case PEEK: - blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; - /* - cmddataword[0]=jtag430x2_readmem(at); - txdata(app,verb,2); - break; - */ + //Fetch large blocks for bulk fetches, + //small blocks for individual peeks. + if(len>5) + l=(cmddataword[2]);//always even. + else + l=2; + l&=~1;//clear lsbit - len=0x80; - serial_tx(app); - serial_tx(verb); - serial_tx(len); + if(l<2) l=2; - while(blocks--){ - for(i=0;i>8); - } + txhead(app,verb,l); + for(i=0;i>8); } break; @@ -261,11 +253,7 @@ void jtag430x2handle(unsigned char app, cmddatalong[0]=jtag430_deviceid(); txdata(app,verb,4); break; - case JTAG430_HALTCPU: - //jtag430x2_haltcpu(); - break; - case JTAG430_RELEASECPU: - case JTAG430_SETINSTRFETCH: + case JTAG430_WRITEFLASH: case JTAG430_WRITEMEM: case POKE: jtag430x2_writemem(cmddatalong[0], @@ -273,11 +261,25 @@ void jtag430x2handle(unsigned char app, cmddataword[0]=jtag430x2_readmem(cmddatalong[0]); txdata(app,verb,2); break; - case JTAG430_WRITEFLASH: + + //unimplemented functions + case JTAG430_HALTCPU: + //jtag430x2_haltcpu(); + debugstr("Warning, not trying to halt for lack of code."); + txdata(app,verb,0); + break; + case JTAG430_RELEASECPU: + case JTAG430_SETINSTRFETCH: + case JTAG430_ERASEFLASH: case JTAG430_SETPC: + debugstr("This function is not yet implemented for MSP430X2."); + debughex(verb); + txdata(app,NOK,0); + break; default: - jtaghandle(app,verb,len); + (*(jtag_app.handle))(app,verb,len); } jtag430_resettap(); } +