X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=02366629c56de341feb2a22f2427c27ad61eb7da;hp=85f3f19ba7639bfad298a0383215e93e3c15adde;hb=19c84b41b9fbde102aee56bc137a8a2885194ebf;hpb=5db7fdd798116263aa78ca8634fe9a28c1b4a918 diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 85f3f19..0236662 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -6,84 +6,88 @@ #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(); +//! Shift 20 bits of the DR. +uint32_t jtag430_dr_shift_20(uint32_t in) +{ + if (!in_run_test_idle()) + { + debugstr("Not in run-test-idle state"); + return 0; + } + + // get intot the right state + jtag_capture_dr(); + jtag_shift_register(); + + // shift DR, then idle + return jtag_trans_n(in, 20, MSB); } //! Grab the core ID. unsigned int jtag430_coreid(){ - jtag_ir_shift8(IR_COREIP_ID); - return jtag_dr_shift16(0); + jtag_ir_shift_8(IR_COREIP_ID); + return jtag_dr_shift_16(0); } //! Grab the device ID. unsigned long jtag430_deviceid(){ - jtag_ir_shift8(IR_DEVICE_ID); - return jtag_dr_shift20(0); + jtag_ir_shift_8(IR_DEVICE_ID); + return jtag430_dr_shift_20(0); } //! Write data to address void jtag430x2_writemem(unsigned long adr, unsigned int data){ - jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); - if(jtag_dr_shift16(0) & 0x0301){ + jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE); + if(jtag_dr_shift_16(0) & 0x0301){ CLRTCLK; - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); + jtag_ir_shift_8(IR_CNTRL_SIG_16BIT); if(adr>=0x100) - jtag_dr_shift16(0x0500);//word mode + jtag_dr_shift_16(0x0500);//word mode else - jtag_dr_shift16(0x0510);//byte mode - jtag_ir_shift8(IR_ADDR_16BIT); - jtag_dr_shift20(adr); + jtag_dr_shift_16(0x0510);//byte mode + jtag_ir_shift_8(IR_ADDR_16BIT); + jtag430_dr_shift_20(adr); SETTCLK; - jtag_ir_shift8(IR_DATA_TO_ADDR); - jtag_dr_shift16(data);//16 word + jtag_ir_shift_8(IR_DATA_TO_ADDR); + jtag_dr_shift_16(data);//16 word CLRTCLK; - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); - jtag_dr_shift16(0x0501); + jtag_ir_shift_8(IR_CNTRL_SIG_16BIT); + jtag_dr_shift_16(0x0501); SETTCLK; CLRTCLK; SETTCLK; //init state }else{ - while(1) PLEDOUT^=PLEDPIN; //loop if locked up + while(1) led_toggle(); //loop if locked up } } @@ -93,28 +97,24 @@ 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_shift_8(IR_CNTRL_SIG_CAPTURE); + }while(!(jtag_dr_shift_16(0) & 0x0301)); - if(jtag_dr_shift16(0) & 0x0301){ + if(jtag_dr_shift_16(0) & 0x0301){ // Read Memory CLRTCLK; - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); + jtag_ir_shift_8(IR_CNTRL_SIG_16BIT); - //if(adr>=0x100){ - jtag_dr_shift16(0x0501);//word read - //}else{ - //jtag_dr_shift16(0x0511);//byte read - //} + jtag_dr_shift_16(0x0501);//word read - jtag_ir_shift8(IR_ADDR_16BIT); - jtag_dr_shift20(adr); //20 + jtag_ir_shift_8(IR_ADDR_16BIT); + jtag430_dr_shift_20(adr); //20 - jtag_ir_shift8(IR_DATA_TO_ADDR); + jtag_ir_shift_8(IR_DATA_TO_ADDR); SETTCLK; CLRTCLK; - toret = jtag_dr_shift16(0x0000); + toret = jtag_dr_shift_16(0x0000); SETTCLK; @@ -123,15 +123,17 @@ unsigned int jtag430x2_readmem(unsigned long adr){ SETTCLK; return toret; } + + return 0xdead; } //return toret; } //! Syncs a POR. unsigned int jtag430x2_syncpor(){ - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); - jtag_dr_shift16(0x1501); //JTAG mode - while(!(jtag_dr_shift16(0) & 0x200)); + jtag_ir_shift_8(IR_CNTRL_SIG_16BIT); + jtag_dr_shift_16(0x1501); //JTAG mode + while(!(jtag_dr_shift_16(0) & 0x200)); //0x100 or 0x200? return jtag430x2_por(); } @@ -143,9 +145,9 @@ unsigned int jtag430x2_por(){ CLRTCLK; SETTCLK; - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); - jtag_dr_shift16(0x0C01); - jtag_dr_shift16(0x0401); + jtag_ir_shift_8(IR_CNTRL_SIG_16BIT); + jtag_dr_shift_16(0x0C01); + jtag_dr_shift_16(0x0401); //cycle for (i = 0; i < 10; i++){ @@ -153,7 +155,7 @@ unsigned int jtag430x2_por(){ SETTCLK; } - jtag_dr_shift16(0x0501); + jtag_dr_shift_16(0x0501); // tick CLRTCLK; @@ -164,8 +166,8 @@ unsigned int jtag430x2_por(){ jtag430x2_writemem(0x015C, 0x5A80); // check state - jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); - if(jtag_dr_shift16(0) & 0x0301) + jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE); + if(jtag_dr_shift_16(0) & 0x0301) return(1);//ok return 0;//error @@ -176,8 +178,8 @@ unsigned int jtag430x2_por(){ unsigned int jtag430x2_fusecheck(){ int i; for(i=0;i<3;i++){ - jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); - if(jtag_dr_shift16(0xAAAA)==0x5555) + jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE); + if(jtag_dr_shift_16(0xAAAA)==0x5555) return 1;//blown } return 0;//unblown @@ -185,18 +187,17 @@ unsigned int jtag430x2_fusecheck(){ //! Handles MSP430X2 JTAG commands. Forwards others to JTAG. -void jtag430x2handle(unsigned char app, - unsigned char verb, - unsigned long len){ - register char blocks; - +void jtag430x2_handle_fn( uint8_t const app, + uint8_t const verb, + uint32_t const len) +{ 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 +210,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 @@ -248,23 +250,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 + + if(l<2) l=2; - while(blocks--){ - for(i=0;i>8); - } + txhead(app,verb,l); + for(i=0;i>8); } break; @@ -286,7 +293,11 @@ 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: @@ -297,7 +308,8 @@ void jtag430x2handle(unsigned char app, txdata(app,NOK,0); break; default: - jtaghandle(app,verb,len); + (*(jtag_app.handle))(app,verb,len); } jtag430_resettap(); } +