X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430.c;h=d0b83cb526e80c13d4b79c0786801bae74fde9be;hp=ce4e7b63718d7146f846592fb4013b5822cc913a;hb=f4a6b415e762bcdc560f3ea655851d16f483ea5a;hpb=fa5713a93ff59ebdd126f5b7914a96b5030b32fb diff --git a/firmware/apps/jtag/jtag430.c b/firmware/apps/jtag/jtag430.c index ce4e7b6..d0b83cb 100644 --- a/firmware/apps/jtag/jtag430.c +++ b/firmware/apps/jtag/jtag430.c @@ -54,7 +54,6 @@ unsigned int jtag430_readmem(unsigned int adr){ unsigned int toret; jtag430_haltcpu(); - CLRTCLK; jtag_ir_shift8(IR_CNTRL_SIG_16BIT); @@ -114,7 +113,6 @@ void jtag430_writeflashword(unsigned int adr, unsigned int data){ //Pulse TCLK jtag430_tclk_flashpulses(35); //35 standard - } //! Configure flash, then write a word. @@ -277,7 +275,7 @@ void jtag430_setinstrfetch(){ //! Handles classic MSP430 JTAG commands. Forwards others to JTAG. void jtag430handle(unsigned char app, unsigned char verb, - unsigned char len){ + unsigned long len){ register char blocks; unsigned long at; unsigned int i, val; @@ -308,37 +306,29 @@ void jtag430handle(unsigned char app, case JTAG430_READMEM: case PEEK: - /* - cmddataword[0]=jtag430_readmem(cmddataword[0]); - txdata(app,verb,2); - */ - blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; //Fetch large blocks for bulk fetches, //small blocks for individual peeks. - if(blocks>1) - len=0x80; - - serial_tx(app); - serial_tx(verb); - serial_tx(len); + if(len>5) + len=(cmddataword[2]);//always even. + else + len=2; + len&=~1;//clue lsbit - while(blocks--){ - for(i=0;i>8); - } + txhead(app,verb,len); + for(i=0;i>8); } break; case JTAG430_WRITEMEM: case POKE: + jtag430_haltcpu(); jtag430_writemem(cmddataword[0],cmddataword[2]); cmddataword[0]=jtag430_readmem(cmddataword[0]); txdata(app,verb,2); @@ -346,16 +336,22 @@ void jtag430handle(unsigned char app, case JTAG430_WRITEFLASH: //debugstr("Poking flash memory."); jtag430_writeflash(cmddataword[0],cmddataword[2]); + + //Try again if failure. + if(cmddataword[0]!=jtag430_readmem(cmddataword[0])) + jtag430_writeflash(cmddataword[0],cmddataword[2]); + + //Return result. cmddataword[0]=jtag430_readmem(cmddataword[0]); + txdata(app,verb,2); break; case JTAG430_ERASEFLASH: - jtag430_eraseflash(ERASE_MASS,0xFFFE,0xFFFF); - jtag430_eraseflash(ERASE_MASS,0xFFFE,0xFFFF); - jtag430_eraseflash(ERASE_MASS,0xFFFE,0xFFFF); + jtag430_eraseflash(ERASE_MASS,0xFFFE,0x3000); txdata(app,verb,0); break; case JTAG430_SETPC: + jtag430_haltcpu(); jtag430_setpc(cmddataword[0]); txdata(app,verb,0); break; @@ -370,5 +366,5 @@ void jtag430handle(unsigned char app, default: jtaghandle(app,verb,len); } - jtag430_resettap(); + //jtag430_resettap(); //DO NOT UNCOMMENT }