OpenCores
URL https://opencores.org/ocsvn/bustap-jtag/bustap-jtag/trunk

Subversion Repositories bustap-jtag

[/] [bustap-jtag/] [trunk/] [cmd/] [altera/] [virtual_jtag_console.tcl] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 ash_riple
##**************************************************************
2 8 ash_riple
## Module             : virtual_jtag_console.tcl
3 6 ash_riple
## Platform           : Windows xp sp2
4
## Author             : Bibo Yang  (ash_riple@hotmail.com)
5
## Organization       : www.opencores.org
6 20 ash_riple
## Revision           : 2.5
7
## Date               : 2014/02/08
8 6 ash_riple
## Description        : Tcl/Tk GUI for the up_monitor
9
##**************************************************************
10
 
11 2 ash_riple
proc reset_fifo {{jtag_index_0 0}} {
12 6 ash_riple
        device_lock -timeout 5
13 2 ash_riple
        device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 2 -no_captured_ir_value
14
        device_virtual_dr_shift -instance_index $jtag_index_0  -length 32 -dr_value 00000000 -value_in_hex -no_captured_dr_value
15
        device_unlock
16
        return 0
17
}
18
 
19
proc query_usedw {{jtag_index_0 0}} {
20
        global fifoUsedw
21 6 ash_riple
        device_lock -timeout 5
22 2 ash_riple
        device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 1 -no_captured_ir_value
23
        set usedw [device_virtual_dr_shift -instance_index $jtag_index_0 -length 9 -value_in_hex]
24
        device_unlock
25
                set tmp 0x
26
                append tmp $usedw
27
                set usedw [format "%i" $tmp]
28
        set fifoUsedw $usedw
29
        return $usedw
30
}
31
 
32
proc read_fifo {{jtag_index_0 0}} {
33 6 ash_riple
        device_lock -timeout 5
34 2 ash_riple
        device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 1 -no_captured_ir_value
35
        device_virtual_ir_shift -instance_index $jtag_index_0 -ir_value 3 -no_captured_ir_value
36 12 ash_riple
        set fifo_data [device_virtual_dr_shift -instance_index $jtag_index_0 -length 82 -value_in_hex]
37 2 ash_riple
        device_unlock
38
        return $fifo_data
39
}
40
 
41 8 ash_riple
proc config_addr {{jtag_index_1 1} {mask 0100000000} {mask_id 1}} {
42
        global log
43
        set mask_leng [string length $mask]
44
        if {$mask_leng!=10} {
45
                $log insert end "\nError: Wrong address mask length @$mask_id: [expr $mask_leng-2]. Expects: 8.\n"
46
 
47
        } else {
48
                device_lock -timeout 5
49
                device_virtual_ir_shift -instance_index $jtag_index_1 -ir_value 1 -no_captured_ir_value
50
                set addr_mask [device_virtual_dr_shift -instance_index $jtag_index_1 -dr_value $mask -length 40 -value_in_hex]
51
                device_unlock
52
                return $addr_mask
53
        }
54 2 ash_riple
}
55
 
56 14 ash_riple
proc config_trig {{jtag_index_2 2} {trig 00000000000000} {pnum 000}} {
57 8 ash_riple
        global log
58
        set trig_leng [string length $trig]
59
        if {$trig_leng!=14} {
60
                $log insert end "\nError: Wrong trigger condition length: [expr $trig_leng-2]. Expects: 4+8.\n"
61
        } else {
62
                device_lock -timeout 5
63
                device_virtual_ir_shift -instance_index $jtag_index_2 -ir_value 1 -no_captured_ir_value
64
                set addr_trig [device_virtual_dr_shift -instance_index $jtag_index_2 -dr_value $trig -length 56 -value_in_hex]
65 15 ash_riple
                device_unlock
66
        }
67
        if {[format "%d" 0x$pnum]>=511} {
68
                $log insert end "\nError: Wrong trigger pre-capture value: [format "%d" 0x$pnum]. Expects: 0~510.\n"
69
        } else {
70
                device_lock -timeout 5
71 11 ash_riple
                device_virtual_ir_shift -instance_index $jtag_index_2 -ir_value 2 -no_captured_ir_value
72 15 ash_riple
                set pnum_trig [device_virtual_dr_shift -instance_index $jtag_index_2 -dr_value $pnum -length 10 -value_in_hex]
73 8 ash_riple
                device_unlock
74
        }
75 15 ash_riple
        return $addr_trig
76 2 ash_riple
}
77
 
