X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=4df9629ed0ec33e83245117475d2741ad4ecb14a;hp=d2bb194732f0b827848a24f5e7cb98749e1014ca;hb=29c88436fcb77cc01088694e54731ac950956afd;hpb=33c548994df07e43f25464b7d3f24642e9142a99 diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index d2bb194..4df9629 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -5,7 +5,31 @@ #include "platform.h" #include "command.h" -#include "jtag.h" +#include "jtag430.h" +#include "jtag430x2.h" + +void jtag430x2_handle_fn( uint8_t const app, + uint8_t const verb, + uint32_t const len); + + +// 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" +}; + unsigned char jtagid; @@ -83,7 +107,7 @@ 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 } } @@ -93,19 +117,20 @@ unsigned int jtag430x2_readmem(unsigned long adr){ //unsigned int tries=5; while(1){ - do{ - jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); - }while(!(jtag_dr_shift16(0) & 0x0301)); + //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){ - jtag_dr_shift16(0x0501);//word read - }else{ - jtag_dr_shift16(0x0511);//byte read - } + + //if(adr>=0x100){ + jtag_dr_shift16(0x0501);//word read + //}else{ + //jtag_dr_shift16(0x0511);//byte read + //} jtag_ir_shift8(IR_ADDR_16BIT); jtag_dr_shift20(adr); //20 @@ -184,18 +209,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,7 +235,15 @@ void jtag430x2handle(unsigned char app, //MSP430 or MSP430X if(jtagid==MSP430JTAGID){ jtag430mode=MSP430MODE; - drwidth=16; + + /* So the way this works is that a width of 20 does some + backward-compatibility finagling, causing the correct value + 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. jtag430_por(); @@ -242,11 +276,11 @@ void jtag430x2handle(unsigned char app, blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; - len=0x80; - txhead(app,verb,len); + l=0x80; + txhead(app,verb,l); while(blocks--){ - for(i=0;i