X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=445bb1042ebcf69805f19d56456a703351a51752;hp=85f3f19ba7639bfad298a0383215e93e3c15adde;hb=c1105ada99267eaceb19d45d422b7d652e619b2e;hpb=5db7fdd798116263aa78ca8634fe9a28c1b4a918 diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 85f3f19..445bb10 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -6,53 +6,31 @@ #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(); - - //Known-good starting position. - //Might be unnecessary. - SETTST; - SETRST; - - delay(0xFFFF); - - //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG - CLRRST; - delay(20);//10 - CLRTST; - delay(10);//5 - SETTST; - msdelay(10);//5 - SETRST; - P5DIR&=~RST; - - delay(0xFFFF); - - //Perform a reset and disable watchdog. - return jtag430x2_jtagid(); -} +// 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" +}; -//! 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 @@ -185,18 +163,19 @@ unsigned int jtag430x2_fusecheck(){ //! Handles MSP430X2 JTAG commands. Forwards others to JTAG. -void jtag430x2handle(unsigned char app, - unsigned char verb, - unsigned long len){ +void jtag430x2_handle_fn( uint8_t const app, + uint8_t const verb, + uint32_t const len) +{ register char blocks; 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,25 +188,7 @@ void jtag430x2handle(unsigned char app, //MSP430 or MSP430X if(jtagid==MSP430JTAGID){ - 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); + debugstr("ERROR, using JTAG430X2 instead of JTAG430!"); return; }else if(jtagid==MSP430X2JTAGID){ jtag430mode=MSP430X2MODE; @@ -251,11 +212,11 @@ void jtag430x2handle(unsigned char app, blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; - len=0x80; - txhead(app,verb,len); + l=0x80; + txhead(app,verb,l); while(blocks--){ - for(i=0;i