78
proc open_jtag_device {{test_cable "USB-Blaster [USB-0]"} {test_device "@2: EP2SGX90 (0x020E30DD)"}} {
79
        open_device -hardware_name $test_cable -device_name $test_device
80
        # Retrieve device id code.
81 6 ash_riple
        device_lock -timeout 5
82 2 ash_riple
        device_ir_shift -ir_value 6 -no_captured_ir_value
83
        set idcode "0x[device_dr_shift -length 32 -value_in_hex]"
84
        device_unlock
85
        return $idcode
86
}
87
 
88
proc close_jtag_device {} {
89
        close_device
90
}
91
 
92
proc scan_chain {} {
93
        global log
94
        $log insert end "JTAG Chain Scanning report:\n"
95
        $log insert end "****************************************\n"
96
        set blaster_cables [get_hardware_names]
97
        set cable_num 0
98
        foreach blaster_cable $blaster_cables {
99
                incr cable_num
100
                $log insert end "@$cable_num: $blaster_cable\n"
101
        }
102
        $log insert end "\n****************************************\n"
103
        global device_list
104
        set device_list ""
105
        foreach blaster_cable $blaster_cables {
106
                $log insert end "$blaster_cable:\n"
107
                lappend device_list $blaster_cable
108
                if [catch {get_device_names -hardware_name $blaster_cable} error_msg] {
109
                        $log insert end $error_msg
110
                        lappend device_list $error_msg
111
                } else {
112
                        foreach test_device [get_device_names -hardware_name $blaster_cable] {
113
                                $log insert end "$test_device\n"
114
                        }
115
                        lappend device_list [get_device_names -hardware_name $blaster_cable]
116
                }
117
        }
118
}
119
 
120
proc select_device {{cableNum 1} {deviceNum 1}} {
121
        global log
122
        global device_list
123
        $log insert end "\n****************************************\n"
124
        set test_cable [lindex $device_list [expr 2*$cableNum-2]]
125
        $log insert end "Selected Cable : $test_cable\n"
126
        set test_device [lindex [lindex $device_list [expr 2*$cableNum-1]] [expr $deviceNum-1]]
127
        $log insert end "Selected Device: $test_device\n"
128
        set jtagIdCode [open_jtag_device $test_cable $test_device]
129
        $log insert end "Device ID code : $jtagIdCode\n"
130
        reset_fifo 0
131
        query_usedw 0
132
}
133
 
134 6 ash_riple
proc updateAddrConfig {} {
135 2 ash_riple
        global address_span1
136
        global address_span2
137
        global address_span3
138
        global address_span4
139
        global address_span5
140
        global address_span6
141
        global address_span7
142
        global address_span8
143
        global address_span9
144
        global address_span10
145
        global address_span11
146
        global address_span12
147
        global address_span13
148
        global address_span14
149
        global address_span15
150
        global address_span16
151 6 ash_riple
        global address_span_en1
152
        global address_span_en2
153
        global address_span_en3
154
        global address_span_en4
155
        global address_span_en5
156
        global address_span_en6
157
        global address_span_en7
158
        global address_span_en8
159
        global address_span_en9
160
        global address_span_en10
161
        global address_span_en11
162
        global address_span_en12
163
        global address_span_en13
164
        global address_span_en14
165
        global address_span_en15
166
        global address_span_en16
167
        global addr_wren
168
        global addr_rden
169
        for {set i 1} {$i<=16} {incr i} {
170
                set    mask [format "%1X" [expr $i-1]]
171
                append mask [format "%1X" [expr $addr_wren*8+$addr_rden*4+[set address_span_en$i]]]
172 2 ash_riple
                append mask [set address_span$i]
173 8 ash_riple
                config_addr 1 $mask $i
174 2 ash_riple
        }
175
}
176
 
