X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430.c;h=35874a897e797c21fd22b77547f33aa5f5829498;hp=821b655ad8696d83949c449be2bb3b1cfb3f5414;hb=1c1abaa53f950a77dd7e71b2b354e3de0046313b;hpb=750c7626dbfebf6e043cfcbe02fcb4dd5df3aa34 diff --git a/firmware/apps/jtag/jtag430.c b/firmware/apps/jtag/jtag430.c index 821b655..35874a8 100644 --- a/firmware/apps/jtag/jtag430.c +++ b/firmware/apps/jtag/jtag430.c @@ -113,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. @@ -258,6 +257,27 @@ void jtag430_start(){ jtag430_haltcpu(); } +//! Start normally, not JTAG. +void jtag430_stop(){ + debugstr("Exiting JTAG."); + jtagsetup(); + + //Known-good starting position. + //Might be unnecessary. + //SETTST; + CLRTST; + SETRST; + delay(0xFFFF); + + //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG + CLRRST; + delay(0xFFFF); + SETRST; + //P5DIR&=~RST; + //delay(0xFFFF); + +} + //! Set CPU to Instruction Fetch void jtag430_setinstrfetch(){ @@ -276,13 +296,25 @@ void jtag430_setinstrfetch(){ //! Handles classic MSP430 JTAG commands. Forwards others to JTAG. void jtag430handle(unsigned char app, unsigned char verb, - unsigned char len){ - register char blocks; + unsigned long len){ unsigned long at; unsigned int i, val; //debugstr("Classic MSP430 handler."); + + /* FIXME + * Sometimes JTAG doesn't init correctly. + * This restarts the connection if the masked-rom + * chip ID cannot be read. Should print warning + * for testing server. + */ + while((i=jtag430_readmem(0xff0))==0xFFFF){ + jtag430_start(); + P1OUT^=1; + } + P1OUT&=~1; + switch(verb){ case START: //Enter JTAG mode. @@ -290,6 +322,10 @@ void jtag430handle(unsigned char app, //TAP setup, fuse check jtag430_resettap(); + txdata(app,verb,0); + break; + case STOP: + jtag430_stop(); txdata(app,verb,0); break; case JTAG430_HALTCPU: @@ -307,33 +343,24 @@ 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;//clear lsbit - while(blocks--){ - for(i=0;i>8); - } + txhead(app,verb,len); + for(i=0;i>8); } break; case JTAG430_WRITEMEM: @@ -343,16 +370,39 @@ void jtag430handle(unsigned char app, cmddataword[0]=jtag430_readmem(cmddataword[0]); txdata(app,verb,2); break; + /* case JTAG430_WRITEFLASH: + //debugstr("Poking flash memory."); jtag430_writeflash(cmddataword[0],cmddataword[2]); + + //Try again if failure. + //if(cmddataword[2]!=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_WRITEFLASH: + at=cmddataword[0]; + + for(i=0;i<(len>>1)-2;i++){ + //debugstr("Poking flash memory."); + jtag430_writeflash(at+(i<<1),cmddataword[i+2]); + //Reflash if needed. Try this twice to save grace? + if(cmddataword[i]!=jtag430_readmem(at)) + jtag430_writeflash(at+(i<<1),cmddataword[i+2]); + } + + //Return result of first write as a word. + 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: @@ -371,5 +421,5 @@ void jtag430handle(unsigned char app, default: jtaghandle(app,verb,len); } - //jtag430_resettap(); + //jtag430_resettap(); //DO NOT UNCOMMENT }