X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=265dae08b1ecb0fbc64f213341f75818d7046f03;hp=1f242ed3dc5bdf13a8e02e765d14813afd4ed9ea;hb=6d6a522d3adf0ddd18d30f24fd6bba0cc3547041;hpb=e1bb976d013627c7fd97c6e5ca547c548483a19f diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 1f242ed..265dae0 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -6,41 +6,29 @@ #include "platform.h" #include "command.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(); + +// define the jtag430x2 app's app_t +app_t const jtag430x2_app = { + /* app number */ + JTAG430X2, - //Known-good starting position. - //Might be unnecessary. - SETTST; - SETRST; + /* handle fn */ + jtag430x2_handle_fn, - delay(0xFFFF); + /* name */ + "JTAG430X2", - //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG - CLRRST; - delay(20);//10 - CLRTST; + /* desc */ + "\tThe JTAG430X2 app extends the basic JTAG app with support\n" + "\tfor 20-bit MSP430X2 devices, such as the MSP430F5xx Family.\n" +}; - delay(10);//5 - SETTST; - msdelay(10);//5 - SETRST; - P5DIR&=~RST; - - delay(0xFFFF); - - //Perform a reset and disable watchdog. - return jtag430x2_jtagid(); -} //! Grab the core ID. unsigned int jtag430_coreid(){ @@ -185,18 +173,19 @@ unsigned int jtag430x2_fusecheck(){ //! Handles MSP430X2 JTAG commands. Forwards others to JTAG. -void jtag430x2handle(unsigned char app, - unsigned char verb, - unsigned long 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){ - jtag430handle(app,verb,len); + (*(jtag430_app.handle))(app,verb,len); return; } @@ -209,6 +198,7 @@ void jtag430x2handle(unsigned char app, //MSP430 or MSP430X if(jtagid==MSP430JTAGID){ + //debugstr("ERROR, using JTAG430X2 instead of JTAG430!"); jtag430mode=MSP430MODE; /* So the way this works is that a width of 20 does some @@ -216,8 +206,8 @@ void jtag430x2handle(unsigned char app, to be exchanged for addresses on 16-bit chips as well as the new MSP430X chips. (This has only been verified on the MSP430F2xx family. TODO verify for others.) - */ - + */ + drwidth=20; //Perform a reset and disable watchdog. @@ -228,6 +218,7 @@ void jtag430x2handle(unsigned char app, jtag430_resettap(); txdata(app,verb,1); + return; }else if(jtagid==MSP430X2JTAGID){ jtag430mode=MSP430X2MODE; @@ -248,23 +239,28 @@ void jtag430x2handle(unsigned char app, break; case JTAG430_READMEM: case PEEK: - blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; - len=0x80; - txhead(app,verb,len); + //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 - while(blocks--){ - for(i=0;i>8); - } + if(l<2) l=2; + + txhead(app,verb,l); + for(i=0;i>8); } break; @@ -276,7 +272,7 @@ void jtag430x2handle(unsigned char app, cmddatalong[0]=jtag430_deviceid(); txdata(app,verb,4); break; - + case JTAG430_WRITEFLASH: case JTAG430_WRITEMEM: case POKE: jtag430x2_writemem(cmddatalong[0], @@ -286,16 +282,23 @@ void jtag430x2handle(unsigned char app, break; //unimplemented functions - case JTAG430_HALTCPU: + 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_WRITEFLASH: + 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(); } +