X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fjtag%2Fjtagarm7tdmi.c;h=8c4bfc473a41f03f892fbdc5966eefd2b1744337;hp=cf85067eeafd86978207c9c1b055321b1c2865fb;hb=b3867f4248b4258ba1c1d75b96e4da35a6064e92;hpb=64ef261d7416ef8cb3ec6cdf7130fc4d8afad8cd diff --git a/firmware/apps/jtag/jtagarm7tdmi.c b/firmware/apps/jtag/jtagarm7tdmi.c index cf85067..8c4bfc4 100644 --- a/firmware/apps/jtag/jtagarm7tdmi.c +++ b/firmware/apps/jtag/jtagarm7tdmi.c @@ -1,5 +1,5 @@ /*! \file jtagarm7tdmi.c - \brief ARM7TDMI JTAG (AT91R40008) + \brief ARM7TDMI JTAG (AT91R40008, AT91SAM7xxx) */ #include "platform.h" @@ -118,17 +118,16 @@ void jtag_reset_to_runtest_idle() { jtag_arm_tcktock(); jtag_arm_tcktock(); jtag_arm_tcktock(); - jtag_arm_tcktock(); - jtag_arm_tcktock(); - jtag_arm_tcktock(); jtag_arm_tcktock(); // now in Reset state CLRTMS; jtag_arm_tcktock(); // now in Run-Test/Idle state } void jtag_arm_tcktock() { + delay(100); // FIXME: Should never wait this long... CLRTCK; PLEDOUT^=PLEDPIN; + delay(100); // FIXME: Should never wait this long... SETTCK; PLEDOUT^=PLEDPIN; } @@ -137,23 +136,6 @@ void jtag_arm_tcktock() { // ! Start JTAG, setup pins, reset TAP and return IDCODE unsigned long jtagarm7tdmi_start() { jtagsetup(); - //Known-good starting position. - //Might be unnecessary. - //SETTST; - //SETRST; - - //delay(0x2); - - //CLRRST; - //delay(2); - //CLRTST; - - //msdelay(10); - //SETRST; - /* - P5DIR &=~RST; - */ - //delay(0x2); jtagarm7tdmi_resettap(); return jtagarm7tdmi_idcode(); } @@ -171,13 +153,14 @@ void jtagarm7tdmi_resettap(){ // PROVEN //! Shift N bits over TDI/TDO. May choose LSB or MSB, and select whether to terminate (TMS-high on last bit) and whether to return to RUNTEST/IDLE unsigned long jtagarmtransn(unsigned long word, unsigned char bitcount, unsigned char lsb, unsigned char end, unsigned char retidle){ // PROVEN - unsigned int bit; - unsigned long high = 1; + unsigned char bit; + unsigned long high = 1L; unsigned long mask; - for (bit=(bitcount-1)/8; bit>0; bit--) - high <<= 8; - high <<= ((bitcount-1)%8); + //for (bit=(bitcount-1)/8; bit>0; bit--) + // high <<= 8; + //high <<= ((bitcount-1)%8); + high <<= (bitcount-1); mask = high-1; @@ -241,7 +224,7 @@ unsigned long jtagarmtransn(unsigned long word, unsigned char bitcount, unsigned * * Bypass Register * * ID Code Register * * Scan Chain Select Register (4 bits_lsb) -* * Scan Chain 0 (64+* bits: 32_databits_lsb + ctrlbits + 32_addrbits_msb) +* * Scan Chain 0 (105 bits: 32_databits_lsb + ctrlbits + 32_addrbits_msb) * * Scan Chain 1 (33 bits: 32_bits + BREAKPT) * * Scan Chain 2 (38 bits: rw + 5_regbits_msb + 32_databits_msb) ************************************************************************/ @@ -260,20 +243,18 @@ unsigned long jtagarm7tdmi_idcode(){ // PROVEN //! Connect Bypass Register to TDO/TDI unsigned char jtagarm7tdmi_bypass(){ // PROVEN - //jtagarm7tdmi_resettap(); + jtagarm7tdmi_resettap(); SHIFT_IR; return jtagarmtransn(ARM7TDMI_IR_BYPASS, 4, LSB, END, NORETIDLE); } //! INTEST verb - do internal test unsigned char jtagarm7tdmi_intest() { - //jtagarm7tdmi_resettap(); SHIFT_IR; return jtagarmtransn(ARM7TDMI_IR_INTEST, 4, LSB, END, NORETIDLE); } -//! EXTEST verb +//! EXTEST verb - act like the processor to external components unsigned char jtagarm7tdmi_extest() { - //jtagarm7tdmi_resettap(); SHIFT_IR; return jtagarmtransn(ARM7TDMI_IR_EXTEST, 4, LSB, END, NORETIDLE); } @@ -286,7 +267,7 @@ unsigned char jtagarm7tdmi_extest() { //! RESTART verb unsigned char jtagarm7tdmi_restart() { - //jtagarm7tdmi_resettap(); + jtagarm7tdmi_resettap(); SHIFT_IR; return jtagarmtransn(ARM7TDMI_IR_RESTART, 4, LSB, END, RETIDLE); } @@ -324,13 +305,15 @@ commands occur. Therefore, it is recommended to pass directly from the “Update state” to the “Select DR” state each time the “Update” state is reached. */ unsigned long retval; - if (current_chain != chain) { // breaks shit when going from idcode back to scan chain + if (current_chain != chain) { + //debugstr("===change chains==="); SHIFT_IR; jtagarmtransn(ARM7TDMI_IR_SCAN_N, 4, LSB, END, NORETIDLE); SHIFT_DR; retval = jtagarmtransn(chain, 4, LSB, END, NORETIDLE); current_chain = chain; } else + //debugstr("===NOT change chains==="); retval = current_chain; // put in test mode... SHIFT_IR; @@ -348,9 +331,8 @@ unsigned long jtagarm7tdmi_scan_intest(int chain) { // PROVEN //! push an instruction into the pipeline -unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){ +unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){ // PROVEN unsigned long retval; - //jtagarm7tdmi_resettap(); // FIXME: DEBUG: seems necessary for some reason. ugh. jtagarm7tdmi_scan_intest(1); SHIFT_DR; @@ -369,13 +351,12 @@ unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){ // Now shift in the 32 bits retval = jtagarmtransn(instr, 32, MSB, END, RETIDLE); // Must return to RUN-TEST/IDLE state for instruction to enter pipeline, and causes debug clock. - //jtag_arm_tcktock(); return(retval); } - -unsigned long jtagarm7tdmi_nop(char breakpt){ +//! push NOP into the instruction pipeline +unsigned long jtagarm7tdmi_nop(char breakpt){ // PROVEN return jtagarm7tdmi_instr_primitive(ARM_INSTR_NOP, breakpt); } @@ -390,9 +371,11 @@ NOP NOP */ + //! set the current mode to ARM, returns PC (FIXME). Should be used by haltcpu(), which should also store PC and the THUMB state, for use by releasecpu(); unsigned long jtagarm7tdmi_setMode_ARM(){ // PROVEN - unsigned long retval = 0xff; + debugstr("=== Thumb Mode... Switching to ARM mode ==="); + unsigned long retval = 0xffL; while ((jtagarm7tdmi_get_dbgstate() & JTAG_ARM7TDMI_DBG_TBIT)&& retval-- > 0){ cmddataword[6] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0); cmddataword[1] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,0); @@ -413,6 +396,9 @@ unsigned long jtagarm7tdmi_setMode_ARM(){ // PROVEN //! shifter for writing to chain2 (EmbeddedICE). unsigned long eice_write(unsigned char reg, unsigned long data){ unsigned long retval, temp; + debugstr("eice_write"); + debughex(reg); + debughex32(data); jtagarm7tdmi_scan_intest(2); // Now shift in the 32 bits SHIFT_DR; @@ -430,7 +416,9 @@ unsigned long eice_write(unsigned char reg, unsigned long data){ //! shifter for reading from chain2 (EmbeddedICE). unsigned long eice_read(unsigned char reg){ // PROVEN - unsigned long temp; + unsigned long temp, retval; + debugstr("eice_read"); + debughex(reg); jtagarm7tdmi_scan_intest(2); // send in the register address - 5 bits LSB @@ -438,11 +426,13 @@ unsigned long eice_read(unsigned char reg){ // PROVEN temp = jtagarmtransn(reg, 5, LSB, NOEND, NORETIDLE); // clear TDI to select "read only" - jtagarmtransn(0, 1, LSB, END, RETIDLE); + jtagarmtransn(0L, 1, LSB, END, RETIDLE); SHIFT_DR; // Now shift out the 32 bits - return(jtagarmtransn(0, 32, LSB, END, RETIDLE)); // atmel arm jtag docs pp.10-11: LSB first + retval = jtagarmtransn(0L, 32, LSB, END, RETIDLE); // atmel arm jtag docs pp.10-11: LSB first + debughex32(retval); + return(retval); // atmel arm jtag docs pp.10-11: LSB first } @@ -496,12 +486,12 @@ void jtagarm7tdmi_set_watchpoint1(unsigned long addr, unsigned long addrmask, un //! Disable Watchpoint 0 void jtagarm7tdmi_disable_watchpoint0(){ - eice_write(EICE_WP0CTRL, 0x0); // write 0 in watchpoint 0 control value - disables watchpoint 0 + eice_write(EICE_WP0CTRL, 0x0L); // write 0 in watchpoint 0 control value - disables watchpoint 0 } //! Disable Watchpoint 1 void jtagarm7tdmi_disable_watchpoint1(){ - eice_write(EICE_WP1CTRL, 0x0); // write 0 in watchpoint 0 control value - disables watchpoint 0 + eice_write(EICE_WP1CTRL, 0x0L); // write 0 in watchpoint 0 control value - disables watchpoint 0 } @@ -519,139 +509,167 @@ unsigned long jtagarm7tdmi_exec(unsigned long instr, unsigned long parameter, un debughex32(jtagarm7tdmi_nop( 0)); debughex32(jtagarm7tdmi_nop( 0)); debughex32(jtagarm7tdmi_instr_primitive(parameter, 0)); // inject long - debughex32(jtagarm7tdmi_nop( 0)); retval = jtagarm7tdmi_nop( 0); debughex32(retval); debughex32(jtagarm7tdmi_nop( 0)); + debughex32(jtagarm7tdmi_nop( 0)); return(retval); } //! Retrieve a 32-bit Register value -unsigned long jtagarm7tdmi_get_register(unsigned char reg) { - unsigned long retval = 0, instr; +unsigned long jtagarm7tdmi_get_register(unsigned long reg) { + unsigned long retval = 0L, instr, reg2; + reg2 = (reg&0xfL)<<16; // push nop into pipeline - clean out the pipeline... - instr = ARM_READ_REG | (reg<<12); // push STR Rx, [R14] into pipeline - - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_instr_primitive(instr, 0)); + instr = (unsigned long)(reg<<12L) | (unsigned long)ARM_READ_REG; // STR Rx, [R14] + instr ^= reg2; + //instr = (unsigned long)(((unsigned long)reg<<12) | ARM_READ_REG); + //debugstr("Reading:"); + debughex32(instr); + + jtagarm7tdmi_nop( 0); + jtagarm7tdmi_nop( 0); + jtagarm7tdmi_nop( 0); + jtagarm7tdmi_instr_primitive(instr, 0); debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - fetched debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - decoded - jtagarm7tdmi_nop( 0); // push nop into pipeline - executed + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - executed retval = jtagarm7tdmi_nop( 0); // recover 32-bit word debughex32(retval); debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); + jtagarm7tdmi_nop( 0); + jtagarm7tdmi_nop( 0); return retval; } //! Set a 32-bit Register value -unsigned long jtagarm7tdmi_set_register(unsigned char reg, unsigned long val) { - unsigned long retval = 0, instr; - instr = ARM_WRITE_REG | (reg<<12); // push LDR Rx, [R14] into pipeline - - debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - clean out the pipeline... - debughex32(jtagarm7tdmi_instr_primitive(instr, 0)); // push nop into pipeline - fetch - debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - decode - debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - execute +void jtagarm7tdmi_set_register(unsigned long reg, unsigned long val) { + unsigned long instr, reg2; + reg2 = (reg&0xfL)<<16; + instr = (unsigned long)(((unsigned long)reg<<12L) | ARM_WRITE_REG); // LDR Rx, [R14] + instr ^= reg2; + //instr |= (unsigned long)((((unsigned long)reg)&0x7)<<8)<<8; + //debugstr("Writing:"); + debughex32(instr); + //debughex32(val); + jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline... + jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline... + jtagarm7tdmi_instr_primitive(instr, 0); // push instr into pipeline - fetch + jtagarm7tdmi_nop( 0); // push nop into pipeline - decode + jtagarm7tdmi_nop( 0); // push nop into pipeline - execute - debughex32(jtagarm7tdmi_instr_primitive(val, 0)); // push 32-bit word on data bus - debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - executed - - //if (reg == ARM_REG_PC){ - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - //} - debughex32(jtagarm7tdmi_nop( 0)); - - retval = cmddatalong[5]; - return(retval); + //jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus + jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus + //jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus + jtagarm7tdmi_nop( 0); // push nop into pipeline - executed + jtagarm7tdmi_nop( 0); // push nop into pipeline - executed + + if (reg == ARM_REG_PC){ + jtagarm7tdmi_nop( 0); + jtagarm7tdmi_nop( 0); + } + jtagarm7tdmi_nop( 0); } -//! Get all registers. Return an array -unsigned long* jtagarm7tdmi_get_registers() { - debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS,0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); +//! Get all registers, placing them into cmddatalong[0-15] +void jtagarm7tdmi_get_registers() { + debugstr("First 8 registers:"); + debugstr(" Instr and the first few pops from the instruction chain:"); + debughex32(ARM_INSTR_SKANKREGS1); debughex32(jtagarm7tdmi_nop( 0)); + debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS1,0)); debughex32(jtagarm7tdmi_nop( 0)); debughex32(jtagarm7tdmi_nop( 0)); + cmddatalong[ 0] = jtagarm7tdmi_nop( 0); + cmddatalong[ 1] = jtagarm7tdmi_nop( 0); + cmddatalong[ 2] = jtagarm7tdmi_nop( 0); + cmddatalong[ 3] = jtagarm7tdmi_nop( 0); + cmddatalong[ 4] = jtagarm7tdmi_nop( 0); + cmddatalong[ 5] = jtagarm7tdmi_nop( 0); + cmddatalong[ 6] = jtagarm7tdmi_nop( 0); + cmddatalong[ 7] = jtagarm7tdmi_nop( 0); + + debugstr("Last 8 registers:"); + debugstr(" Instr and the first few pops from the instruction chain:"); + debughex32(ARM_INSTR_SKANKREGS2); debughex32(jtagarm7tdmi_nop( 0)); + //jtagarm7tdmi_nop( 0); + debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS2,0)); debughex32(jtagarm7tdmi_nop( 0)); debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - return registers; + //jtagarm7tdmi_nop( 0); + //jtagarm7tdmi_nop( 0); + cmddatalong[ 8] = jtagarm7tdmi_nop( 0); + cmddatalong[ 9] = jtagarm7tdmi_nop( 0); + cmddatalong[10] = jtagarm7tdmi_nop( 0); + cmddatalong[11] = jtagarm7tdmi_nop( 0); + cmddatalong[12] = jtagarm7tdmi_nop( 0); + cmddatalong[13] = jtagarm7tdmi_nop( 0); + cmddatalong[14] = jtagarm7tdmi_nop( 0); + cmddatalong[15] = jtagarm7tdmi_nop( 0); + jtagarm7tdmi_nop( 0); } -//! Get all registers. Return an array -unsigned long* jtagarm7tdmi_set_registers() { //FIXME: BORKEN... TOTALLY TRYING TO BUY A VOWEL - debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS,0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_nop( 0)); - debughex32(jtagarm7tdmi_instr_primitive(0x40,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x41,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x42,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x43,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x44,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x45,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x46,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x47,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x48,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x49,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x4a,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x4b,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x4c,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x4d,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x4e,0)); - debughex32(jtagarm7tdmi_instr_primitive(0x4f,0)); - return registers; +//! Set all registers from cmddatalong[0-15] +void jtagarm7tdmi_set_registers() { //FIXME: BORKEN... TOTALLY TRYING TO BUY A VOWEL + debughex32(ARM_INSTR_CLOBBEREGS); + jtagarm7tdmi_nop( 0); + debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_CLOBBEREGS,0)); + jtagarm7tdmi_nop( 0); + jtagarm7tdmi_nop( 0); + debughex32(jtagarm7tdmi_instr_primitive(0x40L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x41L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x42L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x43L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x44L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x45L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x46L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x47L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x48L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x49L,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x4aL,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x4bL,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x4cL,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x4dL,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x4eL,0)); + debughex32(jtagarm7tdmi_instr_primitive(0x4fL,0)); } //! Retrieve the CPSR Register value unsigned long jtagarm7tdmi_get_regCPSR() { - unsigned long retval = 0; + unsigned long retval = 0L; - cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline... - cmddatalong[2] = jtagarm7tdmi_instr_primitive(ARM_INSTR_MRS_R0_CPSR, 0); // push MRS_R0, CPSR into pipeline - cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - fetched - cmddatalong[4] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decoded - cmddatalong[5] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - clean out the pipeline... + debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_MRS_R0_CPSR, 0)); // push MRS_R0, CPSR into pipeline + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - fetched + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - decoded + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - executed retval = jtagarm7tdmi_nop( 0); // recover 32-bit word - cmddatalong[6] = retval; + debughex32(retval); return retval; } //! Retrieve the CPSR Register value unsigned long jtagarm7tdmi_set_regCPSR(unsigned long val) { - unsigned long retval = 0; + unsigned long retval = 0L; - cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline... - cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_MSR_cpsr_cxsf_R0, 0); // push MSR cpsr_cxsf, R0 into pipeline - cmddatalong[2] = jtagarm7tdmi_nop( 0); // push nop into pipeline - fetched - cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decoded + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - clean out the pipeline... + debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_MSR_cpsr_cxsf_R0, 0)); // push MSR cpsr_cxsf, R0 into pipeline + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - fetched + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - decoded retval = jtagarm7tdmi_instr_primitive(val, 0);// push 32-bit word on data bus - cmddatalong[5] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed - cmddatalong[4] = retval; + debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - executed + debughex32(retval); return(retval); } //! Write data to address - Assume TAP in run-test/idle state unsigned long jtagarm7tdmi_writemem(unsigned long adr, unsigned long data){ - unsigned long r0=0, r1=-1; + unsigned long r0=0L, r1=-1L; r0 = jtagarm7tdmi_get_register(0); // store R0 and R1 r1 = jtagarm7tdmi_get_register(1); @@ -671,21 +689,21 @@ unsigned long jtagarm7tdmi_writemem(unsigned long adr, unsigned long data){ //! Read data from address unsigned long jtagarm7tdmi_readmem(unsigned long adr){ - unsigned long retval = 0; - unsigned long r0=0, r1=-1; - int waitcount = 0xfff; + unsigned long retval = 0L; + unsigned long r0=0L, r1=-1L; + int waitcount = 0xfffL; r0 = jtagarm7tdmi_get_register(0); // store R0 and R1 r1 = jtagarm7tdmi_get_register(1); jtagarm7tdmi_set_register(0, adr); // write address into R0 jtagarm7tdmi_nop( 0); // push nop into pipeline to "clean" it ??? jtagarm7tdmi_nop( 1); // push nop into pipeline with BREAKPT set - jtagarm7tdmi_instr_primitive(ARM_INSTR_LDR_R1_r0_4, 0); // push LDR R1, R0, #4 into instruction pipeline + jtagarm7tdmi_instr_primitive(ARM_INSTR_LDR_R1_r0_4, 0); // push LDR R1, [R0], #4 into instruction pipeline jtagarm7tdmi_nop( 0); // push nop into pipeline jtagarm7tdmi_restart(); // SHIFT_IR with RESTART instruction // Poll the Debug Status Register for DBGACK and nMREQ to be HIGH - while ((jtagarm7tdmi_get_dbgstate() & 9) == 0 && waitcount > 0){ + while ((jtagarm7tdmi_get_dbgstate() & 9L) == 0 && waitcount > 0){ delay(1); waitcount --; } @@ -706,33 +724,46 @@ unsigned long jtagarm7tdmi_getpc(){ } //! Set Program Counter -unsigned long jtagarm7tdmi_setpc(unsigned long adr){ - return jtagarm7tdmi_set_register(ARM_REG_PC, adr); +void jtagarm7tdmi_setpc(unsigned long adr){ + jtagarm7tdmi_set_register(ARM_REG_PC, adr); } //! Halt CPU - returns 0xffff if the operation fails to complete within unsigned long jtagarm7tdmi_haltcpu(){ // PROVEN - int waitcount = 0xfff; + int waitcount = 0xfffL; +/******** OLD WAY ********/ // store watchpoint info? - not right now - eice_write(EICE_WP1ADDR, 0); // write 0 in watchpoint 1 address + eice_write(EICE_WP1ADDR, 0L); // write 0 in watchpoint 1 address eice_write(EICE_WP1ADDRMASK, 0xffffffff); // write 0xffffffff in watchpoint 1 address mask - eice_write(EICE_WP1DATA, 0); // write 0 in watchpoint 1 data + eice_write(EICE_WP1DATA, 0L); // write 0 in watchpoint 1 data eice_write(EICE_WP1DATAMASK, 0xffffffff); // write 0xffffffff in watchpoint 1 data mask - eice_write(EICE_WP1CTRL, 0x100); //!!!!! WTF! THIS IS SUPPOSED TO BE 9 bits wide?!? // write 0x00000100 in watchpoint 1 control value register (enables watchpoint) - eice_write(EICE_WP1CTRLMASK, 0xfffffff7); //!!!!! WTF! THIS IS SUPPOSED TO BE 8 bits wide?!? // write 0xfffffff7 in watchpoint 1 control mask - only detect the fetch instruction + eice_write(EICE_WP1CTRL, 0x100L); // write 0x00000100 in watchpoint 1 control value register (enables watchpoint) + eice_write(EICE_WP1CTRLMASK, 0xfffffff7); // write 0xfffffff7 in watchpoint 1 control mask - only detect the fetch instruction +/***************************/ + +/******** NEW WAY *********/ +// eice_write(EICE_DBGCTRL, JTAG_ARM7TDMI_DBG_DBGRQ); // r/o register? +/****************************/ // poll until debug status says the cpu is in debug mode - while (!(jtagarm7tdmi_get_dbgstate() & 0x1) && waitcount-- > 0){ + while (!(jtagarm7tdmi_get_dbgstate() & 0x1L) && waitcount-- > 0){ delay(1); } - eice_write(EICE_WP1CTRL, 0x0); // write 0 in watchpoint 0 control value - disables watchpoint 0 + +/******** OLD WAY ********/ + eice_write(EICE_WP1CTRL, 0x0L); // write 0 in watchpoint 0 control value - disables watchpoint 0 +/***************************/ + +/******** NEW WAY ********/ +// eice_write(EICE_DBGCTRL, 0); // r/o register? +/***************************/ // store the debug state last_halt_debug_state = jtagarm7tdmi_get_dbgstate(); last_halt_pc = jtagarm7tdmi_getpc() - 4; // assume -4 for entering debug mode via watchpoint. - count_dbgspd_instr_since_debug = 0; - count_sysspd_instr_since_debug = 0; + count_dbgspd_instr_since_debug = 0L; + count_sysspd_instr_since_debug = 0L; // get into ARM mode if the T flag is set (Thumb mode) while (jtagarm7tdmi_get_dbgstate() & JTAG_ARM7TDMI_DBG_TBIT && waitcount-- > 0) { @@ -778,7 +809,7 @@ unsigned long jtagarm7tdmi_releasecpu(){ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len){ register char blocks; - unsigned int i,val,mlop; + unsigned int i,val; unsigned long at; jtagarm7tdmi_resettap(); @@ -786,38 +817,33 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len switch(verb){ case START: //Enter JTAG mode. - cmddatalong[0] = jtagarm7tdmi_start(); - cmddatalong[2] = jtagarm7tdmi_haltcpu(); + debughex32(jtagarm7tdmi_start()); + debughex32(jtagarm7tdmi_haltcpu()); //jtagarm7tdmi_resettap(); - cmddatalong[1] = jtagarm7tdmi_get_dbgstate(); + cmddatalong[0] = jtagarm7tdmi_get_dbgstate(); - // DEBUG: FIXME: NOT PART OF OPERATIONAL CODE - //for (mlop=2;mlop<4;mlop++){ - // jtagarm7tdmi_set_register(mlop, 0x43424140); - //} - ///////////////////////////////////////////// - txdata(app,verb,0xc); + txdata(app,verb,0x4); break; case JTAGARM7TDMI_READMEM: case PEEK: - blocks=(len>4?cmddata[4]:1); - at=cmddatalong[0]; + at = cmddatalong[0]; + blocks = cmddatalong[1]; - len=0x80; txhead(app,verb,len); - while(blocks--){ - for(i=0;i>8); + serial_tx(val&0xFFL); + serial_tx((val&0xFF00L)>>8); + serial_tx((val&0xFF0000L)>>8); + serial_tx((val&0xFF000000L)>>8); + at+=4; } - } + break; case JTAGARM7TDMI_GET_CHIP_ID: @@ -850,8 +876,8 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len //case JTAGARM7TDMI_WRITEFLASH: //case JTAGARM7TDMI_ERASEFLASH: case JTAGARM7TDMI_SET_PC: - cmddatalong[0] = jtagarm7tdmi_setpc(cmddatalong[0]); - txdata(app,verb,4); + jtagarm7tdmi_setpc(cmddatalong[0]); + txdata(app,verb,0); break; case JTAGARM7TDMI_GET_DEBUG_CTRL: cmddatalong[0] = jtagarm7tdmi_get_dbgctrl(); @@ -874,26 +900,27 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len //case JTAGARM7TDMI_SET_WATCHPOINT: case JTAGARM7TDMI_GET_REGISTER: jtagarm7tdmi_resettap(); - cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]); - //cmddatalong[0] = test_get_register(cmddata[0]); - txdata(app,verb,96); + val = cmddata[0]; + cmddatalong[0] = jtagarm7tdmi_get_register(val); + //debughex32(cmddatalong[0]); + txdata(app,verb,4); break; case JTAGARM7TDMI_SET_REGISTER: // FIXME: NOT AT ALL CORRECT, THIS IS TESTING CODE ONLY jtagarm7tdmi_resettap(); - cmddatalong[0] = cmddatalong[1]; + debughex32(cmddatalong[1]); jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]); - //test_set_register(cmddata[0], cmddatalong[1]); - txdata(app,verb,96); + cmddatalong[0] = cmddatalong[1]; + txdata(app,verb,4); break; case JTAGARM7TDMI_GET_REGISTERS: jtagarm7tdmi_resettap(); jtagarm7tdmi_get_registers(); - txdata(app,verb,200); + txdata(app,verb,64); break; case JTAGARM7TDMI_SET_REGISTERS: jtagarm7tdmi_resettap(); jtagarm7tdmi_set_registers(); - txdata(app,verb,200); + txdata(app,verb,64); break; case JTAGARM7TDMI_DEBUG_INSTR: jtagarm7tdmi_resettap();