1 # Init global variables to work with the boundary scan register
2 # the first argument is tap name, the second is BSR length
3 proc init_bs {tap len} {
8 # disable polling for the cpu TAP as it should be kept in BYPASS
13 # In this mode BSR doesn't control the outputs but can read the current
14 # pins' states, the CPU can continue to function normally
21 # Connect BSR to the boundary scan logic
28 # Write bsrstateout to target and store the result in bsrstate
29 proc exchange_bsr {} {
30 global bsrtap bsrstate bsrstateout
31 update_bsrstate [eval drscan [concat $bsrtap $bsrstateout]]
35 # Check if particular bit is set in bsrstate
36 proc get_bit_bsr {bit} {
38 set idx [expr $bit / 32]
39 set bit [expr $bit % 32]
40 expr ([lindex $bsrstate [expr $idx*2 + 1]] & [expr 2**$bit]) != 0
43 # Resample and get bit
44 proc sample_get_bit_bsr {bit} {
49 # Set particular bit to "value" in bsrstateout
50 proc set_bit_bsr {bit value} {
52 set idx [expr ($bit / 32) * 2 + 1]
53 set bit [expr $bit % 32]
54 set bitval [expr 2**$bit]
55 set word [lindex $bsrstateout $idx]
57 set word [format %X [expr $word & ~$bitval]]
59 set word [format %X [expr $word | $bitval]]
61 set bsrstateout [lreplace $bsrstateout $idx $idx 0x$word]
65 # Set the bit and update BSR on target
66 proc set_bit_bsr_do {bit value} {
67 set_bit_bsr $bit $value
71 proc init_bsrstate {} {
72 global bsrtap bsrlen bsrstate bsrstateout
74 for {set i $bsrlen} {$i > 32} {incr i -32} {
75 append bsrstate 32 " " 0xFFFFFFFF " "
78 append bsrstate $i " " 0xFFFFFFFF
80 set bsrstateout $bsrstate
84 proc update_bsrstate {state} {
88 set bsrstate [lreplace $bsrstate $i $i 0x$word]