openocd jtag pin toggle
[x300-pci] / openocd-jtag / manual_bs.tcl
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} {
4     global bsrtap bsrlen
5     set bsrtap $tap
6     set bsrlen $len
7     init_bsrstate
8     # disable polling for the cpu TAP as it should be kept in BYPASS 
9     poll off
10     sample_mode
11 }
12
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 
15 proc sample_mode {} {
16     global bsrtap
17     # SAMPLE/PRELOAD
18     irscan $bsrtap 2
19 }
20
21 # Connect BSR to the boundary scan logic
22 proc extest_mode {} {
23     global bsrtap
24     # EXTEST
25     irscan $bsrtap 0
26 }
27
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]]
32     return $bsrstate
33 }
34
35 # Check if particular bit is set in bsrstate
36 proc get_bit_bsr {bit} {
37     global bsrstate
38     set idx [expr $bit / 32]
39     set bit [expr $bit % 32]
40     expr ([lindex $bsrstate [expr $idx*2 + 1]] & [expr 2**$bit]) != 0
41 }
42
43 # Resample and get bit
44 proc sample_get_bit_bsr {bit} {
45     exchange_bsr
46     get_bit_bsr $bit
47 }
48
49 # Set particular bit to "value" in bsrstateout
50 proc set_bit_bsr {bit value} {
51     global bsrstateout
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]
56     if {$value == 0} {
57         set word [format %X [expr $word & ~$bitval]]
58     } else {
59         set word [format %X [expr $word | $bitval]]
60     }
61     set bsrstateout [lreplace $bsrstateout $idx $idx 0x$word]
62     return
63 }
64
65 # Set the bit and update BSR on target 
66 proc set_bit_bsr_do {bit value} {
67     set_bit_bsr $bit $value
68     exchange_bsr
69 }
70
71 proc init_bsrstate {} {
72     global bsrtap bsrlen bsrstate bsrstateout
73     set bsrstate ""
74     for {set i $bsrlen} {$i > 32} {incr i -32} {
75         append bsrstate 32 " " 0xFFFFFFFF " "
76     }
77     if {$i > 0} {
78         append bsrstate $i " " 0xFFFFFFFF
79     }
80     set bsrstateout $bsrstate
81     return
82 }
83
84 proc update_bsrstate {state} {
85     global bsrstate
86     set i 1
87     foreach word $state {
88         set bsrstate [lreplace $bsrstate $i $i 0x$word]
89         incr i 2
90     }
91 }
92