diff --git a/mini-jtag/jtag.c b/mini-jtag/jtag.c index 4988c2e..329b194 100644 --- a/mini-jtag/jtag.c +++ b/mini-jtag/jtag.c @@ -35,18 +35,11 @@ void tap_reset_rti(struct ftdi_context *ftdi) tap_tms(ftdi, 0, 0); /* Goto RTI */ } -int tap_shift_ir(struct ftdi_context *ftdi, uint8_t ir) +int tap_shift_ir_only(struct ftdi_context *ftdi, uint8_t ir) { - /* Have to be at RTI status before call this function */ int ret = 0; uint8_t buf[3] = {0, 0, 0}; - tap_tms(ftdi, 1, 0); - tap_tms(ftdi, 1, 0); - tap_tms(ftdi, 0, 0); - tap_tms(ftdi, 0, 0); /* Goto shift IR */ - - buf[0] = MPSSE_DO_WRITE|MPSSE_LSB| MPSSE_BITMODE|MPSSE_WRITE_NEG; buf[1] = 4; @@ -57,12 +50,26 @@ int tap_shift_ir(struct ftdi_context *ftdi, uint8_t ir) } tap_tms(ftdi, 1, (ir >> 5)); - tap_tms(ftdi, 1, 0); - tap_tms(ftdi, 0, 0); /* Goto RTI */ return ret; } +int tap_shift_ir(struct ftdi_context *ftdi, uint8_t ir) +{ + int ret; + + tap_tms(ftdi, 1, 0); /* RTI status */ + tap_tms(ftdi, 1, 0); + tap_tms(ftdi, 0, 0); + tap_tms(ftdi, 0, 0); /* Goto shift IR */ + + ret = tap_shift_ir_only(ftdi, ir); + + tap_tms(ftdi, 1, 0); + tap_tms(ftdi, 0, 0); /* Goto RTI */ + + return ret; +} static int shift_last_bits(struct ftdi_context *ftdi, uint8_t *in, uint8_t len, uint8_t *out) @@ -97,7 +104,7 @@ static int shift_last_bits(struct ftdi_context *ftdi, return 0; } -int tap_shift_dr_bits(struct ftdi_context *ftdi, +int tap_shift_dr_bits_only(struct ftdi_context *ftdi, uint8_t *in, uint32_t in_bits, uint8_t *out) { @@ -109,11 +116,6 @@ int tap_shift_dr_bits(struct ftdi_context *ftdi, uint16_t last_bytes, len; int i, t; - /* Send 3 Clocks with TMS = 1 0 0 to reach SHIFTDR*/ - tap_tms(ftdi, 1, 0); - tap_tms(ftdi, 0, 0); - tap_tms(ftdi, 0, 0); - in_bytes = in_bits / 8; last_bits = in_bits % 8; @@ -157,12 +159,28 @@ int tap_shift_dr_bits(struct ftdi_context *ftdi, } else tap_tms(ftdi, 1, 0); - tap_tms(ftdi, 1, 0); - tap_tms(ftdi, 0, 0); /* Goto RTI */ - return 0; } +int tap_shift_dr_bits(struct ftdi_context *ftdi, + uint8_t *in, uint32_t in_bits, + uint8_t *out) +{ + int ret; + + /* Send 3 Clocks with TMS = 1 0 0 to reach SHIFTDR*/ + tap_tms(ftdi, 1, 0); + tap_tms(ftdi, 0, 0); + tap_tms(ftdi, 0, 0); + + ret = tap_shift_dr_bits_only(ftdi, in, in_bits, out); + + tap_tms(ftdi, 1, 0); + tap_tms(ftdi, 0, 0); /* Goto RTI */ + + return ret; +} + int ft232_flush(struct ftdi_context *ftdi) { uint8_t buf[1] = { SEND_IMMEDIATE }; diff --git a/mini-jtag/jtag.h b/mini-jtag/jtag.h index 05c9046..2d5e49a 100644 --- a/mini-jtag/jtag.h +++ b/mini-jtag/jtag.h @@ -31,6 +31,10 @@ int tap_tms(struct ftdi_context *ftdi, int tms, uint8_t bit7); void tap_reset_rti(struct ftdi_context *ftdi); +int tap_shift_ir_only(struct ftdi_context *ftdi, uint8_t ir); +int tap_shift_dr_bits_only(struct ftdi_context *ftdi, + uint8_t *in, uint32_t in_bits, + uint8_t *out); int tap_shift_ir(struct ftdi_context *ftdi, uint8_t ir); int tap_shift_dr_bits(struct ftdi_context *ftdi, uint8_t *in, uint32_t in_bits,