From: travisutk Date: Fri, 4 Sep 2009 08:13:21 +0000 (+0000) Subject: MSP430X2 client connects but reads garbage from ram. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=3e4369fde16445c994da1b1efb332704aad0716d;hp=0fb25630e9970a4e6d18e190c484f654490565b0 MSP430X2 client connects but reads garbage from ram. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@120 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/firmware/apps/jtag/jtag.c b/firmware/apps/jtag/jtag.c index 4dc7021..5abba15 100644 --- a/firmware/apps/jtag/jtag.c +++ b/firmware/apps/jtag/jtag.c @@ -55,8 +55,11 @@ unsigned char jtagtrans8(unsigned char byte){ unsigned long jtagtransn(unsigned long word, unsigned int bitcount){ unsigned int bit; + unsigned int high=(word>>16); SAVETCLK; + + for (bit = 0; bit < bitcount; bit++) { /* write MOSI on trailing edge of previous clock */ if (word & 0x8000) @@ -73,6 +76,11 @@ unsigned long jtagtransn(unsigned long word, /* read MISO on trailing edge */ word |= READMISO; } + + if(bitcount==20){ + word = ((word << 16) | (word >> 4)) & 0x000FFFFF; + } + RESTORETCLK; // exit state diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 0de9a44..e25a905 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -21,7 +21,6 @@ unsigned char jtag430x2_jtagid(){ //! Start JTAG, take pins unsigned char jtag430x2_start(){ jtagsetup(); - P1OUT^=1; //Known-good starting position. //Might be unnecessary. @@ -34,6 +33,7 @@ unsigned char jtag430x2_start(){ CLRRST; delay(10); CLRTST; + delay(5); SETTST; msdelay(5); @@ -46,6 +46,70 @@ unsigned char jtag430x2_start(){ return jtag430x2_jtagid(); } +unsigned int jtag430_coreid(){ + jtag_ir_shift8(IR_COREIP_ID); + return jtag_dr_shift16(0); +} + +unsigned long jtag430_deviceid(){ + jtag_ir_shift8(IR_DEVICE_ID); + return jtag_dr_shift(0); +} + +//! Set the program counter. +void jtag430x2_setpc(unsigned long pc){ + unsigned short Mova; + unsigned short Pc_l; + + Mova = 0x0080; + Mova += (unsigned short)((pc>>8) & 0x00000F00); + Pc_l = (unsigned short)((pc & 0xFFFF)); + + // Check Full-Emulation-State at the beginning + jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); + if(jtag_dr_shift16(0) & 0x0301){ + // MOVA #imm20, PC + CLRTCLK; + // take over bus control during clock LOW phase + jtag_ir_shift8(IR_DATA_16BIT); + SETTCLK; + jtag_dr_shift16(Mova); + jtag_ir_shift8(IR_CNTRL_SIG_16BIT); + jtag_dr_shift16(0x1400); + jtag_ir_shift8(IR_DATA_16BIT); + CLRTCLK; + SETTCLK; + jtag_dr_shift16(Pc_l); + CLRTCLK; + SETTCLK; + jtag_dr_shift16(0x4303); + CLRTCLK; + jtag_ir_shift8(IR_ADDR_CAPTURE); + jtag_dr_shift(0x00000); + } +} + +//! Read data from address +unsigned int jtag430x2_readmem(unsigned int adr){ + unsigned int toret; + + //SETPC_430Xv2(StartAddr); + SETTCLK; + jtag_ir_shift8(IR_CNTRL_SIG_16BIT); + jtag_dr_shift16(0x0501); + jtag_ir_shift8(IR_ADDR_CAPTURE); + + jtag_ir_shift8(IR_DATA_QUICK); + + SETTCLK; + CLRTCLK; + toret = jtag_dr_shift16(0);//read + + jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); + + return toret; +} + //! Handles classic MSP430 JTAG commands. Forwards others to JTAG. void jtag430x2handle(unsigned char app, @@ -58,15 +122,37 @@ void jtag430x2handle(unsigned char app, do cmddata[0]=jtag430x2_start(); while(cmddata[0]==00 || cmddata[0]==0xFF); + //MSP430 or MSP430X + if(jtagid==MSP430JTAGID){ + jtag430mode=MSP430MODE; + drwidth=16; + }else if(jtagid==MSP430X2JTAGID){ + jtag430mode=MSP430X2MODE; + }else{ + txdata(app,NOK,1); + return; + } + //TAP setup, fuse check //jtag430_resettap(); txdata(app,verb,1); break; + case JTAG430_READMEM: + case PEEK: + cmddataword[0]=jtag430x2_readmem(cmddataword[0]); + txdata(app,verb,2); + break; + case JTAG430_COREIP_ID: + cmddataword[0]=jtag430_coreid(); + txdata(app,verb,2); + break; + case JTAG430_DEVICE_ID: + cmddatalong[0]=jtag430_deviceid(); + txdata(app,verb,4); + break; case JTAG430_HALTCPU: case JTAG430_RELEASECPU: case JTAG430_SETINSTRFETCH: - case JTAG430_READMEM: - case PEEK: case JTAG430_WRITEMEM: case POKE: case JTAG430_WRITEFLASH: diff --git a/firmware/include/command.h b/firmware/include/command.h index 78f3302..29e791e 100644 --- a/firmware/include/command.h +++ b/firmware/include/command.h @@ -3,6 +3,7 @@ //! Global data buffer. extern unsigned char cmddata[256]; #define cmddataword ((unsigned int*) cmddata) +#define cmddatalong ((unsigned long*) cmddata) #define memorybyte ((unsigned char*) 0) #define memoryword ((unsigned int*) 0) @@ -71,6 +72,8 @@ extern unsigned char cmddata[256]; #define JTAG430_VERIFYMEM 0xE5 #define JTAG430_BLOWFUSE 0xE6 #define JTAG430_ISFUSEBLOWN 0xE7 +#define JTAG430_COREIP_ID 0xF0 +#define JTAG430_DEVICE_ID 0xF1 //! Handle a command. Defined in goodfet.c void handle(unsigned char app, diff --git a/firmware/include/jtag.h b/firmware/include/jtag.h index c1abdf3..a681e26 100644 --- a/firmware/include/jtag.h +++ b/firmware/include/jtag.h @@ -118,3 +118,11 @@ extern int savedtclk; // Bypass instruction #define IR_BYPASS 0xFF // 0xFF +//MSP430X2 unique +#define IR_COREIP_ID 0xE8 // 0x17 +#define IR_DEVICE_ID 0xE1 // 0x87 + +//MSP430 or MSP430X +#define MSP430JTAGID 0x89 +//MSP430X2 only +#define MSP430X2JTAGID 0x91 diff --git a/firmware/lib/command.c b/firmware/lib/command.c index f585e4c..738fab6 100644 --- a/firmware/lib/command.c +++ b/firmware/lib/command.c @@ -31,6 +31,9 @@ void txdata(unsigned char app, } } +//Be very careful changing delay(). +//It was chosen poorly by trial and error. + //! Delay for a count. void delay(unsigned int count){ volatile unsigned int i=count;