177 6 ash_riple
proc initAddrConfig {} {
178 2 ash_riple
        global log
179
        global address_span1
180
        global address_span2
181
        global address_span3
182
        global address_span4
183
        global address_span5
184
        global address_span6
185
        global address_span7
186
        global address_span8
187
        global address_span9
188
        global address_span10
189
        global address_span11
190
        global address_span12
191
        global address_span13
192
        global address_span14
193
        global address_span15
194
        global address_span16
195 20 ash_riple
        for {set i 1} {$i<=8} {set i [expr $i+2]} {
196 11 ash_riple
                if {[set address_span$i]==""} {
197 20 ash_riple
                        set address_span$i fffffffc
198 2 ash_riple
        }
199 20 ash_riple
        }
200
        for {set i 2} {$i<=8} {set i [expr $i+2]} {
201
                if {[set address_span$i]==""} {
202
                        set address_span$i 00000000
203 11 ash_riple
        }
204 20 ash_riple
        }
205 2 ash_riple
        for {set i 9} {$i<=16} {incr i} {
206 11 ash_riple
                if {[set address_span$i]==""} {
207 20 ash_riple
                        set address_span$i ffffffff
208 2 ash_riple
        }
209 20 ash_riple
        }
210 2 ash_riple
}
211
 
212 11 ash_riple
proc initTrigConfig {} {
213
        global triggerAddr
214
        global triggerData
215
        global triggerPnum
216
        if {[set triggerAddr]==""} {
217 20 ash_riple
                set triggerAddr 00000000
218 11 ash_riple
        }
219
        if {[set triggerData]==""} {
220
                set triggerData a5a5a5a5
221
        }
222
        if {[set triggerPnum]==""} {
223
                set triggerPnum 0
224
        }
225
}
226
 
227 6 ash_riple
proc updateTrigger {{trigCmd 0}} {
228 2 ash_riple
        global triggerAddr
229
        global triggerData
230 11 ash_riple
        global triggerPnum
231 6 ash_riple
        global trig_wren
232
        global trig_rden
233
        global trig_aden
234
        global trig_daen
235
        set    triggerValue [format "%1X" [expr $trig_aden*8+$trig_daen*4+0]]
236
        append triggerValue [format "%1X" [expr $trig_wren*8+$trig_rden*4+$trigCmd]]
237 2 ash_riple
        append triggerValue $triggerAddr
238
        append triggerValue $triggerData
239 15 ash_riple
        config_trig 2 $triggerValue [format "%03X" $triggerPnum]
240 2 ash_riple
}
241
 
242
proc startTrigger {} {
243 6 ash_riple
        global trig_wren
244
        global trig_rden
245
        global trig_aden
246
        global trig_daen
247 17 ash_riple
        global log
248
        if {[expr $trig_wren+$trig_rden]==2} {
249
                $log insert end "\nWarning: @WR & @RD, unreachable trigger condition.\n"
250
        }
251 6 ash_riple
        set trigEnable [expr $trig_wren+$trig_rden+$trig_aden+$trig_daen]
252
        if {$trigEnable>0} {
253
                updateTrigger 2
254
                reset_fifo 0
255
                query_usedw 0
256
                updateTrigger 3
257
        } else {
258
                updateTrigger 0
259
        }
260 2 ash_riple
}
261
 
262
proc reset_fifo_ptr {} {
263
        reset_fifo 0
264
        query_usedw 0
265
}
266
 
267
proc query_fifo_usedw {} {
268
        query_usedw 0
269
}
270
 
271
proc read_fifo_content {} {
272
        global log
273
        global fifoUsedw
274
        $log insert end "\n****************************************\n"
275
        for {set i 0} {$i<$fifoUsedw} {incr i} {
276
                set fifoContent [read_fifo 0]
277 6 ash_riple
                set ok_trig [expr [format "%d" 0x[string index $fifoContent 0]]/2]
278
                set wr_cptr [expr [format "%d" 0x[string index $fifoContent 0]]%2]
279 12 ash_riple
                set tm_cptr [format "%d"       0x[string range $fifoContent  1  8]]
280 20 ash_riple
                set ad_cptr                      [string range $fifoContent  9 16]
281
                set da_cptr                      [string range $fifoContent 17 24]
282 6 ash_riple
                if $ok_trig {
283
                        $log insert end "@@@@@@@@@@@@@@@@@@@@\n"
284
                }
285
                if $wr_cptr {
286 20 ash_riple
                        $log insert end "wr 0x$ad_cptr 0x$da_cptr @$tm_cptr\n"
287 6 ash_riple
                } else {
288 20 ash_riple
                        $log insert end "rd 0x$ad_cptr 0x$da_cptr @$tm_cptr\n"
289 6 ash_riple
                }
290 2 ash_riple
        }
291
        query_usedw 0
292
}
293
 
