X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtag430x2.c;h=02366629c56de341feb2a22f2427c27ad61eb7da;hp=1528e7c920925e0eea84d9348c50ed6a26218087;hb=69539bb167246135b1bde3c55dca7d19bc3c7aee;hpb=984c06c6028f27ef87d7b9453c8c61045b8d26dd diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 1528e7c..0236662 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -29,49 +29,65 @@ app_t const jtag430x2_app = { "\tfor 20-bit MSP430X2 devices, such as the MSP430F5xx Family.\n" }; +//! 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 } } @@ -82,23 +98,23 @@ unsigned int jtag430x2_readmem(unsigned long adr){ while(1){ do{ - jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); - }while(!(jtag_dr_shift16(0) & 0x0301)); + 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); - jtag_dr_shift16(0x0501);//word 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; @@ -115,9 +131,9 @@ unsigned int jtag430x2_readmem(unsigned long adr){ //! 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)); //0x100 or 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(); } @@ -129,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++){ @@ -139,7 +155,7 @@ unsigned int jtag430x2_por(){ SETTCLK; } - jtag_dr_shift16(0x0501); + jtag_dr_shift_16(0x0501); // tick CLRTCLK; @@ -150,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 @@ -162,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 @@ -202,8 +218,8 @@ void jtag430x2_handle_fn( uint8_t const app, 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. @@ -214,7 +230,6 @@ void jtag430x2_handle_fn( uint8_t const app, jtag430_resettap(); txdata(app,verb,1); - return; }else if(jtagid==MSP430X2JTAGID){ jtag430mode=MSP430X2MODE; @@ -225,8 +240,6 @@ void jtag430x2_handle_fn( uint8_t const app, return; } - - jtag430x2_fusecheck(); jtag430x2_syncpor();