diff --git a/src/target/jtag_scan.c b/src/target/jtag_scan.c index 4d34e56..75bf2a3 100644 --- a/src/target/jtag_scan.c +++ b/src/target/jtag_scan.c @@ -32,7 +32,7 @@ #include "jtag_devs.h" struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1]; -int jtag_dev_count; +uint32_t jtag_dev_count = 0; /* bucket of ones for don't care TDI */ static const uint8_t ones[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; @@ -66,7 +66,7 @@ void jtag_add_device(const int dev_index, const jtag_dev_t *jtag_dev) */ int jtag_scan(const uint8_t *irlens) { - int i; + size_t i; uint32_t j; target_list_free(); @@ -163,41 +163,44 @@ int jtag_scan(const uint8_t *irlens) /* Count device on chain */ DEBUG_INFO("Change state to Shift-DR\n"); jtagtap_shift_dr(); - for(i = 0; (jtag_proc.jtagtap_next(0, 1) == 0) && (i <= jtag_dev_count); i++) - jtag_devs[i].dr_postscan = jtag_dev_count - i - 1; + size_t device = 0; + for (; !jtag_proc.jtagtap_next(false, true) && device <= jtag_dev_count; ++device) + jtag_devs[device].dr_postscan = jtag_dev_count - device - 1; - if(i != jtag_dev_count) { - DEBUG_WARN("jtag_scan: Sanity check failed: " - "BYPASS dev count doesn't match IR scan\n"); + if (device != jtag_dev_count) { + DEBUG_WARN("jtag_scan: Sanity check failed: BYPASS dev count doesn't match IR scan\n"); jtag_dev_count = -1; return -1; } DEBUG_INFO("Return to Run-Test/Idle\n"); - jtag_proc.jtagtap_next(1, 1); + jtag_proc.jtagtap_next(true, true); jtagtap_return_idle(1); - if(!jtag_dev_count) { + if (!jtag_dev_count) return 0; - } /* Fill in the ir_postscan fields */ - for(i = jtag_dev_count - 1; i; i--) - jtag_devs[i-1].ir_postscan = jtag_devs[i].ir_postscan + - jtag_devs[i].ir_len; + for (size_t device = jtag_dev_count - 1; device > 0; --device) + jtag_devs[device - 1].ir_postscan = jtag_devs[device].ir_postscan + jtag_devs[device].ir_len; /* Reset jtagtap: should take all devs to IDCODE */ jtag_proc.jtagtap_reset(); jtagtap_shift_dr(); - for(i = 0; i < jtag_dev_count; i++) { - if(!jtag_proc.jtagtap_next(0, 1)) continue; - jtag_devs[i].jd_idcode = 1; - for(j = 2; j; j <<= 1) - if(jtag_proc.jtagtap_next(0, 1)) jtag_devs[i].jd_idcode |= j; + /* Now shift out the ID codes for all the attached devices. */ + for (size_t device = 0; device < jtag_dev_count; ++device) { + if (!jtag_proc.jtagtap_next(false, true)) + continue; + jtag_devs[device].jd_idcode = 1U; + for (size_t bit = 1; bit < 32; ++bit) { + if (jtag_proc.jtagtap_next(false, true)) + jtag_devs[device].jd_idcode |= 1U << bit; + } } DEBUG_INFO("Return to Run-Test/Idle\n"); - jtag_proc.jtagtap_next(1, 1); + jtag_proc.jtagtap_next(true, true); jtagtap_return_idle(jtag_proc.tap_idle_cycles); + #if PC_HOSTED == 1 /*Transfer needed device information to firmware jtag_devs*/ for(i = 0; i < jtag_dev_count; i++) @@ -237,7 +240,7 @@ void jtag_dev_write_ir(jtag_proc_t *jp, uint8_t jd_index, uint32_t ir) { jtag_dev_t *d = &jtag_devs[jd_index]; if(ir == d->current_ir) return; - for(int i = 0; i < jtag_dev_count; i++) + for(size_t i = 0; i < jtag_dev_count; i++) jtag_devs[i].current_ir = -1; d->current_ir = ir; diff --git a/src/target/jtag_scan.h b/src/target/jtag_scan.h index cc6d361..8a38bea 100644 --- a/src/target/jtag_scan.h +++ b/src/target/jtag_scan.h @@ -17,11 +17,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include - #ifndef __JTAG_SCAN_H #define __JTAG_SCAN_H +#include +#include "jtagtap.h" + #define JTAG_MAX_DEVS 32 #define JTAG_MAX_IR_LEN 16 @@ -40,11 +41,10 @@ typedef struct jtag_dev_s { uint32_t current_ir; } jtag_dev_t; -extern struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1]; -extern int jtag_dev_count; +extern struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS + 1]; +extern uint32_t jtag_dev_count; void jtag_dev_write_ir(jtag_proc_t *jp, uint8_t jd_index, uint32_t ir); void jtag_dev_shift_dr(jtag_proc_t *jp, uint8_t jd_index, uint8_t *dout, const uint8_t *din, int ticks); void jtag_add_device(const int dev_index, const jtag_dev_t *jtag_dev); #endif -