294
proc clear_log {} {
295
        global log
296
        $log delete insert end
297
}
298
 
299
proc quit {} {
300
        global exit_console
301 20 ash_riple
        destroy .mainframe
302
        destroy .
303 2 ash_riple
        set exit_console 1
304
}
305
 
306
# set the QuartusII special Tk command
307
init_tk
308
set exit_console 0
309
 
310
# set the main window
311 20 ash_riple
wm withdraw .
312
toplevel .mainframe
313
wm title .mainframe "www.OpenCores.org: uP Transaction Monitor"
314
pack propagate .mainframe true
315 2 ash_riple
 
316 6 ash_riple
# set the www.OpenCores.org logo
317 20 ash_riple
frame .mainframe.fig -bg white
318
pack .mainframe.fig -expand true -fill both
319 6 ash_riple
image create photo logo -format gif -file "../common/OpenCores.gif"
320 20 ash_riple
label .mainframe.fig.logo -image logo -bg white
321
pack .mainframe.fig.logo
322 2 ash_riple
 
323 6 ash_riple
# set the JTAG utility
324 20 ash_riple
frame .mainframe.jtag -relief groove -borderwidth 5
325
pack .mainframe.jtag
326
button .mainframe.jtag.scan -text {Scan JTAG Chain} -command {scan_chain}
327
button .mainframe.jtag.select -text {Select JTAG Device :} -command {select_device $cableNum $deviceNum}
328
button .mainframe.jtag.deselect -text {DeSelect JTAG Device} -command {close_jtag_device}
329
label .mainframe.jtag.cable -text {Cable @}
330
label .mainframe.jtag.devic -text {Device @}
331
entry .mainframe.jtag.cable_num -textvariable cableNum -width 5
332
entry .mainframe.jtag.devic_num -textvariable deviceNum -width 5
333
pack .mainframe.jtag.scan .mainframe.jtag.select \
334
     .mainframe.jtag.cable .mainframe.jtag.cable_num \
335
     .mainframe.jtag.devic .mainframe.jtag.devic_num \
336
     .mainframe.jtag.deselect \
337 6 ash_riple
     -side left -ipadx 0
338 2 ash_riple
 
339
# set the inclusive address entries
340 20 ash_riple
frame .mainframe.f1 -relief groove -borderwidth 5
341
pack .mainframe.f1
342
label .mainframe.f1.incl_addr -text {Inclusive Addr:}
343
entry .mainframe.f1.address_span1 -textvariable address_span1 -width 8
344
entry .mainframe.f1.address_span2 -textvariable address_span2 -width 8
345
entry .mainframe.f1.address_span3 -textvariable address_span3 -width 8
346
entry .mainframe.f1.address_span4 -textvariable address_span4 -width 8
347
entry .mainframe.f1.address_span5 -textvariable address_span5 -width 8
348
entry .mainframe.f1.address_span6 -textvariable address_span6 -width 8
349
entry .mainframe.f1.address_span7 -textvariable address_span7 -width 8
350
entry .mainframe.f1.address_span8 -textvariable address_span8 -width 8
351
checkbutton .mainframe.f1.address_span_en1 -variable address_span_en1
352
checkbutton .mainframe.f1.address_span_en2 -variable address_span_en2
353
checkbutton .mainframe.f1.address_span_en3 -variable address_span_en3
354
checkbutton .mainframe.f1.address_span_en4 -variable address_span_en4
355
checkbutton .mainframe.f1.address_span_en5 -variable address_span_en5
356
checkbutton .mainframe.f1.address_span_en6 -variable address_span_en6
357
checkbutton .mainframe.f1.address_span_en7 -variable address_span_en7
358
checkbutton .mainframe.f1.address_span_en8 -variable address_span_en8
359
label .mainframe.f1.address_span_text1 -text {H:}
360
label .mainframe.f1.address_span_text2 -text {L:}
361
label .mainframe.f1.address_span_text3 -text {H:}
362
label .mainframe.f1.address_span_text4 -text {L:}
363
label .mainframe.f1.address_span_text5 -text {H:}
364
label .mainframe.f1.address_span_text6 -text {L:}
365
label .mainframe.f1.address_span_text7 -text {H:}
366
label .mainframe.f1.address_span_text8 -text {L:}
367
pack .mainframe.f1.incl_addr \
368
     .mainframe.f1.address_span_en1 .mainframe.f1.address_span_text1 .mainframe.f1.address_span1 .mainframe.f1.address_span_text2 .mainframe.f1.address_span2 \
369
     .mainframe.f1.address_span_en3 .mainframe.f1.address_span_text3 .mainframe.f1.address_span3 .mainframe.f1.address_span_text4 .mainframe.f1.address_span4 \
370
     .mainframe.f1.address_span_en5 .mainframe.f1.address_span_text5 .mainframe.f1.address_span5 .mainframe.f1.address_span_text6 .mainframe.f1.address_span6 \
371
     .mainframe.f1.address_span_en7 .mainframe.f1.address_span_text7 .mainframe.f1.address_span7 .mainframe.f1.address_span_text8 .mainframe.f1.address_span8 \
372 6 ash_riple
     -side left -ipadx 0
373 2 ash_riple
 
374
# set the exclusive address entries
375 20 ash_riple
frame .mainframe.f2 -relief groove -borderwidth 5
376
pack .mainframe.f2
377
label .mainframe.f2.excl_addr -text {Exclusive Addr:}
378
entry .mainframe.f2.address_span9  -textvariable address_span9  -width 8
379
entry .mainframe.f2.address_span10 -textvariable address_span10 -width 8
380
entry .mainframe.f2.address_span11 -textvariable address_span11 -width 8
381
entry .mainframe.f2.address_span12 -textvariable address_span12 -width 8
382
entry .mainframe.f2.address_span13 -textvariable address_span13 -width 8
383
entry .mainframe.f2.address_span14 -textvariable address_span14 -width 8
384
entry .mainframe.f2.address_span15 -textvariable address_span15 -width 8
385
entry .mainframe.f2.address_span16 -textvariable address_span16 -width 8
386
checkbutton .mainframe.f2.address_span_en9  -variable address_span_en9
387
checkbutton .mainframe.f2.address_span_en10 -variable address_span_en10
388
checkbutton .mainframe.f2.address_span_en11 -variable address_span_en11
389
checkbutton .mainframe.f2.address_span_en12 -variable address_span_en12
390
checkbutton .mainframe.f2.address_span_en13 -variable address_span_en13
391
checkbutton .mainframe.f2.address_span_en14 -variable address_span_en14
392
checkbutton .mainframe.f2.address_span_en15 -variable address_span_en15
393
checkbutton .mainframe.f2.address_span_en16 -variable address_span_en16
394
label .mainframe.f2.address_span_text1 -text {H:}
395
label .mainframe.f2.address_span_text2 -text {L:}
396
label .mainframe.f2.address_span_text3 -text {H:}
397
label .mainframe.f2.address_span_text4 -text {L:}
398
label .mainframe.f2.address_span_text5 -text {H:}
399
label .mainframe.f2.address_span_text6 -text {L:}
400
label .mainframe.f2.address_span_text7 -text {H:}
401
label .mainframe.f2.address_span_text8 -text {L:}
402
pack .mainframe.f2.excl_addr \
403
     .mainframe.f2.address_span_en9  .mainframe.f2.address_span_text1 .mainframe.f2.address_span9  .mainframe.f2.address_span_text2 .mainframe.f2.address_span10 \
404
     .mainframe.f2.address_span_en11 .mainframe.f2.address_span_text3 .mainframe.f2.address_span11 .mainframe.f2.address_span_text4 .mainframe.f2.address_span12 \
405
     .mainframe.f2.address_span_en13 .mainframe.f2.address_span_text5 .mainframe.f2.address_span13 .mainframe.f2.address_span_text6 .mainframe.f2.address_span14 \
406
     .mainframe.f2.address_span_en15 .mainframe.f2.address_span_text7 .mainframe.f2.address_span15 .mainframe.f2.address_span_text8 .mainframe.f2.address_span16 \
407 6 ash_riple
     -side left -ipadx 0
408
initAddrConfig
409
 
410
# set the address configuration buttons
411 20 ash_riple
frame .mainframe.addr_cnfg -relief groove -borderwidth 5
412
pack .mainframe.addr_cnfg
413
checkbutton .mainframe.addr_cnfg.wren -text {WR} -variable addr_wren
414
checkbutton .mainframe.addr_cnfg.rden -text {RD} -variable addr_rden
415
button .mainframe.addr_cnfg.config -text {Apply Address Filter} -command {updateAddrConfig}
416
pack .mainframe.addr_cnfg.wren .mainframe.addr_cnfg.rden .mainframe.addr_cnfg.config \
417 6 ash_riple
     -side left -ipadx 0
418
 
419 2 ash_riple
# set the transaction trigger controls
420 20 ash_riple
frame .mainframe.trig -relief groove -borderwidth 5
421
pack .mainframe.trig
422
button .mainframe.trig.starttrig -text {Apply Trigger Condition} -command {startTrigger}
423
entry .mainframe.trig.trigvalue_addr -textvar triggerAddr -width 8
424
entry .mainframe.trig.trigvalue_data -textvar triggerData -width 8
425
checkbutton .mainframe.trig.trigaddr -text {@Addr:} -variable trig_aden
426
checkbutton .mainframe.trig.trigdata -text {@Data:} -variable trig_daen
427
checkbutton .mainframe.trig.wren -text {@WR} -variable trig_wren
428
checkbutton .mainframe.trig.rden -text {@RD} -variable trig_rden
429
label .mainframe.trig.pnum -text {Pre-Capture:}
430
entry .mainframe.trig.trigvalue_pnum -textvar triggerPnum -width 4
431
pack .mainframe.trig.pnum .mainframe.trig.trigvalue_pnum \
432
     .mainframe.trig.wren .mainframe.trig.rden \
433
     .mainframe.trig.trigaddr .mainframe.trig.trigvalue_addr \
434
     .mainframe.trig.trigdata .mainframe.trig.trigvalue_data \
435
     .mainframe.trig.starttrig \
436 6 ash_riple
     -side left -ipadx 0
437 11 ash_riple
initTrigConfig
438 2 ash_riple
 
439
# set the control buttons
440 20 ash_riple
frame .mainframe.fifo -relief groove -borderwidth 5
441
pack .mainframe.fifo
442
button .mainframe.fifo.reset -text {Reset FIFO} -command {reset_fifo_ptr}
443
button .mainframe.fifo.loop -text {Query Used Word} -command {query_fifo_usedw}
444
label .mainframe.fifo.usedw  -textvariable fifoUsedw -relief sunken -width 4
445
button .mainframe.fifo.read     -text {Read FIFO} -command {read_fifo_content}
446
button .mainframe.fifo.clear -text {Clear Log} -command {clear_log}
447
button .mainframe.fifo.quit -text {Quit} -command {quit}
448
pack .mainframe.fifo.reset .mainframe.fifo.loop .mainframe.fifo.usedw .mainframe.fifo.read .mainframe.fifo.clear .mainframe.fifo.quit \
449 6 ash_riple
     -side left -ipadx 0
450 2 ash_riple
 
451
# set the log window
452 20 ash_riple
frame .mainframe.log -relief groove -borderwidth 5
453
set log [text .mainframe.log.text -width 80 -height 25 \
454 2 ash_riple
        -borderwidth 2 -relief sunken -setgrid true \
455 20 ash_riple
        -yscrollcommand {.mainframe.log.scroll set}]
456
scrollbar .mainframe.log.scroll -command {.mainframe.log.text yview}
457
pack .mainframe.log.scroll -side right -fill y
458
pack .mainframe.log.text -side left -fill both -expand true
459
pack .mainframe.log -side top -fill both -expand true
460 2 ash_riple
 
461
# make the program wait for exit signal
462
vwait exit_console
463
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.