X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=16eeb94fc5b8dfb3ec5893161b3aa1054db54a03;hp=445bb1042ebcf69805f19d56456a703351a51752;hb=977b3dc777ffbc3bc657cc9dd0aa32ecdce9edd6;hpb=c1105ada99267eaceb19d45d422b7d652e619b2e diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 445bb10..16eeb94 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -9,28 +9,38 @@ #include "jtag430x2.h" void jtag430x2_handle_fn( uint8_t const app, - uint8_t const verb, - uint32_t const len); + 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" + /* 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 MSP430X2 devices, such as the MSP430F5xx Family.\n" }; +//! Grab the core ID. +unsigned int jtag430_coreid(){ + jtag_ir_shift8(IR_COREIP_ID); + return jtag_dr_shift16(0); +} + +//! Grab the device ID. +unsigned long jtag430_deviceid(){ + jtag_ir_shift8(IR_DEVICE_ID); + return jtag_dr_shift20(0); +} //! Write data to address @@ -71,20 +81,16 @@ 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 - //} jtag_ir_shift8(IR_ADDR_16BIT); jtag_dr_shift20(adr); //20 @@ -101,6 +107,8 @@ unsigned int jtag430x2_readmem(unsigned long adr){ SETTCLK; return toret; } + + return 0xdead; } //return toret; } @@ -109,7 +117,7 @@ unsigned int jtag430x2_readmem(unsigned long adr){ unsigned int jtag430x2_syncpor(){ jtag_ir_shift8(IR_CNTRL_SIG_16BIT); jtag_dr_shift16(0x1501); //JTAG mode - while(!(jtag_dr_shift16(0) & 0x200)); + while(!(jtag_dr_shift16(0) & 0x200)); //0x100 or 0x200? return jtag430x2_por(); } @@ -188,7 +196,27 @@ void jtag430x2_handle_fn( uint8_t const app, //MSP430 or MSP430X if(jtagid==MSP430JTAGID){ - debugstr("ERROR, using JTAG430X2 instead of JTAG430!"); + //debugstr("ERROR, using JTAG430X2 instead of JTAG430!"); + jtag430mode=MSP430MODE; + + /* 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(); + jtag430_writemem(0x120,0x5a80);//disable watchdog + + jtag430_haltcpu(); + + jtag430_resettap(); + txdata(app,verb,1); + return; }else if(jtagid==MSP430X2JTAGID){ jtag430mode=MSP430X2MODE; @@ -199,6 +227,8 @@ void jtag430x2_handle_fn( uint8_t const app, return; } + + jtag430x2_fusecheck(); jtag430x2_syncpor(); @@ -209,23 +239,28 @@ void jtag430x2_handle_fn( uint8_t const app, break; case JTAG430_READMEM: case PEEK: - blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; - l=0x80; - txhead(app,verb,l); + //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 - while(blocks--){ - for(i=0;i>8); - } + if(l<2) l=2; + + txhead(app,verb,l); + for(i=0;i>8); } break; @@ -247,7 +282,11 @@ void jtag430x2_handle_fn( uint8_t const 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: